Skip to content

Commit 7520d4e

Browse files
committed
nova verzija
- ažurirani paketi framework ažuriran na net10 - standardizovano formatiranje datuma - broj bankovnog računa prebačen u request kako bi se mogao dinamički mijenjati - ažurirani deprecated djelovi koda - dodat poreski datum u sklopu zahtjeva kako bi se pravilno obračunavao poreski datum i godina u broju računa - rok plaćanje promijenjen iz DateTime u DateOnly
1 parent 9c2740f commit 7520d4e

6 files changed

Lines changed: 54 additions & 66 deletions

File tree

Extensions/XmlDocumentExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Security.Cryptography.Xml;
33
using System.Xml;
44
using System.Xml.Linq;
5+
#pragma warning disable CS8670 // Object or collection initializer implicitly dereferences possibly null member.
56

67
namespace OpenMicroFiscal.Extensions;
78

InvoiceService.cs

Lines changed: 43 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Security.Cryptography;
1+
using System.Globalization;
2+
using System.Security.Cryptography;
23
using System.Security.Cryptography.X509Certificates;
34
using System.Text;
45
using System.Xml;
@@ -7,22 +8,11 @@
78

89
namespace OpenMicroFiscal;
910

10-
public sealed class InvoiceService
11+
public sealed class InvoiceService(
12+
HttpClient httpClient,
13+
FiscalizationSettings settings,
14+
ProvideCertificate provideCertificate)
1115
{
12-
private readonly HttpClient _httpClient;
13-
private readonly ProvideCertificate _provideCertificate;
14-
private readonly FiscalizationSettings _settings;
15-
16-
public InvoiceService(
17-
HttpClient httpClient,
18-
FiscalizationSettings settings,
19-
ProvideCertificate provideCertificate)
20-
{
21-
_httpClient = httpClient;
22-
_settings = settings;
23-
_provideCertificate = provideCertificate;
24-
}
25-
2616
public async Task<CreateInvoiceResult> CreateInvoiceAsync(
2717
CreateInvoiceRequest createInvoiceRequest,
2818
CancellationToken cancellationToken = default)
@@ -58,7 +48,7 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
5848

5949
var currentDateTime = DateTime.UtcNow.WithoutMilliseconds();
6050

61-
using var certificate = _provideCertificate();
51+
using var certificate = provideCertificate();
6252

6353
var (iicSignatureText, iicHashText) = ComputeIic(
6454
createInvoiceRequest.OrderNumber, currentDateTime, totalPrice, certificate);
@@ -81,42 +71,42 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
8171
TypeOfInvoice = TypeOfInvoice.NonCash,
8272
IssuedAt = currentDateTime,
8373
Number = string.Join("/",
84-
_settings.IssuerBusinessUnitCode,
74+
settings.IssuerBusinessUnitCode,
8575
createInvoiceRequest.OrderNumber,
86-
currentDateTime.Year,
87-
_settings.IssuerEnuCode),
76+
createInvoiceRequest.TaxDate.Year,
77+
settings.IssuerEnuCode),
8878
OrderNumber = createInvoiceRequest.OrderNumber,
89-
EnuCode = _settings.IssuerEnuCode,
79+
EnuCode = settings.IssuerEnuCode,
9080
IsIssuerInVat = true,
9181
TotalPriceWithoutVat = totalPriceWithoutVat,
9282
TotalVatAmount = totalVatAmount,
9383
TotalPrice = totalPrice,
94-
OperatorCode = _settings.IssuerOperatorCode,
95-
BusinessUnitCode = _settings.IssuerBusinessUnitCode,
96-
SoftwareCode = _settings.IssuerSoftwareCode,
84+
OperatorCode = settings.IssuerOperatorCode,
85+
BusinessUnitCode = settings.IssuerBusinessUnitCode,
86+
SoftwareCode = settings.IssuerSoftwareCode,
9787
IssuerInvoiceCodeHash = iicHashText,
9888
IssuerInvoiceCodeSignature = iicSignatureText,
99-
TaxPeriod = $"{currentDateTime.Month:00}/{currentDateTime.Year}",
89+
TaxPeriod = $"{createInvoiceRequest.TaxDate.Month:00}/{createInvoiceRequest.TaxDate.Year}",
10090
Note = createInvoiceRequest.Note,
101-
BankNumber = _settings.IssuerBankNumber,
102-
PayDeadline = createInvoiceRequest.PaymentDeadline.ToString("yyyy-MM-dd"),
91+
BankNumber = createInvoiceRequest.BankNumber,
92+
PayDeadline = createInvoiceRequest.PaymentDeadline.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
10393
TotalPriceToPay = Math.Max(totalPrice, 0),
104-
PaymentMethods = new List<PaymentMethod>
105-
{
106-
new()
94+
PaymentMethods =
95+
[
96+
new PaymentMethod
10797
{
10898
Type = createInvoiceRequest.PaymentMethod,
10999
Amount = totalPrice
110100
}
111-
},
101+
],
112102
Seller = new Seller
113103
{
114-
IdType = _settings.IssuerIdType,
115-
IdNumber = _settings.IssuerIdNumber,
116-
Name = _settings.IssuerName,
117-
Address = _settings.IssuerAddress,
118-
City = _settings.IssuerCity,
119-
Country = _settings.IssuerCountry
104+
IdType = settings.IssuerIdType,
105+
IdNumber = settings.IssuerIdNumber,
106+
Name = settings.IssuerName,
107+
Address = settings.IssuerAddress,
108+
City = settings.IssuerCity,
109+
Country = settings.IssuerCountry
120110
},
121111
Buyer = createInvoiceRequest.Buyer,
122112
Items = invoiceItems,
@@ -149,11 +139,11 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
149139
var envelopedRequestXmlText = requestXmlDocument.ToEnvelopedXmlText();
150140

