org number validation - work date component -

This commit is contained in:
Frede Hundewadt 2023-01-19 16:25:55 +01:00
parent ea5c6d4c8c
commit 4591cf156a
5 changed files with 66 additions and 47 deletions

View file

@ -18,6 +18,10 @@
<td><i class="bi-file-earmark" style="font-size:1.3rem"></i></td>
<td>Ubehandlet</td>
</tr>
<tr>
<td><i class="bi-hand-thumbs-up" style="font-size:1.3rem"></i></td>
<td>Accepteret</td>
</tr>
<tr>
<td><i class="bi-file-earmark-check" style="font-size:1.3rem"></i></td>
<td>Plukket</td>
@ -28,7 +32,7 @@
</tr>
<tr>
<td><i class="bi-truck" style="font-size:1.3rem"></i></td>
<td>Afhentet</td>
<td>Leveret</td>
</tr>
</thead>
</table>

View file

@ -22,7 +22,7 @@
<div class="container-fluid">
<div class="row align-items-center">
<div class="col-sm-7 fw-bold">
@SelectedDate.DayOfWeek d. @(SelectedDate.Day)/@(SelectedDate.Month)
d. @(SelectedDate.Day)/@(SelectedDate.Month)
</div>
<div class="col-sm-5">
<InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/>

View file

@ -46,6 +46,19 @@ public class VatUtils
};
}
/// <summary>
/// Sanitize Vat remove everything but digits
/// </summary>
/// <param name="vatNumber"></param>
/// <returns></returns>
private static string SanitizeVatNumber(string vatNumber)
{
if (string.IsNullOrWhiteSpace(vatNumber))
return "";
var regexObj = new Regex(@"[^\d]");
return regexObj.Replace(vatNumber, "");
}
/// <summary>
/// Validate string is only numbers
/// </summary>
@ -100,14 +113,6 @@ public class VatUtils
/// <returns></returns>
private static bool ValidateFormatSe(string vatNumber)
{
// https://wiki.scn.sap.com/wiki/display/CRM/Sweden
// 12 digits 0 to 9
// C10 = (10 (18 + 5 + 1 + 8 + 4)MOD10 10) MOD10
// R = S1 + S3 + S5 + S7 + S9
// Si = int(Ci/5) + (Ci*2)MOD10)
// https://www.skatteverket.se/skatter/mervardesskattmoms/momsregistreringsnummer.4.18e1b10334ebe8bc80002649.html
// C11 C12 == 01 (De två sista siffrorna är alltid 01)
var vatToCheck = vatNumber;
if (long.Parse(vatToCheck) == 0)
return false;
@ -119,21 +124,40 @@ public class VatUtils
return ValidateFormatSeExt(vatToCheck);
case < 10:
return false;
case > 10:
vatNumber = vatNumber[..10];
break;
}
// check digit calculation
var r = new[] { 0, 2, 4, 6, 8 }
.Sum(m => (int)char.GetNumericValue(vatToCheck[m]) / 5 +
(int)char.GetNumericValue(vatToCheck[m]) * 2 % 10);
var c1 = new[] { 1, 3, 5, 7 }.Sum(m => (int)char.GetNumericValue(vatToCheck[m]));
var c10 = (10 - (r + c1) % 10) % 10;
// end check digit calculation
// return validation check - depending on with or with or without EU extension `01`
return vatToCheck.Length == 10
? $"{vatToCheck[..9]}{c10}" == vatNumber
: $"{vatToCheck[..9]}{c10}01" == vatNumber;
// calculate check digit
var c10 = C10(vatToCheck);
// return comparison
return $"{vatToCheck[..9]}{c10}" == vatNumber;
}
/// <summary>
/// Calculate check digit for swedish org number
/// </summary>
/// <param name="orgNumber"></param>
/// <returns></returns>
private static int C10(string orgNumber)
{
// https://wiki.scn.sap.com/wiki/display/CRM/Sweden
// 12 digits 0 to 9
// C10 = (10 (18 + 5 + 1 + 8 + 4)MOD10 10) MOD10
// R = S1 + S3 + S5 + S7 + S9
// Si = int(Ci/5) + (Ci*2)MOD10)
// https://www.skatteverket.se/skatter/mervardesskattmoms/momsregistreringsnummer.4.18e1b10334ebe8bc80002649.html
// C11 C12 == 01 (De två sista siffrorna är alltid 01)
var r = new[] { 0, 2, 4, 6, 8 }
.Sum(m => (int)char.GetNumericValue(orgNumber[m]) / 5 +
(int)char.GetNumericValue(orgNumber[m]) * 2 % 10);
var c1 = new[] { 1, 3, 5, 7 }.Sum(m => (int)char.GetNumericValue(orgNumber[m]));
var c10 = (10 - (r + c1) % 10) % 10;
return c10;
// end check digit calculation
}
/// <summary>
///
/// </summary>
@ -193,17 +217,4 @@ public class VatUtils
return sum % 11 == 0;
}
/// <summary>
/// Sanitize Vat number to it's raw numbers
/// </summary>
/// <param name="vatNumber"></param>
/// <returns></returns>
private static string SanitizeVatNumber(string vatNumber)
{
if (string.IsNullOrWhiteSpace(vatNumber))
return "";
var regexObj = new Regex(@"[^\d]");
return regexObj.Replace(vatNumber, "");
}
}

View file

@ -126,6 +126,7 @@ public partial class AdvisorReportCreatePage : IDisposable
if (Report.DayTypeEnum.ToLower().Contains("leave"))
{
// ensure no distances in calculation
Report.Figures.KmMorning = 0;
Report.Figures.KmEvening = 0;
}
@ -188,6 +189,7 @@ public partial class AdvisorReportCreatePage : IDisposable
await ProfileService.SetDateConfirmed(false);
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
}
/// <summary>
/// Submit report
/// </summary>
@ -227,20 +229,22 @@ public partial class AdvisorReportCreatePage : IDisposable
// format report date time input
Report.FromDateTime = checkIn.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture);
Report.ToDateTime = checkOut.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture);
// assign final distance numbers
if (Report.DayTypeEnum.ToLower().Contains("leave"))
{
// ensure no distances in calculation
Report.Figures.KmEvening = 0;
Report.Figures.KmMorning = 0;
}
// calculate distance
Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning;
// add distance to distance month
Report.Figures.DistanceMonth += Report.Figures.Distance;
// add private distance to month
Report.Figures.DistancePrivateMonth += Report.Figures.DistancePrivate;
else
{
// calculate distance
Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning;
// add distance to distance month
Report.Figures.DistanceMonth += Report.Figures.Distance;
// add private distance to month
Report.Figures.DistancePrivateMonth += Report.Figures.DistancePrivate;
}
Logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyy-MM-dd}");
Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report));

View file

@ -1,13 +1,13 @@
{
"appInfo": {
"name": "Wonky Online",
"version": "0.102.7",
"version": "0.103.xxx",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"
},
"apiConfig": {
"baseUrl": "https://edu.innotec.dk",
"baseUrl": "https://dev.innotec.dk",
"catalog": "api/v2/catalog/country",
"crmCustomers": "api/v2/crm/companies",
"crmInventoryExt": "history/inventory",
@ -36,7 +36,7 @@
},
"Logging": {
"LogLevel": {
"Default": "Debug",
"Default": "Information",
"System": "Information",
"Microsoft": "Information"
},