Din diverse proiecte s-a condensat în timp o mică librărie pentru consumarea serviciului web ANAF prin care se poate verifica existența unui contribuabil, precum și dacă este-nregistrat în scopuri de TVA. De fapt, funcționalitatea oferită este cea din urmă, dar implicit poate fi folosit și pentru verificarea existenței unui cod fiscal.
Librăria este scrisă pentru .NET 6.0 și a fost gândită pentru serviciul sincron, versiunea 8, a cărui specificație poate fi găsită aici. Cred că poate fi consumată și versiunea 7, dar nu am încercat. În tot cazul, am acoperit toată structura de date oferită de răspuns; n-am avut personal nevoie de toate datele acolo, dar dacă tot am publicat codul, am zis să fie o treabă făcută nu musai cap-coadă, ci măcar cu un cap și cu o coadă.
Exemple
Cred că tot codul vorbește de la sine, mai ales că există și câteva teste demonstrative, însă iată și un exemplu simplu:
IHttpClientFactory httpClientFactory =
/* create http client factory instance */;
IAnafVatPayerDataLookupClientFactory clientFactory =
new DefaultAnafVatPayerDataLookupClientFactory(httpClientFactory);
IAnafVatPayerDataLookupClient client =
clientFactory.CreateClient();
AnafApiClientVatPayerLookupInput input =
new AnafApiClientVatPayerLookupInput("...VAT CODE...");
AnafApiClientVatPayerLookupResponse response = await client
.LookupVatPayerDataAsync( input );
Dacă se dorește specificarea unei date calendaristice de referință (adică dacă acel cod fiscal exista la data respectivă, precum și obținerea informațiilor contribuabilului la acel moment de timp):
AnafApiClientVatPayerLookupInput inputAtJan12021 =
new AnafApiClientVatPayerLookupInput("...VAT CODE...",
new DateTime(2021, 1, 1));
În sfârșit, pentru a specifica mai multe coduri fiscale în același timp:
AnafApiClientVatPayerLookupInput input1 =
new AnafApiClientVatPayerLookupInput("...VAT CODE1...");
AnafApiClientVatPayerLookupInput input2 =
new AnafApiClientVatPayerLookupInput("...VAT CODE2...");
AnafApiClientVatPayerLookupResponse response = await client
.LookupVatPayerDataAsync( new List()
{
input1, input2
} );
Observații
– cum câmpurile din răspunsul furnizat de serviciul web a) nu corespund convențiilor C# de denumire a proprietăților, b) nu corespund niciunei alte convenții care să permită stabilirea automată a unei corespondențe între denumiri și c) am vrut să mențin totuși convențiile C#, fiecare câmp din serviciul web este adnotat cu [JsonProperty];
– Totul este injectabil (nu mă refer la vaccin, mă rog, nu vă entuziasmați prematur, ci la dependency injection) și se poate interveni pentru înlocuirea oricăreia din următoarele componente majore: transport, serializare și clientul propriu-zis care asamblează toată funcționalitatea;
– Serviciul web acceptă și prezintă date calendaristice-n formatul yyyy-MM-dd, dar îl puteți configura să fie altceva, folosind obiectul pentru opțiuni (mă rog, asta e din categoria, puțin-probabil-dar-în-caz-că);
– Singura componentă care nu este livrată este o implementare a IHttpClientFactory; se presupune că este de datoria aplicației-gazdă să o furnizeze, însă puteți face-apel la implementarea pe care-o folosește și suita de teste.
– Opțiunile sunt de asemenea injectabile (AnafApiClientOptions), folosind interfața IOptions<> (options pattern, cum îi zice);
– Când verificați un cod fiscal, nu puneți și prefixul (spre exemplu, RO-ul), deoarece serviciului web îi vor sări roatele chiar dacă acel cod este în sine valid și există.
Cam atât. Codul este pe Github, sub licență MIT, liber la consumat, numai să nu conduceți după. Nu am vreun plan de a dezvolta librăria în mod regulat, poate doar o modificare din când în când, fie dacă am nevoie personal de ceva, fie dacă găsesc vreun dragon care să-i tulbure buna funcționare.