151141
using var httpRequest = new StringContent(envelopedRequestXmlText, Encoding.UTF8, "text/xml");
152-
using var httpResult = await _httpClient
142+
using var httpResult = await httpClient
153143
.PostAsync("fs-v1", httpRequest, cancellationToken)
154144
.ConfigureAwait(false);
155145

156-
var responseXmlText = await httpResult.Content.ReadAsStringAsync().ConfigureAwait(false);
146+
var responseXmlText = await httpResult.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
157147
var responseXmlDocument = new XmlDocument();
158148
responseXmlDocument.LoadXml(responseXmlText);
159149

@@ -173,13 +163,13 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
173163

174164
var urlQueryParams = new Dictionary<string, object>
175165
{
176-
["tin"] = _settings.IssuerIdNumber,
166+
["tin"] = settings.IssuerIdNumber,
177167
["iic"] = iicHashText,
178-
["crtd"] = currentDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"),
168+
["crtd"] = currentDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture),
179169
["ord"] = createInvoiceRequest.OrderNumber,
180-
["bu"] = _settings.IssuerBusinessUnitCode,
181-
["cr"] = _settings.IssuerEnuCode,
182-
["sw"] = _settings.IssuerSoftwareCode,
170+
["bu"] = settings.IssuerBusinessUnitCode,
171+
["cr"] = settings.IssuerEnuCode,
172+
["sw"] = settings.IssuerSoftwareCode,
183173
["prc"] = totalPrice.ToFormattedString(2)
184174
};
185175

@@ -191,7 +181,7 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
191181
EnvelopedRequestXmlText = envelopedRequestXmlText,
192182
Fic = responseBodyElement["RegisterInvoiceResponse"]!["FIC"]!.InnerText,
193183
VerificationUrl =
194-
$"{UriProvider.GetInvoiceVerificationUri(_settings.Environment)}ic/#/verify?{queryString}",
184+
$"{UriProvider.GetInvoiceVerificationUri(settings.Environment)}ic/#/verify?{queryString}",
195185
InvoiceNumber = request.Invoice.Number,
196186
Iic = iicHashText,
197187
TotalPrice = totalPrice,
@@ -206,22 +196,20 @@ public async Task<CreateInvoiceResult> CreateInvoiceAsync(
206196
X509Certificate2 certificate)
207197
{
208198
var iicPlainText = string.Join("|",
209-
_settings.IssuerIdNumber,
210-
currentDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"),
199+
settings.IssuerIdNumber,
200+
currentDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture),
211201
orderNumber,
212-
_settings.IssuerBusinessUnitCode,
213-
_settings.IssuerEnuCode,
214-
_settings.IssuerSoftwareCode,
202+
settings.IssuerBusinessUnitCode,
203+
settings.IssuerEnuCode,
204+
settings.IssuerSoftwareCode,
215205
totalPrice.ToFormattedString(2));
216206

217207
var iicSignatureBytes = certificate
218208
.GetRSAPrivateKey()!
219209
.SignData(Encoding.UTF8.GetBytes(iicPlainText), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
220-
var iicSignatureText = BitConverter.ToString(iicSignatureBytes).Replace("-", string.Empty);
221-
222-
using var md5 = MD5.Create();
223-
var iicHashBytes = md5.ComputeHash(iicSignatureBytes);
224-
var iicHashText = BitConverter.ToString(iicHashBytes).Replace("-", string.Empty);
210+
var iicSignatureText = Convert.ToHexString(iicSignatureBytes);
211+
var iicHashBytes = MD5.HashData(iicSignatureBytes);
212+
var iicHashText = Convert.ToHexString(iicHashBytes);
225213

226214
return (iicSignatureText, iicHashText);
227215
}

Models/CreateInvoiceRequest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ public sealed class CreateInvoiceRequest
55
public InvoiceType Type { get; set; }
66
public int OrderNumber { get; set; }
77
public PaymentMethodType PaymentMethod { get; set; }
8-
public DateTime PaymentDeadline { get; set; }
8+
public string? BankNumber { get; set; }
9+
public DateOnly PaymentDeadline { get; set; }
910
public Buyer Buyer { get; set; }
1011
public IEnumerable<InvoiceItem> Items { get; set; }
1112
public string? Note { get; set; }
1213
public OriginalInvoice? Original { get; set; }
14+
public DateOnly TaxDate { get; set; }
1315

1416
public sealed class OriginalInvoice
1517
{

Models/FiscalizationSettings.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ public sealed class FiscalizationSettings
99
public string IssuerAddress { get; set; }
1010
public string IssuerCity { get; set; }
1111
public string IssuerCountry { get; set; }
12-
public string? IssuerBankNumber { get; set; }
1312
public string IssuerBusinessUnitCode { get; set; }
1413
public string IssuerSoftwareCode { get; set; }
1514
public string IssuerOperatorCode { get; set; }

OpenMicroFiscal.csproj

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
5-
<LangVersion>10</LangVersion>
4+
<TargetFramework>net10.0</TargetFramework>
65
<ImplicitUsings>enable</ImplicitUsings>
76
<Nullable>enable</Nullable>
87
<NoWarn>CS8618</NoWarn>
@@ -24,7 +23,7 @@
2423
<RepositoryUrl>https://github.com/dalrankov/OpenMicroFiscal</RepositoryUrl>
2524
<PackageProjectUrl>https://github.com/dalrankov/OpenMicroFiscal</PackageProjectUrl>
2625

27-
<PackageReleaseNotes>Treća verzija u kojoj je moguće fiskalizovati standardne i korektivne račune. Ispravljena licenca, dodata ikonica paketa.</PackageReleaseNotes>
26+
<PackageReleaseNotes>Četvrta verzija u kojoj su ažurirani paketi, framework ažuriran na net10, standardizovano formatiranje datuma, broj bankovnog računa prebačen u request kako bi se mogao dinamički mijenjati, ažurirani deprecated djelovi koda, dodat poreski datum u sklopu zahtjeva kako bi se pravilno obračunavao poreski datum i godina u broju računa, rok plaćanje promijenjen iz DateTime u DateOnly.</PackageReleaseNotes>
2827
</PropertyGroup>
2928

3029
<ItemGroup>
@@ -35,9 +34,9 @@
3534
</ItemGroup>
3635

3736
<ItemGroup>
38-
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.2"/>
39-
<PackageReference Include="System.Security.Cryptography.Xml" Version="7.0.1"/>
40-
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0"/>
37+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.1" />
38+
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
39+
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.1" />
4140
</ItemGroup>
4241

4342
</Project>

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ FiscalizationSettings__IssuerName="TEST DOO"
3232
FiscalizationSettings__IssuerCountry=MNE
3333
FiscalizationSettings__IssuerCity=PODGORICA
3434
FiscalizationSettings__IssuerAddress="ULICA BB"
35-
FiscalizationSettings__IssuerBankNumber=123-456-789
3635
FiscalizationSettings__IssuerSoftwareCode=ss123ss123
3736
FiscalizationSettings__IssuerEnuCode=si747we972
3837
FiscalizationSettings__IssuerBusinessUnitCode=xx123xx123
@@ -67,7 +66,6 @@ services.AddFiscalization(
6766
IssuerCountry = "MNE",
6867
IssuerCity = "PODGORICA",
6968
IssuerAddress = "ULICA BB",
70-
IssuerBankNumber = "123-456-789",
7169
IssuerSoftwareCode = "ss123ss123",
7270
IssuerEnuCode = "si747we972",
7371
IssuerBusinessUnitCode = "xx123xx123",
@@ -100,7 +98,6 @@ var invoiceService = new InvoiceService(
10098
IssuerCountry = "MNE",
10199
IssuerCity = "PODGORICA",
102100
IssuerAddress = "ULICA BB",
103-
IssuerBankNumber = "123-456-789",
104101
IssuerSoftwareCode = "ss123ss123",
105102
IssuerEnuCode = "si747we972",
106103
IssuerBusinessUnitCode = "xx123xx123",
@@ -119,6 +116,7 @@ var request = new CreateInvoiceRequest
119116
Type = InvoiceType.Invoice,
120117
OrderNumber = 15,
121118
PaymentMethod = PaymentMethodType.BankTransfer,
119+
BankNumber = "123-456-789",
122120
PaymentDeadline = new DateTime(2022, 02, 25),
123121
Buyer = new Buyer
124122
{
@@ -164,6 +162,7 @@ var request = new CreateInvoiceRequest
164162
Type = InvoiceType.Corrective,
165163
OrderNumber = 16,
166164
PaymentMethod = PaymentMethodType.BankTransfer,
165+
BankNumber = "123-456-789",
167166
PaymentDeadline = new DateTime(2022, 02, 25),
168167
Buyer = new Buyer
169168
{

0 commit comments

Comments
 (0)