IS
ISFiscalService
Documentaţie pentru integratori
RORUEN
Ghid
Prezentare Conexiune şi formate Fluxul tipic
Metode
POSTRegisterFiscalReceipt POSTRegisterServiceReceipt POSTRegisterReport POSTPrintNonFiscalText POSTPrintCopy GETPrintLastCopy GETGetServiceState GETGetReports GETGetTransactions GETGetFiscalReceipt GETGetPaymentReceipt GETGetServiceReceipt GETGetReport GETGetTransactionTemplate
Referinţe
Tipuri de plată Coduri de eroare

ISFiscalService API

Serviciul Windows care tipăreşte bonurile fiscale şi rapoartele emise de aplicaţia comercială, le înregistrează în jurnalul electronic şi le transmite în ISFiscalCloud şi MEV.

Adresa de bazăhttp://localhost:9203/fpservice
FormateJSON · XML
Metode14
Versiunea serviciului1.26.2.256

Prezentare

  1. Aplicaţia comercială a unui terţ, integrată cu ISFiscalCloud, rulează în punctul de vânzare şi transmite vânzările către serviciul web ISFiscalService. Fiecare bon şi raport primeşte la salvare un număr de ordine unic şi un cod QR, apoi se tipăreşte pe imprimanta fiscală sau POS.
  2. Bonurile fiscale, bonurile de serviciu şi rapoartele se transmit concomitent în ISFiscalCloud şi în MEV — nu întâi într-unul şi apoi în celălalt.
  3. Orice cumpărător care a primit un bon cu cod QR îi poate verifica autenticitatea pe freceipt.eservicii.md sau mev.sfs.md, iar comerciantul îşi vede bonurile în cabinetul de pe mev.md.

Conexiune şi formate

Serviciul ascultă local, pe calculatorul casei, la portul 9203 (se poate schimba prin cheia Port din appSettings a fişierului de configurare al serviciului). Fiecare metodă e disponibilă prin trei puncte de acces — segmentul din adresă alege formatul atât pentru cerere, cât şi pentru răspuns:

FormatAdresăContent-Type
JSONhttp://localhost:9203/fpservice/json/{Metodă}application/json
XMLhttp://localhost:9203/fpservice/xml/{Metodă}application/xml
SOAPhttp://localhost:9203/fpservice/soap · WSDL: http://localhost:9203/fpservice?wsdltext/xml

Diferenţe între formate

  • ErrorCode vine în JSON ca număr (0), iar în XML ca nume (OK).
  • Datele calendaristice vin în JSON în formatul WCF /Date(ms+zona)/ — milisecunde de la 1970-01-01 UTC plus fusul orar —, iar în XML ca ISO 8601.
  • Cererile XML poartă spaţiul de nume http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service, iar elementele se scriu în ordine alfabetică, ca în exemple.

Coada de sarcini

Metodele de înregistrare nu tipăresc sincron: pun o sarcină în coada serviciului şi întorc imediat identificatorii ei. TaskId e numărul din coadă, ShiftId — tura (raportul zilnic), ShiftOrderId — numărul în cadrul turei, TaskUid — GUID-ul, al vostru sau atribuit automat.

Câmpurile comune ale tranzacţiilor

Metodele care citesc tranzacţii înapoi (Get…) întorc, pe lângă câmpurile proprii, aceste câmpuri:

CâmpTipDescriere
DatedatetimeMomentul executării (tipăririi) tranzacţiei
MEVDatedatetime?Data înregistrării în MEV; null dacă încă nu a ajuns acolo
MEVIDstringIdentificatorul atribuit de MEV
MEVResponsestringRăspunsul MEV la înregistrare
TaskIdintNumărul tranzacţiei în coada serviciului
ShiftIdintTura (raportul zilnic)
ShiftOrderIdintNumărul tranzacţiei în cadrul turei

CloudSyncWarning = true nu e o eroare: sarcina s-a înregistrat, dar în coadă există tranzacţii încă netransmise în MEV. Verificaţi GetServiceState. Dacă situaţia persistă peste limita offline, bonurile noi se emit ca bonuri de plată — vezi regulile.

Fluxul tipic

  1. La pornirea aplicaţiei — GetServiceState. Dacă GeneralError e true, arătaţi operatorului cauza din indicatorii de stare.

  2. La începutul turei, dacă e nevoie de numerar pentru rest — RegisterServiceReceipt cu sumă pozitivă.

  3. La fiecare vânzare — RegisterFiscalReceipt cu propriul Uid. Linkul din QR se afişează cumpărătorului. La timeout sau eroare de reţea, retrimiteţi aceeaşi cerere cu acelaşi Uid: dacă bonul intrase, primiţi eroarea 46 şi TaskId lui, nu un bon dublu.

  4. Dacă bonul nu s-a tipărit (hârtie terminată etc.) — PrintCopy după Uid, nu o nouă înregistrare: un bon repetat ar însemna o a doua vânzare în MEV.

  5. La închiderea zilei — extragerea numerarului (RegisterServiceReceipt cu sumă negativă), apoi raportul Z (RegisterReport, CloseReport = true). La 24 de ore de la deschiderea turei, serviciul respinge bonurile până la Z.

  6. Pentru reconciliere — GetReports şi GetTransactions dau lista, iar metodele Get… dau fiecare tranzacţie aşa cum a înregistrat-o serviciul.

Înregistrarea bonului fiscal

POSThttp://localhost:9203/fpservice/json/RegisterFiscalReceipt

Înregistrează în coada serviciului fiscal sarcina de tipărire a unui bon fiscal. Răspunsul conţine linkul de verificare MEV, care trebuie afişat cumpărătorului ca cod QR sau tipărit la finalul bonului.

Repetarea e sigură. Dacă trimiteţi un Uid deja înregistrat, serviciul nu creează un al doilea bon: întoarce ErrorCode = 46 (ProcessingTaskExists) împreună cu TaskId al bonului existent. Deci, la un timeout, retrimiteţi aceeaşi cerere cu acelaşi Uid.

Parametrii cererii
CâmpTipDescriere
ClientEmailstringE-mailul clientului, pentru trimiterea copiei bonului. Obligatoriu la DisplayType = 3.
ClientPhonestringTelefonul clientului, pentru trimiterea copiei prin SMS. Obligatoriu la DisplayType = 2.
DisplayTypeintModul de prezentare a bonului: 0 — tipărire pe hârtie (implicit); 1 — cod QR pe ecranul cumpărătorului; 2 — SMS; 3 — e-mail
FooterTextstringText liber tipărit la finalul bonului
ForcePrintboolTipărire forţată pe hârtie — are prioritate faţă de toţi ceilalţi parametri şi faţă de setările modulului fiscal
HeaderTextstringText liber tipărit la începutul bonului
LinesBillLine[]Liniile bonului — cel puţin una. Structura
MyDiscountUidguidIdentificatorul clientului în sistemul de fidelizare MyDiscount
NumberstringNumărul bonului în sistemul extern de evidenţă
PaymentsBillPayment[]Plăţile bonului — cel puţin una. Structura
PrinterURIstringURI-ul imprimantei POS conectate la serviciu pentru tipărirea bonului. Gol — se tipăreşte pe imprimanta implicită din Windows.
UidguidGUID-ul bonului în sistemul extern. Gol — îl atribuie serviciul. Recomandat: trimiteţi-l mereu — face repetarea cererii sigură şi permite copia după propriul identificator.

Lines · BillLine

Cel puţin o linie.

CâmpTipDescriere
CodestringCodul produsului în sistemul extern
DiscountdecimalReducere, în lei, pe suma totală a liniei
MargindecimalAdaos, în lei, pe suma totală a liniei
NamestringDenumirea produsului; obligatorie
PricedecimalPreţul unitar; mai mare decât 0
QuantitydecimalCantitatea; mai mare decât 0, până la 3 zecimale
UnitCodeintCodul unităţii de măsură după clasificarea MEV: 1 — litri, 2 — metri cubi, 3 — produs care nu e combustibil, 0 — nespecificat. Contează doar la staţiile PECO — vezi regulile.
UnitNamestringDenumirea unităţii de măsură
VATstringCodul cotei TVA: o literă A–Z dintre cele configurate în serviciu (lista vine în GetServiceState → VATRates), sau _ — fără TVA. Obligatoriu.

Payments · BillPayment

Cel puţin o plată. Sumele trebuie să acopere bonul — vezi regulile.

CâmpTipDescriere
AmountdecimalSuma plăţii; mai mare decât 0
BankResponsestringRăspunsul terminalului bancar, la plata cu cardul
CodestringCodul tipului de plată — vezi tipurile de plată
RRNstringRRN-ul tranzacţiei bancare, la plata cu cardul

Reguli de validare

Serviciul verifică bonul înainte să-l pună în coadă. Unele reguli depind de activitatea casei — câmpul ActivityType din GetServiceState: ACPS — comerţ, ACPPGL — staţie PECO, ACPSPPGL — staţie PECO cu magazin.

  1. Suma bonului. Suma unei linii = round(Quantity × Price, 2) − Discount + Margin; suma bonului e suma liniilor.
  2. Plăţile. Dacă plăţile sunt mai mici decât bonul — eroarea 41. Dacă sunt mai mari, diferenţa e restul, şi restul se dă numai din numerar (cod 1): dacă plata în numerar nu acoperă restul — eroarea 42.
  3. Staţie PECO (ACPPGL). O singură linie şi o singură plată. UnitCode admis: 0, 1, 2; 0 se înregistrează ca litri.
  4. PECO cu magazin (ACPSPPGL). UnitCode admis: 0–3. Liniile cu 1 sau 2 sunt combustibil, cele cu 0 sau 3 — marfă. Un bon care conţine combustibil are o singură plată.
  5. Rotunjirea la combustibil. La un bon cu o singură linie, de combustibil, o diferenţă între plată şi bon de cel mult preţul a 10 ml (Price / 100) e acceptată: suma liniei devine suma plăţii.
  6. Codurile de plată admise depind de activitate — vezi tipurile de plată. Altfel — eroarea 28.
  7. Ceasul. Dacă ora calculatorului e mai mică decât a ultimei tranzacţii înregistrate — eroarea 7.
  8. Tura de 24 de ore. La mai mult de 24 de ore de la deschiderea turei — eroarea 9, până la raportul Z. Dacă în serviciu e configurat raportul Z automat, serviciul îl face singur şi înregistrează bonul.
  9. Fără legătură cu MEV. Dacă tranzacţiile netransmise în MEV au depăşit limita offline (sau limita e 0 şi cloud-ul nu răspunde), bonul nu se respinge: se înregistrează ca bon de plată, cu serie şi număr din intervalul alocat casei (GetTransactions îl arată cu Type = 12, detaliile — GetPaymentReceipt). Dacă intervalul lipseşte sau s-a epuizat — eroarea 13.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
CloudSyncWarningboolÎn coadă există cel puţin o sarcină care încă nu a fost transmisă în MEV
ShiftIdintIdentificatorul turei (raportului zilnic) în care s-a înregistrat sarcina
ShiftOrderIdintNumărul de ordine al sarcinii în cadrul turei
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
TaskUidguidIdentificatorul unic al sarcinii — egal cu Uid din cerere sau atribuit automat dacă acesta lipsea
QRstringLinkul spre portalul MEV pentru validarea bonului. Se afişează ca QR pe ecranul cumpărătorului sau se tipăreşte la finalul bonului.
Exemplu
POST http://localhost:9203/fpservice/json/RegisterFiscalReceipt
Content-Type: application/json

{
  "ClientEmail": "",
  "ClientPhone": "",
  "DisplayType": 0,
  "FooterText": "Thank you!",
  "ForcePrint": true,
  "HeaderText": "Operator 1",
  "Lines": [{
    "Code": "2",
    "Discount": 2.00,
    "Margin": 0.00,
    "Name": "Ext DE5",
    "Price": 31.50,
    "Quantity": 2.150,
    "UnitCode": 1,
    "UnitName": "liters",
    "VAT": "A"
  }],
  "Number": "248",
  "Payments": [{
    "Amount": 100.00,
    "BankResponse": "",
    "Code": "1",
    "RRN": ""
  }],
  "PrinterURI": "",
  "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98"
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 1,
  "TaskId": 46,
  "TaskUid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
  "QR": "https://mev.sfs.md/receipt-verifier/33C303B4706C3467CCD14EAA6662CEDE"
}
Aceeaşi cerere în XML
POST http://localhost:9203/fpservice/xml/RegisterFiscalReceipt
Content-Type: application/xml

<RegisterFiscalReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <ClientEmail></ClientEmail>
  <ClientPhone></ClientPhone>
  <DisplayType>0</DisplayType>
  <FooterText>Thank you!</FooterText>
  <ForcePrint>true</ForcePrint>
  <HeaderText>Operator 1</HeaderText>
  <Lines>
    <BillLine>
      <Code>2</Code>
      <Discount>2.00</Discount>
      <Margin>0.00</Margin>
      <Name>Ext DE5</Name>
      <Price>31.50</Price>
      <Quantity>2.150</Quantity>
      <UnitCode>1</UnitCode>
      <UnitName>liters</UnitName>
      <VAT>A</VAT>
    </BillLine>
  </Lines>
  <Number>248</Number>
  <Payments>
    <BillPayment>
      <Amount>100.00</Amount>
      <BankResponse></BankResponse>
      <Code>1</Code>
      <RRN></RRN>
    </BillPayment>
  </Payments>
  <PrinterURI></PrinterURI>
  <Uid>2a0ce057-213b-4837-b3c7-d77c91e4661c</Uid>
</RegisterFiscalReceiptRequest>
<RegisterFiscalReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>10</ShiftId>
  <ShiftOrderId>8</ShiftOrderId>
  <TaskId>44</TaskId>
  <TaskUid>2a0ce057-213b-4837-b3c7-d77c91e4661c</TaskUid>
  <QR>https://mev.sfs.md/receipt-verifier/5CA4D2CA0450DF80FEB2A62354D75311</QR>
</RegisterFiscalReceiptResponse>

Înregistrarea bonului de serviciu

POSThttp://localhost:9203/fpservice/json/RegisterServiceReceipt

Înregistrează un bon de serviciu pentru introducerea (Amount > 0) sau extragerea (Amount < 0) numerarului din casă. Suma extrasă nu poate depăşi numerarul din sertar pe tura curentă — plăţile în numerar plus introducerile, minus extragerile şi restul dat —, altfel eroarea 40. Suma 0 — eroarea 24.

Parametrii cererii
CâmpTipDescriere
AmountdecimalSuma introdusă; valoare negativă — suma extrasă
ReasonintMotivul extragerii: 0 — restituire, 1 — încasare. Câmpul e acceptat, dar versiunea curentă a serviciului nu îl prelucrează.
ForcePrintboolTipărire forţată pe hârtie (are prioritate faţă de setările modulului fiscal)
PrinterURIstringURI-ul imprimantei POS conectate la serviciu pentru tipărirea bonului de serviciu. Gol — se tipăreşte pe imprimanta implicită din Windows.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
CloudSyncWarningboolÎn coadă există cel puţin o sarcină care încă nu a fost transmisă în MEV
ShiftIdintIdentificatorul turei (raportului zilnic) în care s-a înregistrat sarcina
ShiftOrderIdintNumărul de ordine al sarcinii în cadrul turei
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
TaskUidguidIdentificatorul unic al sarcinii (atribuit automat)
Exemplu
POST http://localhost:9203/fpservice/json/RegisterServiceReceipt
Content-Type: application/json

{
  "Amount": 10.22,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 3,
  "TaskId": 49,
  "TaskUid": "22ebb07d-57d6-4b5b-96bd-ee6bfd9bebb6"
}
Aceeaşi cerere în XML
POST http://localhost:9203/fpservice/xml/RegisterServiceReceipt
Content-Type: application/xml

<RegisterServiceReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <Amount>10.22</Amount>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterServiceReceiptRequest>
<RegisterServiceReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>4</ShiftOrderId>
  <TaskId>50</TaskId>
  <TaskUid>def450fe-f9d5-4aa6-a0de-e11c94774b54</TaskUid>
</RegisterServiceReceiptResponse>

Înregistrarea raportului zilnic

POSThttp://localhost:9203/fpservice/json/RegisterReport

Înregistrează sarcina de generare şi tipărire a raportului zilnic: cu închiderea turei (raport Z) sau fără (raport X). Raportul Z închide tura curentă; dacă nu era deschisă nicio tură, se deschide şi se închide una goală. Cât timp un Z anterior încă se procesează — eroarea 10. Pe casele cu memorie fiscală, o eroare a memoriei blochează raportul Z, dar nu şi raportul X — acesta rămâne disponibil pentru verificarea casei.

Parametrii cererii
CâmpTipDescriere
CloseReportbooltrue — raport cu închidere (Z), false — fără închidere (X)
ForcePrintboolTipărire forţată pe hârtie. Raportul Z poate fi tipărit şi fără ea, dacă serviciul e configurat să tipărească mereu Z.
PrinterURIstringURI-ul imprimantei POS conectate la serviciu pentru tipărirea raportului. Gol — se tipăreşte pe imprimanta implicită din Windows.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
CloudSyncWarningboolÎn coadă există cel puţin o sarcină care încă nu a fost transmisă în MEV
ShiftIdintIdentificatorul turei (raportului zilnic) în care s-a înregistrat sarcina
ShiftOrderIdintNumărul de ordine al sarcinii în cadrul turei
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
TaskUidguidIdentificatorul unic al sarcinii (atribuit automat)
Exemplu
POST http://localhost:9203/fpservice/json/RegisterReport
Content-Type: application/json

{
  "CloseReport": false,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 6,
  "TaskId": 52,
  "TaskUid": "9cc9ac78-270d-429a-9867-c386e3e29409"
}
Aceeaşi cerere în XML
POST http://localhost:9203/fpservice/xml/RegisterReport
Content-Type: application/xml

<RegisterReportRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <CloseReport>false</CloseReport>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterReportRequest>
<RegisterReportResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>7</ShiftOrderId>
  <TaskId>53</TaskId>
  <TaskUid>ec76c1ba-0dc4-4685-bd8a-994d35fad2e5</TaskUid>
</RegisterReportResponse>

Tipărirea textului nefiscal

POSThttp://localhost:9203/fpservice/json/PrintNonFiscalText

Înregistrează sarcina de tipărire a unui text liber pentru cumpărător — fără valoare fiscală.

Parametrii cererii
CâmpTipDescriere
Linesstring[]Rândurile de tipărit; cel puţin unul, altfel eroarea 20
PrinterURIstringURI-ul imprimantei POS conectate la serviciu pentru tipărirea textului. Gol — se tipăreşte pe imprimanta implicită din Windows.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
CloudSyncWarningboolÎn coadă există cel puţin o sarcină care încă nu a fost transmisă în MEV
ShiftIdintIdentificatorul turei (raportului zilnic) în care s-a înregistrat sarcina
ShiftOrderIdintNumărul de ordine al sarcinii în cadrul turei
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
Exemplu
POST http://localhost:9203/fpservice/json/PrintNonFiscalText
Content-Type: application/json

{
  "Lines": ["Acesta este un exemplu", "de bon nefiscal."],
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 5,
  "TaskId": 63
}

Tipărirea copiei unui bon sau raport

POSThttp://localhost:9203/fpservice/json/PrintCopy

Înregistrează sarcina de retipărire a unui bon fiscal, bon de serviciu sau raport X/Z înregistrat anterior prin acest serviciu. Textul nefiscal şi copiile nu se copiază. Copia se tipăreşte mereu pe hârtie, cu filigranul COPIE, şi primeşte propriul TaskId. Dacă tranzacţia nu e găsită — eroarea 43.

Parametrii cererii
CâmpTipDescriere
TaskIdintNumărul sarcinii din coadă care trebuie retipărită
TaskUidguidGUID-ul tranzacţiei — Uid trimis la înregistrare sau TaskUid primit în răspuns. E suficient unul dintre TaskId şi TaskUid; dacă vin amândouă, contează TaskUid.
PrinterURIstringURI-ul imprimantei POS conectate la serviciu pentru tipărirea copiei. Gol — se tipăreşte pe imprimanta implicită din Windows.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
Exemplu
POST http://localhost:9203/fpservice/json/PrintCopy
Content-Type: application/json

{
  "TaskId": 61,
  "TaskUid": "00000000-0000-0000-0000-000000000000",
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "TaskId": 67
}

Tipărirea copiei ultimei tranzacţii

GEThttp://localhost:9203/fpservice/json/PrintLastCopy

Înregistrează sarcina de retipărire a ultimei tranzacţii executate (bon fiscal, bon de serviciu, raport X/Z), cu filigranul COPIE. Metoda nu are parametri. Dacă nu există nicio astfel de tranzacţie — eroarea 43.

Parametrii cererii

Nu are.

Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
TaskIdintNumărul de ordine al sarcinii în coada serviciului fiscal
Exemplu
GET http://localhost:9203/fpservice/json/PrintLastCopy
<PrintCopyTaskResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <TaskId>68</TaskId>
</PrintCopyTaskResponse>

Starea serviciului

GEThttp://localhost:9203/fpservice/json/GetServiceState

Întoarce starea curentă a serviciului fiscal: numerele de înregistrare, ultimele tranzacţii şi indicatorii de eroare. Apelaţi-o la pornirea aplicaţiei şi înaintea unei vânzări, dacă CloudSyncWarning a apărut în răspunsurile anterioare.

Parametrii cererii

Nu are.

Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
GeneralErrorboolIndicator general. true — înregistrarea tranzacţiilor e imposibilă acum; cauza o dau indicatorii de mai jos.
ActivityTypestringActivitatea casei: ACPS — comerţ, ACPPGL — staţie PECO, ACPSPPGL — PECO cu magazin. Determină codurile de plată şi unităţile admise.
ServiceSerialNumberstringNumărul de înregistrare al serviciului în MEV
ServiceDateTimedatetimeData/ora curentă a serviciului (ceasul calculatorului)
FiscalMemorySerialNumberstringNumărul memoriei fiscale; gol dacă casa lucrează fără memorie fiscală
FiscalMemoryErrorboolMemoria fiscală răspunde cu eroare. Ridică GeneralError.
FiscalMemoryFiscalizedboolMemoria fiscală e fiscalizată
ServiceRegistrationInvalidboolÎnregistrarea în MEV e anulată sau dispozitivul e necunoscut cloud-ului
ServiceSignatureInvalidboolCloud-ul a respins tranzacţii din cauza semnăturii digitale. Tranzacţiile sunt blocate.
ServiceMEVSyncErrorboolCea mai veche tranzacţie netransmisă în MEV a depăşit limita offline
ServiceDatabaseCorruptedboolIntegritatea bazei de date a serviciului e compromisă. Tranzacţiile sunt blocate.
OfflineModeEnabledboolExistă tranzacţii netransmise în MEV de peste un minut, dar limita offline nu e încă depăşită
OfflineHoursLimitintCâte ore poate lucra casa cu tranzacţii netransmise. 0 — offline interzis. Pe casele cu memorie fiscală, dacă nu e setat, se aplică 72.
FirstNotSyncedTransactionDatedatetime?Data celei mai vechi tranzacţii netransmise în MEV — de la ea se numără timpul offline
FirstNotSyncedTransactionNumberint?TaskId al acelei tranzacţii
CurrentReportNumberint?Numărul turei deschise (ShiftId); null dacă nu e deschisă nicio tură
CurrentReportDatedatetime?Data deschiderii turei curente
CurrentReport24HoursExpiredboolAu trecut peste 24 de ore de la deschiderea turei. Până la raportul Z bonurile sunt respinse cu eroarea 9.
VATRatesVATRate[]Cotele TVA configurate: Code (litera folosită în Lines[].VAT) şi Percent
…LastTransactionDate, LastTransactionMEVID, LastTransactionNumber, LastSyncedTransactionDate, ServiceDatetimeInvalid, FiscalMemoryReportNotWritten, PrinterUnavailable, PrinterHasJobsInQueue, PrinterIsOutOfPaper, CompanyState — prezente în răspuns, dar versiunea curentă nu le completează. Nu vă bazaţi pe ele.
Exemplu
GET http://localhost:9203/fpservice/json/GetServiceState
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "GeneralError": false,
  "ActivityType": "ACPS",
  "ServiceSerialNumber": "AA0101000023",
  "ServiceDateTime": "/Date(1665499064440+0300)/",
  "FiscalMemorySerialNumber": "",
  "FiscalMemoryError": false,
  "FiscalMemoryFiscalized": false,
  "ServiceRegistrationInvalid": false,
  "ServiceSignatureInvalid": false,
  "ServiceMEVSyncError": false,
  "ServiceDatabaseCorrupted": false,
  "OfflineModeEnabled": false,
  "OfflineHoursLimit": 0,
  "FirstNotSyncedTransactionDate": null,
  "FirstNotSyncedTransactionNumber": null,
  "CurrentReportNumber": 37,
  "CurrentReportDate": "/Date(1665480576767+0300)/",
  "CurrentReport24HoursExpired": false,
  "VATRates": [
    { "Code": "A", "Percent": 20.00 },
    { "Code": "B", "Percent": 8.00 },
    { "Code": "C", "Percent": 0.00 }
  ]
}

Lista rapoartelor fiscale

GEThttp://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23

Întoarce rapoartele Z executate în ziua indicată, în ordine cronologică. Fără dată — toate. La final se adaugă tura deschisă, dacă are bonuri: fără TaskId şi MEVID, cu Date = momentul cererii — util ca să vedeţi câte bonuri are tura curentă. Cifrele unui raport — GetReport.

Parametrii cererii
CâmpTipDescriere
onDatedate (query)Ziua, în formatul YYYY-MM-DD. Opţional.
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
ReportsReportHeader[]Rapoartele găsite; câmpurile fiecăruia sunt mai jos
· DatedatetimeData înregistrării raportului în modulul fiscal
· MEVDatedatetimeData înregistrării raportului în MEV
· MEVIDstringIdentificatorul atribuit de MEV
· MEVResponsestringRăspunsul MEV la înregistrare
· ShiftIdintNumărul turei (raportului zilnic)
· ShiftOrderIdintNumărul sarcinii în cadrul turei
· TaskIdintNumărul sarcinii în coadă
· TaskUidguidIdentificatorul unic al sarcinii
· TotalBillintNumărul de bonuri fiscale din tură
Exemplu
GET http://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23
<GetReportsResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <Reports>
    <ReportHeader>
      <Date>2023-08-23T15:19:18.853</Date>
      <MEVDate>2023-08-23T15:19:26.183</MEVDate>
      <MEVID>99f5697f-c1a4-4d86-880f-7a8f46015f50</MEVID>
      <MEVResponse i:nil="true"/>
      <ShiftId>11</ShiftId>
      <ShiftOrderId>0</ShiftOrderId>
      <TaskId>55</TaskId>
      <TaskUid>a414d8d6-1faa-428d-9758-1706266b313e</TaskUid>
      <TotalBill>0</TotalBill>
    </ReportHeader>
  </Reports>
</GetReportsResponse>

Tranzacţiile unei ture

GEThttp://localhost:9203/fpservice/json/GetTransactions?shiftID=11

Întoarce toate tranzacţiile turei indicate, în ordine cronologică: bonuri, bonuri de plată, bonuri de serviciu, rapoarte, copii. Pentru detaliile unei tranzacţii folosiţi metoda potrivită tipului ei (GetFiscalReceipt, GetPaymentReceipt, GetServiceReceipt, GetReport).

Parametrii cererii
CâmpTipDescriere
shiftIDint (query)Numărul turei — ShiftId din răspunsurile de înregistrare sau CurrentReportNumber din GetServiceState
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
TransactionsTransactionHeader[]Tranzacţiile; câmpurile fiecăreia sunt mai jos
· Typeint / enumTipul: 0 bon fiscal, 1 text nefiscal, 2 raport X, 3 raport Z, 5 extragere, 6 introducere, 11 copie, 12 bon de plată. În JSON — număr, în XML — nume (Bill, BillNonFiscal, XReport, ZReport, WithdrawalOfFunds, SupplyWithMoney, PrintCopy, PaymentReceipt).
· TotalAmountdecimalSuma tranzacţiei
· Date, MEVDate, MEVID, MEVResponse, TaskId, ShiftOrderIdCa în câmpurile comune. ShiftId şi TaskUid nu se completează aici.
Exemplu
GET http://localhost:9203/fpservice/json/GetTransactions?shiftID=11
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Transactions": [
    { "Type": 6, "TotalAmount": 500.00, "TaskId": 45, "ShiftOrderId": 0,
      "Date": "/Date(1692792000000+0300)/", "MEVDate": "/Date(1692792004000+0300)/",
      "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" },
    { "Type": 0, "TotalAmount": 65.73, "TaskId": 46, "ShiftOrderId": 1,
      "Date": "/Date(1692793158853+0300)/", "MEVDate": "/Date(1692793166183+0300)/",
      "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" }
  ]
}

Bonul fiscal înregistrat

GEThttp://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46

Întoarce bonul fiscal aşa cum l-a înregistrat serviciul — cu preţurile efective, TVA calculat şi restul. Util pentru reconcilierea cu sistemul extern. Dacă tranzacţia nu există sau nu e un bon — eroarea 43.

Parametrii cererii
CâmpTipDescriere
transactionIdint (query)TaskId al tranzacţiei — cel primit la înregistrare sau din GetTransactions
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
FiscalReceiptFiscalReceiptBonul; câmpurile sunt mai jos
· DatedatetimeMomentul executării (tipăririi) tranzacţiei
· MEVDatedatetime?Data înregistrării în MEV; null dacă încă nu a ajuns acolo
· MEVIDstringIdentificatorul atribuit de MEV
· MEVResponsestringRăspunsul MEV la înregistrare
· TaskIdintNumărul tranzacţiei în coada serviciului
· ShiftIdintTura (raportul zilnic)
· ShiftOrderIdintNumărul tranzacţiei în cadrul turei
· NumberstringNumber din cerere
· UidguidUid al bonului
· MyDiscountUid, ClientPhone,
ClientEmail, HeaderText,
FooterText
Aşa cum au venit în cerere
· LinesReceiptLine[]Liniile, aşa cum s-au înregistrat: Code, Name, UnitCode, UnitName, Quantity, Amount (cantitate × preţ, înainte de reducere), Discount, Margin, Price (preţul efectiv, după reducere şi adaos) şi VAT — obiect cu Code, Percent, Amount (suma TVA), Brut (suma cu TVA)
· PaymentsReceiptPayment[]Code, Amount, RRN, BankResponse
· TaxesReceiptTax[]Totalurile pe cote TVA: Code, Percent, Amount (suma TVA), Brut (suma cu TVA)
· SubTotalAmountdecimalSubtotalul, aşa cum apare pe bon
· TotalAmountdecimalTotalul bonului
· DepositdecimalSuma achitată (toate plăţile)
· ChangedecimalRestul dat
Exemplu
GET http://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "FiscalReceipt": {
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 46,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

Bonul de plată înregistrat

GEThttp://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47

Întoarce un bon de plată — bonul pe care serviciul l-a emis în locul celui fiscal, fiindcă legătura cu MEV lipsea peste limita offline (vezi regulile). Are aceleaşi câmpuri ca GetFiscalReceipt, plus seria şi numărul. Dacă tranzacţia nu e un bon de plată — eroarea 43.

Parametrii cererii
CâmpTipDescriere
transactionIdint (query)TaskId al tranzacţiei — cel primit la înregistrare sau din GetTransactions
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
PaymentReceiptPaymentReceiptBonul de plată: toate câmpurile din FiscalReceipt plus cel de mai jos
· SeriaAndNumberstringSeria şi numărul din intervalul alocat casei
Exemplu
GET http://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "PaymentReceipt": {
    "SeriaAndNumber": "AA0000125",
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": null,
    "MEVID": "",
    "MEVResponse": "",
    "TaskId": 47,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

Bonul de serviciu înregistrat

GEThttp://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45

Întoarce un bon de introducere sau extragere a numerarului. Dacă tranzacţia nu e un bon de serviciu — eroarea 43.

Parametrii cererii
CâmpTipDescriere
transactionIdint (query)TaskId al tranzacţiei — cel primit la înregistrare sau din GetTransactions
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
ServiceReceiptServiceReceiptBonul; câmpurile sunt mai jos
· AmountdecimalSuma: pozitivă — introducere, negativă — extragere
· CashInDrawerdecimalNumerarul din sertar după operaţie
· DatedatetimeMomentul executării (tipăririi) tranzacţiei
· MEVDatedatetime?Data înregistrării în MEV; null dacă încă nu a ajuns acolo
· MEVIDstringIdentificatorul atribuit de MEV
· MEVResponsestringRăspunsul MEV la înregistrare
· TaskIdintNumărul tranzacţiei în coada serviciului
· ShiftIdintTura (raportul zilnic)
· ShiftOrderIdintNumărul tranzacţiei în cadrul turei
Exemplu
GET http://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "ServiceReceipt": {
    "Amount": 500.00,
    "CashInDrawer": 500.00,
    "Date": "/Date(1692792000000+0300)/",
    "MEVDate": "/Date(1692792004000+0300)/",
    "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90",
    "MEVResponse": "",
    "TaskId": 45,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 0
  }
}

Raportul X sau Z înregistrat

GEThttp://localhost:9203/fpservice/json/GetReport?transactionId=55

Întoarce cifrele unui raport zilnic: totalurile pe cote TVA şi pe tipuri de plată, numerarul şi, pentru Z, totalurile de la începutul anului. Dacă tranzacţia nu e un raport — eroarea 43.

Parametrii cererii
CâmpTipDescriere
transactionIdint (query)TaskId al tranzacţiei — cel primit la înregistrare sau din GetTransactions
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
ReportReportRaportul; câmpurile sunt mai jos
· ReportTypeint / enum1 — Z (RaportZ), 2 — X (RaportX)
· TotaldecimalCirculaţia zilnică totală
· TotalUntaxeddecimalCirculaţia zilnică neimpozitată
· TaxdecimalTVA zilnic total
· TotalBillintNumărul de bonuri fiscale
· LastBillNumberintNumărul ultimului bon fiscal
· TaxesReceiptTax[]Pe cote TVA: Code, Percent, Amount (suma TVA), Brut (suma cu TVA)
· PaymentsReportPayment[]Pe tipuri de plată: Code (numele tipului, de ex. NUMERAR), Amount
· PaymentReceiptsTaxes, PaymentReceiptsPaymentsAceleaşi totaluri, pentru bonurile de plată
· CashIn, CashOutdecimalNumerarul introdus şi extras în tură
· BalancedecimalSoldul de numerar din sertar
· TotalYear, TotalYearTaxdecimalCirculaţia şi TVA de la începutul anului; doar în raportul Z
· DatedatetimeMomentul executării (tipăririi) tranzacţiei
· MEVDatedatetime?Data înregistrării în MEV; null dacă încă nu a ajuns acolo
· MEVIDstringIdentificatorul atribuit de MEV
· MEVResponsestringRăspunsul MEV la înregistrare
· TaskIdintNumărul tranzacţiei în coada serviciului
· ShiftIdintTura (raportul zilnic)
· ShiftOrderIdintNumărul tranzacţiei în cadrul turei
Exemplu
GET http://localhost:9203/fpservice/json/GetReport?transactionId=55
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Report": {
    "ReportType": 1,
    "Total": 65.73,
    "TotalUntaxed": 0.00,
    "Tax": 10.96,
    "TotalBill": 1,
    "LastBillNumber": 1,
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "Payments": [{ "Code": "NUMERAR", "Amount": 65.73 }],
    "PaymentReceiptsTaxes": [],
    "PaymentReceiptsPayments": [],
    "CashIn": 500.00,
    "CashOut": 0.00,
    "Balance": 565.73,
    "TotalYear": 184250.40,
    "TotalYearTax": 30708.40,
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 55,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 3
  }
}

Imaginea tranzacţiei

GEThttp://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46

Întoarce macheta tipărită a oricărei tranzacţii, ca pagină HTML (lăţime 57 mm, imaginile incluse) codificată Base64. Util pentru a afişa bonul pe ecran sau a-l trimite clientului. Dacă tranzacţia nu există — eroarea 43.

Parametrii cererii
CâmpTipDescriere
transactionIdint (query)TaskId al tranzacţiei — cel primit la înregistrare sau din GetTransactions
Răspunsul
CâmpTipDescriere
ErrorCodeint / enumCodul erorii; 0 (OK) — metoda s-a executat fără erori. Vezi codurile de eroare.
ErrorMessagestringMesaj explicativ al erorii
TemplatestringHTML codificat Base64
Exemplu
GET http://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Template": "PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+..."
}

Tipuri de plată

Valoarea câmpului Payments[].Code. Denumirile sunt cele din clasificarea MEV şi apar aşa pe bon.

CodMEVDescriereAdmis în
1NUMERARnumerartoate
2CARDcard bancartoate
3.1VAUCHERvouchertoate
3.2CEC (CERTIFICAT VALORIC)certificat valorictoate
3.3TICHETdocument cu valoare prestabilită, în leitoate
5TMEtichet de masă pe suport electronicACPS; ACPSPPGL — doar pe bonuri fără combustibil
6ABONAMENTabonamenttoate
7ALT TIPalt tiptoate
8.1CreditcreditACPS (MEV v2), ACPSPPGL
8.2LeasingleasingACPS (MEV v2), ACPSPPGL
8.3AvansavansACPS (MEV v2), ACPSPPGL
8.4ArvunaarvunăACPS (MEV v2), ACPSPPGL
8.5GajgajACPS (MEV v2), ACPSPPGL

Activitatea casei vine în GetServiceState → ActivityType. La o staţie PECO (ACPPGL) sunt admise numai codurile marcate „toate”. Un cod nepermis — eroarea 28.

Coduri de eroare

Valorile câmpului ErrorCode întoarse de toate metodele.

CodNumeSemnificaţie
Serviciu
0OKmetoda s-a executat fără erori
1ServiceUnknownInternalErroreroare internă necunoscută a serviciului
2ServiceDatabaseNotRespondingbaza de date a serviciului nu răspunde
3ServiceDatabaseCorruptedbaza de date a serviciului e deteriorată
4ServiceSignatureInvalidsemnătura digitală a serviciului nu e validă
5ServiceNotConfiguredserviciul nu e configurat sau e configurat greşit
6ServiceActivationCancelledînregistrarea serviciului în MEV a fost anulată
7ServiceInvalidDateTimeceasul calculatorului pe care rulează serviciul e setat greşit
8ServiceCloudSyncErroreroare de sincronizare a tranzacţiilor cu ISFiscalCloud şi/sau MEV
9ServiceDailyReportRequirede necesar raportul zilnic cu închidere (Z)
10ServiceDailyReportPrintingse tipăreşte raportul zilnic cu închidere
11ServiceCloudConnectionErroreroare de conectare la ISFiscalCloud (doar în configuraţia fără offline)
12ServiceCloudTimeoutErrorISFiscalCloud nu a răspuns la timp (doar în configuraţia fără offline)
13ServicePaymentReceiptRangeNotSetlegătura cu MEV lipseşte peste limita offline, iar intervalul de numere pentru bonurile de plată nu e setat sau s-a epuizat
14ServiceSMSNotConfiguredîn cerere e ClientPhone, dar trimiterea SMS nu e configurată în serviciu
15ServiceEmailNotConfiguredîn cerere e ClientEmail, dar trimiterea e-mail nu e configurată în serviciu
16ServiceTaskProcessingîn acest moment se înregistrează un bon sau un raport; primirea unui bon nou e temporar imposibilă — repetaţi cererea peste câteva secunde
Formatul cererii
20FormatBillDoesNotContainLinesbonul nu conţine produse
21FormatBillDoesNotContainPaymentsbonul nu conţine plăţi
22FormatIncorrectProductNamedenumirea produsului e greşită sau goală
23FormatIncorrectQuantitycantitate greşită
24FormatIncorrectAmountsumă greşită
25FormatIncorrectPricepreţ greşit
26FormatUnknownUnitunitate de măsură necunoscută sau nepermisă
27FormatUnknownVATcotă TVA necunoscută
28FormatUnknownPaymentcod de plată necunoscut
29FormatUnknownDepartmentsubdiviziune necunoscută
30FormatPhoneNumberMissinglipseşte numărul de telefon (necesar pentru DisplayType = 2)
31FormatEmailMissinglipseşte adresa de e-mail (necesară pentru DisplayType = 3)
Procesare
40ProcessingInsufficientFundsInBoxnumerar insuficient în sertar pentru operaţie
41ProcessingInsufficientPaymentAmountsuma plăţilor e mai mică decât suma produselor
42ProcessingChangeCanNotBeCalculatedrestul nu poate fi calculat
43ProcessingTaskNotFoundsarcina nu a fost găsită
44ProcessingTaskFinishedsarcina e deja finalizată
45ProcessingIllegalCommandcomandă nepermisă în starea curentă
46ProcessingTaskExistsun bon cu acest Uid există deja; răspunsul conţine TaskId al lui
Imprimantă
61PrinterNotFoundimprimanta nu a fost găsită
62PrinterUnavailableimprimanta nu e disponibilă
63PrinterOfflineimprimanta e în regim offline
64PrinterHasJobsInQueuecoada imprimantei are sarcini neexecutate
65PrinterIsOutOfPaperimprimanta nu are hârtie
Memorie fiscală
71FiscalMemoryNotConnectedmemoria fiscală nu e conectată
72FiscalMemoryNotFiscalizedmemoria fiscală nu e fiscalizată
73FiscalMemoryIDReadingErroreroare la citirea identificatorului memoriei fiscale
74FiscalMemoryWrongIDidentificatorul memoriei fiscale e greşit
75FiscalMemoryReportNotWrittenraportul nu a fost scris în memoria fiscală
ISFiscalService · IntelectSoft

rev. 20260923-1543

IS
ISFiscalService
Документация для интеграторов
RORUEN
Руководство
Обзор Подключение и форматы Типовой сценарий
Методы
POSTRegisterFiscalReceipt POSTRegisterServiceReceipt POSTRegisterReport POSTPrintNonFiscalText POSTPrintCopy GETPrintLastCopy GETGetServiceState GETGetReports GETGetTransactions GETGetFiscalReceipt GETGetPaymentReceipt GETGetServiceReceipt GETGetReport GETGetTransactionTemplate
Справочники
Типы оплат Коды ошибок

ISFiscalService API

Служба Windows, которая печатает фискальные чеки и отчёты торгового приложения, регистрирует их в электронном журнале и передаёт в ISFiscalCloud и MEV.

Базовый адресhttp://localhost:9203/fpservice
ФорматыJSON · XML
Методы14
Версия сервиса1.26.2.256

Обзор

  1. Торговое приложение третьей стороны, интегрированное с ISFiscalCloud, работает в торговой точке и передаёт продажи в веб-сервис ISFiscalService. Каждому чеку и отчёту при сохранении присваивается уникальный порядковый номер и QR-код, затем он печатается на фискальном или POS-принтере.
  2. Фискальные чеки, служебные чеки и отчёты передаются одновременно в ISFiscalCloud и в MEV — не сначала в один, потом в другой.
  3. Любой покупатель, получивший чек с QR-кодом, может проверить его подлинность на freceipt.eservicii.md или mev.sfs.md, а продавец видит свои чеки в кабинете на mev.md.

Подключение и форматы

Сервис слушает локально, на компьютере кассы, порт 9203 (меняется ключом Port в appSettings конфигурационного файла сервиса). Каждый метод доступен через три точки входа — сегмент адреса задаёт формат и запроса, и ответа:

ФорматАдресContent-Type
JSONhttp://localhost:9203/fpservice/json/{Метод}application/json
XMLhttp://localhost:9203/fpservice/xml/{Метод}application/xml
SOAPhttp://localhost:9203/fpservice/soap · WSDL: http://localhost:9203/fpservice?wsdltext/xml

Различия форматов

  • ErrorCode в JSON приходит числом (0), в XML — именем (OK).
  • Даты в JSON приходят в формате WCF /Date(мс+зона)/ — миллисекунды от 1970-01-01 UTC плюс часовой пояс, — в XML как ISO 8601.
  • XML-запросы несут пространство имён http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service, элементы идут в алфавитном порядке, как в примерах.

Очередь задач

Методы регистрации не печатают синхронно: они ставят задачу в очередь сервиса и сразу возвращают её идентификаторы. TaskId — номер в очереди, ShiftId — смена (дневной отчёт), ShiftOrderId — номер в смене, TaskUid — GUID, ваш или присвоенный автоматически.

Общие поля транзакций

Методы, читающие транзакции обратно (Get…), кроме собственных полей возвращают эти:

ПолеТипОписание
DatedatetimeМомент выполнения (печати) транзакции
MEVDatedatetime?Дата регистрации в MEV; null, если ещё не передана
MEVIDstringИдентификатор, присвоенный MEV
MEVResponsestringОтвет MEV при регистрации
TaskIdintНомер транзакции в очереди сервиса
ShiftIdintСмена (дневной отчёт)
ShiftOrderIdintНомер транзакции в рамках смены

CloudSyncWarning = true — не ошибка: задача зарегистрирована, но в очереди есть транзакции, ещё не переданные в MEV. Проверьте GetServiceState. Если это продлится дольше оффлайн-лимита, новые чеки будут выдаваться как платёжные квитанции — см. правила.

Типовой сценарий

  1. При запуске приложения — GetServiceState. Если GeneralError = true, покажите оператору причину по флагам состояния.

  2. В начале смены, если нужна разменная наличность — RegisterServiceReceipt с положительной суммой.

  3. На каждую продажу — RegisterFiscalReceipt со своим Uid. Ссылку из QR показать покупателю. При таймауте или сетевой ошибке повторите тот же запрос с тем же Uid: если чек уже прошёл, придёт ошибка 46 и его TaskId, а не дубль.

  4. Если чек не напечатался (кончилась бумага и т.п.) — PrintCopy по Uid, а не повторная регистрация: повторный чек — это вторая продажа в MEV.

  5. При закрытии дня — изъятие наличных (RegisterServiceReceipt с отрицательной суммой), затем Z-отчёт (RegisterReport, CloseReport = true). Через 24 часа после открытия смены сервис отклоняет чеки до Z.

  6. Для сверки — GetReports и GetTransactions дают список, а методы Get… — каждую транзакцию так, как её зарегистрировал сервис.

Регистрация фискального чека

POSThttp://localhost:9203/fpservice/json/RegisterFiscalReceipt

Регистрирует в очереди фискального сервиса задачу печати фискального чека. Ответ содержит ссылку проверки MEV, которую нужно показать покупателю в виде QR-кода или напечатать внизу чека.

Повтор безопасен. Если прислать уже зарегистрированный Uid, сервис не создаёт второй чек: он возвращает ErrorCode = 46 (ProcessingTaskExists) вместе с TaskId существующего чека. Поэтому при таймауте повторите тот же запрос с тем же Uid.

Параметры запроса
ПолеТипОписание
ClientEmailstringE-mail клиента для отправки копии чека. Обязателен при DisplayType = 3.
ClientPhonestringТелефон клиента для отправки копии по SMS. Обязателен при DisplayType = 2.
DisplayTypeintСпособ предъявления чека: 0 — печать на бумаге (по умолчанию); 1 — QR-код на мониторе покупателя; 2 — SMS; 3 — e-mail
FooterTextstringПроизвольный текст в конце чека
ForcePrintboolПринудительная печать на бумаге — приоритетнее всех остальных параметров и настроек фискального модуля
HeaderTextstringПроизвольный текст в начале чека
LinesBillLine[]Строки чека — минимум одна. Структура
MyDiscountUidguidИдентификатор в дисконтной системе MyDiscount
NumberstringНомер чека во внешней учётной системе
PaymentsBillPayment[]Оплаты чека — минимум одна. Структура
PrinterURIstringURI POS-принтера, подключённого к сервису, для печати чека. Пусто — печать на принтер Windows по умолчанию.
UidguidGUID чека во внешней системе. Пусто — присвоит сервис. Рекомендуется передавать всегда: повтор запроса становится безопасным, а копию можно запросить по своему идентификатору.

Lines · BillLine

Минимум одна строка.

ПолеТипОписание
CodestringКод товара во внешней системе
DiscountdecimalСкидка в леях на всю сумму строки
MargindecimalНаценка в леях на всю сумму строки
NamestringНаименование товара; обязательно
PricedecimalЦена за единицу; больше 0
QuantitydecimalКоличество; больше 0, до 3 знаков после запятой
UnitCodeintКод единицы измерения по классификации MEV: 1 — литры, 2 — куб. метры, 3 — товар, не являющийся топливом, 0 — не указан. Важен только на АЗС — см. правила.
UnitNamestringНаименование единицы измерения
VATstringКод ставки НДС: буква A–Z из настроенных в сервисе (список — в GetServiceState → VATRates) или _ — без НДС. Обязателен.

Payments · BillPayment

Минимум одна оплата. Суммы должны покрывать чек — см. правила.

ПолеТипОписание
AmountdecimalСумма оплаты; больше 0
BankResponsestringОтвет банковского терминала при оплате картой
CodestringКод типа оплаты — см. типы оплат
RRNstringRRN банковской транзакции при оплате картой

Правила проверки

Сервис проверяет чек, прежде чем поставить его в очередь. Часть правил зависит от вида деятельности кассы — поле ActivityType в GetServiceState: ACPS — торговля, ACPPGL — АЗС, ACPSPPGL — АЗС с магазином.

  1. Сумма чека. Сумма строки = round(Quantity × Price, 2) − Discount + Margin; сумма чека — сумма строк.
  2. Оплаты. Если оплат меньше суммы чека — ошибка 41. Если больше, разница — это сдача, а сдача выдаётся только из наличных (код 1): если наличная оплата не покрывает сдачу — ошибка 42.
  3. АЗС (ACPPGL). Одна строка и одна оплата. Допустимые UnitCode: 0, 1, 2; 0 регистрируется как литры.
  4. АЗС с магазином (ACPSPPGL). Допустимые UnitCode: 0–3. Строки с 1 или 2 — топливо, с 0 или 3 — товар. Чек с топливом содержит одну оплату.
  5. Округление топлива. В чеке с одной строкой топлива расхождение между оплатой и чеком не больше цены 10 мл (Price / 100) допускается: сумма строки становится суммой оплаты.
  6. Коды оплат допускаются в зависимости от деятельности — см. типы оплат. Иначе — ошибка 28.
  7. Часы. Если время компьютера меньше времени последней зарегистрированной транзакции — ошибка 7.
  8. Смена 24 часа. Более чем через 24 часа после открытия смены — ошибка 9, до Z-отчёта. Если в сервисе настроен автоматический Z-отчёт, сервис сделает его сам и зарегистрирует чек.
  9. Нет связи с MEV. Если непереданные в MEV транзакции превысили оффлайн-лимит (или лимит равен 0 и облако не отвечает), чек не отклоняется: он регистрируется как платёжная квитанция с серией и номером из выделенного кассе диапазона (GetTransactions показывает её с Type = 12, подробности — GetPaymentReceipt). Если диапазон не задан или исчерпан — ошибка 13.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
CloudSyncWarningboolВ очереди есть хотя бы одна задача, ещё не переданная в MEV
ShiftIdintИдентификатор смены (дневного отчёта), в которой зарегистрирована задача
ShiftOrderIdintПорядковый номер задачи в рамках смены
TaskIdintПорядковый номер задачи в очереди фискального сервиса
TaskUidguidУникальный идентификатор задачи — равен Uid из запроса либо присваивается автоматически, если его не было
QRstringСсылка на портал MEV для проверки чека. Показывается QR-кодом на экране покупателя или печатается внизу чека.
Пример
POST http://localhost:9203/fpservice/json/RegisterFiscalReceipt
Content-Type: application/json

{
  "ClientEmail": "",
  "ClientPhone": "",
  "DisplayType": 0,
  "FooterText": "Thank you!",
  "ForcePrint": true,
  "HeaderText": "Operator 1",
  "Lines": [{
    "Code": "2",
    "Discount": 2.00,
    "Margin": 0.00,
    "Name": "Ext DE5",
    "Price": 31.50,
    "Quantity": 2.150,
    "UnitCode": 1,
    "UnitName": "liters",
    "VAT": "A"
  }],
  "Number": "248",
  "Payments": [{
    "Amount": 100.00,
    "BankResponse": "",
    "Code": "1",
    "RRN": ""
  }],
  "PrinterURI": "",
  "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98"
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 1,
  "TaskId": 46,
  "TaskUid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
  "QR": "https://mev.sfs.md/receipt-verifier/33C303B4706C3467CCD14EAA6662CEDE"
}
Тот же запрос в XML
POST http://localhost:9203/fpservice/xml/RegisterFiscalReceipt
Content-Type: application/xml

<RegisterFiscalReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <ClientEmail></ClientEmail>
  <ClientPhone></ClientPhone>
  <DisplayType>0</DisplayType>
  <FooterText>Thank you!</FooterText>
  <ForcePrint>true</ForcePrint>
  <HeaderText>Operator 1</HeaderText>
  <Lines>
    <BillLine>
      <Code>2</Code>
      <Discount>2.00</Discount>
      <Margin>0.00</Margin>
      <Name>Ext DE5</Name>
      <Price>31.50</Price>
      <Quantity>2.150</Quantity>
      <UnitCode>1</UnitCode>
      <UnitName>liters</UnitName>
      <VAT>A</VAT>
    </BillLine>
  </Lines>
  <Number>248</Number>
  <Payments>
    <BillPayment>
      <Amount>100.00</Amount>
      <BankResponse></BankResponse>
      <Code>1</Code>
      <RRN></RRN>
    </BillPayment>
  </Payments>
  <PrinterURI></PrinterURI>
  <Uid>2a0ce057-213b-4837-b3c7-d77c91e4661c</Uid>
</RegisterFiscalReceiptRequest>
<RegisterFiscalReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>10</ShiftId>
  <ShiftOrderId>8</ShiftOrderId>
  <TaskId>44</TaskId>
  <TaskUid>2a0ce057-213b-4837-b3c7-d77c91e4661c</TaskUid>
  <QR>https://mev.sfs.md/receipt-verifier/5CA4D2CA0450DF80FEB2A62354D75311</QR>
</RegisterFiscalReceiptResponse>

Регистрация служебного чека

POSThttp://localhost:9203/fpservice/json/RegisterServiceReceipt

Регистрирует служебный чек о внесении (Amount > 0) или изъятии (Amount < 0) наличных. Сумма изъятия не может превышать наличность в ящике за текущую смену — наличные оплаты плюс внесения, минус изъятия и выданная сдача, — иначе ошибка 40. Сумма 0 — ошибка 24.

Параметры запроса
ПолеТипОписание
AmountdecimalСумма внесения; отрицательное значение — сумма изъятия
ReasonintПричина изъятия: 0 — возврат, 1 — инкассация. Поле принимается, но текущая версия сервиса его не обрабатывает.
ForcePrintboolПринудительная печать на бумаге (приоритетнее настроек фискального модуля)
PrinterURIstringURI POS-принтера, подключённого к сервису, для печати служебного чека. Пусто — печать на принтер Windows по умолчанию.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
CloudSyncWarningboolВ очереди есть хотя бы одна задача, ещё не переданная в MEV
ShiftIdintИдентификатор смены (дневного отчёта), в которой зарегистрирована задача
ShiftOrderIdintПорядковый номер задачи в рамках смены
TaskIdintПорядковый номер задачи в очереди фискального сервиса
TaskUidguidУникальный идентификатор задачи (присваивается автоматически)
Пример
POST http://localhost:9203/fpservice/json/RegisterServiceReceipt
Content-Type: application/json

{
  "Amount": 10.22,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 3,
  "TaskId": 49,
  "TaskUid": "22ebb07d-57d6-4b5b-96bd-ee6bfd9bebb6"
}
Тот же запрос в XML
POST http://localhost:9203/fpservice/xml/RegisterServiceReceipt
Content-Type: application/xml

<RegisterServiceReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <Amount>10.22</Amount>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterServiceReceiptRequest>
<RegisterServiceReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>4</ShiftOrderId>
  <TaskId>50</TaskId>
  <TaskUid>def450fe-f9d5-4aa6-a0de-e11c94774b54</TaskUid>
</RegisterServiceReceiptResponse>

Регистрация дневного отчёта

POSThttp://localhost:9203/fpservice/json/RegisterReport

Регистрирует задачу формирования и печати дневного отчёта: с закрытием смены (Z-отчёт) или без (X-отчёт). Z-отчёт закрывает текущую смену; если открытой смены не было, открывается и закрывается пустая. Пока предыдущий Z ещё обрабатывается — ошибка 10. На кассах с фискальной памятью ошибка памяти блокирует Z-отчёт, но не X-отчёт — он остаётся доступным для проверки кассы.

Параметры запроса
ПолеТипОписание
CloseReportbooltrue — отчёт с закрытием (Z), false — без закрытия (X)
ForcePrintboolПринудительная печать на бумаге. Z-отчёт может печататься и без неё, если сервис настроен всегда печатать Z.
PrinterURIstringURI POS-принтера, подключённого к сервису, для печати отчёта. Пусто — печать на принтер Windows по умолчанию.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
CloudSyncWarningboolВ очереди есть хотя бы одна задача, ещё не переданная в MEV
ShiftIdintИдентификатор смены (дневного отчёта), в которой зарегистрирована задача
ShiftOrderIdintПорядковый номер задачи в рамках смены
TaskIdintПорядковый номер задачи в очереди фискального сервиса
TaskUidguidУникальный идентификатор задачи (присваивается автоматически)
Пример
POST http://localhost:9203/fpservice/json/RegisterReport
Content-Type: application/json

{
  "CloseReport": false,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 6,
  "TaskId": 52,
  "TaskUid": "9cc9ac78-270d-429a-9867-c386e3e29409"
}
Тот же запрос в XML
POST http://localhost:9203/fpservice/xml/RegisterReport
Content-Type: application/xml

<RegisterReportRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <CloseReport>false</CloseReport>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterReportRequest>
<RegisterReportResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>7</ShiftOrderId>
  <TaskId>53</TaskId>
  <TaskUid>ec76c1ba-0dc4-4685-bd8a-994d35fad2e5</TaskUid>
</RegisterReportResponse>

Печать нефискального текста

POSThttp://localhost:9203/fpservice/json/PrintNonFiscalText

Регистрирует задачу печати произвольного текста для покупателя — без фискального значения.

Параметры запроса
ПолеТипОписание
Linesstring[]Массив строк для печати; минимум одна, иначе ошибка 20
PrinterURIstringURI POS-принтера, подключённого к сервису, для печати текста. Пусто — печать на принтер Windows по умолчанию.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
CloudSyncWarningboolВ очереди есть хотя бы одна задача, ещё не переданная в MEV
ShiftIdintИдентификатор смены (дневного отчёта), в которой зарегистрирована задача
ShiftOrderIdintПорядковый номер задачи в рамках смены
TaskIdintПорядковый номер задачи в очереди фискального сервиса
Пример
POST http://localhost:9203/fpservice/json/PrintNonFiscalText
Content-Type: application/json

{
  "Lines": ["Acesta este un exemplu", "de bon nefiscal."],
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 5,
  "TaskId": 63
}

Печать копии чека или отчёта

POSThttp://localhost:9203/fpservice/json/PrintCopy

Регистрирует задачу повторной печати фискального чека, служебного чека или X/Z-отчёта, ранее зарегистрированного через этот сервис. Нефискальный текст и копии не копируются. Копия всегда печатается на бумаге с водяным знаком COPIE и получает собственный TaskId. Если транзакция не найдена — ошибка 43.

Параметры запроса
ПолеТипОписание
TaskIdintНомер задачи из очереди, которую нужно напечатать повторно
TaskUidguidGUID транзакции — Uid, переданный при регистрации, или TaskUid из ответа. Достаточно одного из TaskId и TaskUid; если переданы оба, используется TaskUid.
PrinterURIstringURI POS-принтера, подключённого к сервису, для печати копии. Пусто — печать на принтер Windows по умолчанию.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
TaskIdintПорядковый номер задачи в очереди фискального сервиса
Пример
POST http://localhost:9203/fpservice/json/PrintCopy
Content-Type: application/json

{
  "TaskId": 61,
  "TaskUid": "00000000-0000-0000-0000-000000000000",
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "TaskId": 67
}

Печать копии последней транзакции

GEThttp://localhost:9203/fpservice/json/PrintLastCopy

Регистрирует задачу повторной печати последней выполненной транзакции (фискальный чек, служебный чек, X/Z-отчёт) с водяным знаком COPIE. Параметров нет. Если такой транзакции нет — ошибка 43.

Параметры запроса

Нет.

Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
TaskIdintПорядковый номер задачи в очереди фискального сервиса
Пример
GET http://localhost:9203/fpservice/json/PrintLastCopy
<PrintCopyTaskResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <TaskId>68</TaskId>
</PrintCopyTaskResponse>

Состояние сервиса

GEThttp://localhost:9203/fpservice/json/GetServiceState

Возвращает текущее состояние фискального сервиса: регистрационные номера, последние транзакции и флаги ошибок. Вызывайте при запуске приложения и перед продажей, если в предыдущих ответах появился CloudSyncWarning.

Параметры запроса

Нет.

Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
GeneralErrorboolОбщий флаг. true — регистрация транзакций сейчас невозможна; причину показывают флаги ниже.
ActivityTypestringВид деятельности кассы: ACPS — торговля, ACPPGL — АЗС, ACPSPPGL — АЗС с магазином. Определяет допустимые коды оплат и единицы.
ServiceSerialNumberstringРегистрационный номер сервиса в MEV
ServiceDateTimedatetimeТекущие дата/время сервиса (часы компьютера)
FiscalMemorySerialNumberstringНомер фискальной памяти; пусто, если касса работает без неё
FiscalMemoryErrorboolФискальная память отвечает с ошибкой. Поднимает GeneralError.
FiscalMemoryFiscalizedboolФискальная память фискализирована
ServiceRegistrationInvalidboolРегистрация в MEV аннулирована или устройство неизвестно облаку
ServiceSignatureInvalidboolОблако отклонило транзакции из-за цифровой подписи. Транзакции заблокированы.
ServiceMEVSyncErrorboolСамая старая непереданная в MEV транзакция превысила оффлайн-лимит
ServiceDatabaseCorruptedboolЦелостность БД сервиса нарушена. Транзакции заблокированы.
OfflineModeEnabledboolЕсть транзакции, не переданные в MEV дольше минуты, но оффлайн-лимит ещё не превышен
OfflineHoursLimitintСколько часов касса может работать с непереданными транзакциями. 0 — оффлайн запрещён. На кассах с фискальной памятью, если не задано, действует 72.
FirstNotSyncedTransactionDatedatetime?Дата самой старой не переданной в MEV транзакции — от неё отсчитывается оффлайн
FirstNotSyncedTransactionNumberint?TaskId этой транзакции
CurrentReportNumberint?Номер открытой смены (ShiftId); null, если смена не открыта
CurrentReportDatedatetime?Дата открытия текущей смены
CurrentReport24HoursExpiredboolС открытия смены прошло более 24 часов. До Z-отчёта чеки отклоняются с ошибкой 9.
VATRatesVATRate[]Настроенные ставки НДС: Code (буква для Lines[].VAT) и Percent
…LastTransactionDate, LastTransactionMEVID, LastTransactionNumber, LastSyncedTransactionDate, ServiceDatetimeInvalid, FiscalMemoryReportNotWritten, PrinterUnavailable, PrinterHasJobsInQueue, PrinterIsOutOfPaper, CompanyState — присутствуют в ответе, но текущая версия их не заполняет. Не полагайтесь на них.
Пример
GET http://localhost:9203/fpservice/json/GetServiceState
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "GeneralError": false,
  "ActivityType": "ACPS",
  "ServiceSerialNumber": "AA0101000023",
  "ServiceDateTime": "/Date(1665499064440+0300)/",
  "FiscalMemorySerialNumber": "",
  "FiscalMemoryError": false,
  "FiscalMemoryFiscalized": false,
  "ServiceRegistrationInvalid": false,
  "ServiceSignatureInvalid": false,
  "ServiceMEVSyncError": false,
  "ServiceDatabaseCorrupted": false,
  "OfflineModeEnabled": false,
  "OfflineHoursLimit": 0,
  "FirstNotSyncedTransactionDate": null,
  "FirstNotSyncedTransactionNumber": null,
  "CurrentReportNumber": 37,
  "CurrentReportDate": "/Date(1665480576767+0300)/",
  "CurrentReport24HoursExpired": false,
  "VATRates": [
    { "Code": "A", "Percent": 20.00 },
    { "Code": "B", "Percent": 8.00 },
    { "Code": "C", "Percent": 0.00 }
  ]
}

Список фискальных отчётов

GEThttp://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23

Возвращает выполненные Z-отчёты за указанный день в хронологическом порядке. Без даты — все. В конец добавляется открытая смена, если в ней есть чеки: без TaskId и MEVID, с Date = моментом запроса — так видно, сколько чеков в текущей смене. Цифры отчёта — GetReport.

Параметры запроса
ПолеТипОписание
onDatedate (query)День в формате YYYY-MM-DD. Необязателен.
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
ReportsReportHeader[]Найденные отчёты; поля каждого ниже
· DatedatetimeДата регистрации отчёта в фискальном модуле
· MEVDatedatetimeДата регистрации отчёта в MEV
· MEVIDstringИдентификатор, присвоенный MEV
· MEVResponsestringОтвет MEV при регистрации
· ShiftIdintНомер смены (дневного отчёта)
· ShiftOrderIdintНомер задачи в рамках смены
· TaskIdintНомер задачи в очереди
· TaskUidguidУникальный идентификатор задачи
· TotalBillintКоличество фискальных чеков в смене
Пример
GET http://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23
<GetReportsResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <Reports>
    <ReportHeader>
      <Date>2023-08-23T15:19:18.853</Date>
      <MEVDate>2023-08-23T15:19:26.183</MEVDate>
      <MEVID>99f5697f-c1a4-4d86-880f-7a8f46015f50</MEVID>
      <MEVResponse i:nil="true"/>
      <ShiftId>11</ShiftId>
      <ShiftOrderId>0</ShiftOrderId>
      <TaskId>55</TaskId>
      <TaskUid>a414d8d6-1faa-428d-9758-1706266b313e</TaskUid>
      <TotalBill>0</TotalBill>
    </ReportHeader>
  </Reports>
</GetReportsResponse>

Транзакции смены

GEThttp://localhost:9203/fpservice/json/GetTransactions?shiftID=11

Возвращает все транзакции указанной смены в хронологическом порядке: чеки, платёжные квитанции, служебные чеки, отчёты, копии. Подробности транзакции — методом, соответствующим её типу (GetFiscalReceipt, GetPaymentReceipt, GetServiceReceipt, GetReport).

Параметры запроса
ПолеТипОписание
shiftIDint (query)Номер смены — ShiftId из ответов регистрации или CurrentReportNumber из GetServiceState
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
TransactionsTransactionHeader[]Транзакции; поля каждой ниже
· Typeint / enumТип: 0 фискальный чек, 1 нефискальный текст, 2 X-отчёт, 3 Z-отчёт, 5 изъятие, 6 внесение, 11 копия, 12 платёжная квитанция. В JSON — число, в XML — имя (Bill, BillNonFiscal, XReport, ZReport, WithdrawalOfFunds, SupplyWithMoney, PrintCopy, PaymentReceipt).
· TotalAmountdecimalСумма транзакции
· Date, MEVDate, MEVID, MEVResponse, TaskId, ShiftOrderIdКак в общих полях. ShiftId и TaskUid здесь не заполняются.
Пример
GET http://localhost:9203/fpservice/json/GetTransactions?shiftID=11
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Transactions": [
    { "Type": 6, "TotalAmount": 500.00, "TaskId": 45, "ShiftOrderId": 0,
      "Date": "/Date(1692792000000+0300)/", "MEVDate": "/Date(1692792004000+0300)/",
      "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" },
    { "Type": 0, "TotalAmount": 65.73, "TaskId": 46, "ShiftOrderId": 1,
      "Date": "/Date(1692793158853+0300)/", "MEVDate": "/Date(1692793166183+0300)/",
      "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" }
  ]
}

Зарегистрированный фискальный чек

GEThttp://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46

Возвращает фискальный чек в том виде, как его зарегистрировал сервис, — с фактическими ценами, рассчитанным НДС и сдачей. Удобно для сверки с внешней системой. Если транзакции нет или это не чек — ошибка 43.

Параметры запроса
ПолеТипОписание
transactionIdint (query)TaskId транзакции — полученный при регистрации или из GetTransactions
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
FiscalReceiptFiscalReceiptЧек; поля ниже
· DatedatetimeМомент выполнения (печати) транзакции
· MEVDatedatetime?Дата регистрации в MEV; null, если ещё не передана
· MEVIDstringИдентификатор, присвоенный MEV
· MEVResponsestringОтвет MEV при регистрации
· TaskIdintНомер транзакции в очереди сервиса
· ShiftIdintСмена (дневной отчёт)
· ShiftOrderIdintНомер транзакции в рамках смены
· NumberstringNumber из запроса
· UidguidUid чека
· MyDiscountUid, ClientPhone,
ClientEmail, HeaderText,
FooterText
Как пришли в запросе
· LinesReceiptLine[]Строки в том виде, как зарегистрированы: Code, Name, UnitCode, UnitName, Quantity, Amount (количество × цена, до скидки), Discount, Margin, Price (фактическая цена после скидки и наценки) и VAT — объект с Code, Percent, Amount (сумма НДС), Brut (сумма с НДС)
· PaymentsReceiptPayment[]Code, Amount, RRN, BankResponse
· TaxesReceiptTax[]Итоги по ставкам НДС: Code, Percent, Amount (сумма НДС), Brut (сумма с НДС)
· SubTotalAmountdecimalПодытог, как на чеке
· TotalAmountdecimalИтог чека
· DepositdecimalВнесённая сумма (все оплаты)
· ChangedecimalВыданная сдача
Пример
GET http://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "FiscalReceipt": {
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 46,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

Зарегистрированная платёжная квитанция

GEThttp://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47

Возвращает платёжную квитанцию — документ, который сервис выдал вместо фискального чека, потому что связи с MEV не было дольше оффлайн-лимита (см. правила). Поля те же, что у GetFiscalReceipt, плюс серия и номер. Если транзакция не платёжная квитанция — ошибка 43.

Параметры запроса
ПолеТипОписание
transactionIdint (query)TaskId транзакции — полученный при регистрации или из GetTransactions
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
PaymentReceiptPaymentReceiptПлатёжная квитанция: все поля FiscalReceipt плюс поле ниже
· SeriaAndNumberstringСерия и номер из выделенного кассе диапазона
Пример
GET http://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "PaymentReceipt": {
    "SeriaAndNumber": "AA0000125",
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": null,
    "MEVID": "",
    "MEVResponse": "",
    "TaskId": 47,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

Зарегистрированный служебный чек

GEThttp://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45

Возвращает чек внесения или изъятия наличных. Если транзакция не служебный чек — ошибка 43.

Параметры запроса
ПолеТипОписание
transactionIdint (query)TaskId транзакции — полученный при регистрации или из GetTransactions
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
ServiceReceiptServiceReceiptЧек; поля ниже
· AmountdecimalСумма: положительная — внесение, отрицательная — изъятие
· CashInDrawerdecimalНаличность в ящике после операции
· DatedatetimeМомент выполнения (печати) транзакции
· MEVDatedatetime?Дата регистрации в MEV; null, если ещё не передана
· MEVIDstringИдентификатор, присвоенный MEV
· MEVResponsestringОтвет MEV при регистрации
· TaskIdintНомер транзакции в очереди сервиса
· ShiftIdintСмена (дневной отчёт)
· ShiftOrderIdintНомер транзакции в рамках смены
Пример
GET http://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "ServiceReceipt": {
    "Amount": 500.00,
    "CashInDrawer": 500.00,
    "Date": "/Date(1692792000000+0300)/",
    "MEVDate": "/Date(1692792004000+0300)/",
    "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90",
    "MEVResponse": "",
    "TaskId": 45,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 0
  }
}

Зарегистрированный X- или Z-отчёт

GEThttp://localhost:9203/fpservice/json/GetReport?transactionId=55

Возвращает цифры дневного отчёта: итоги по ставкам НДС и типам оплат, наличность и, для Z, итоги с начала года. Если транзакция не отчёт — ошибка 43.

Параметры запроса
ПолеТипОписание
transactionIdint (query)TaskId транзакции — полученный при регистрации или из GetTransactions
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
ReportReportОтчёт; поля ниже
· ReportTypeint / enum1 — Z (RaportZ), 2 — X (RaportX)
· TotaldecimalОбщий дневной оборот
· TotalUntaxeddecimalНеоблагаемый дневной оборот
· TaxdecimalОбщий дневной НДС
· TotalBillintКоличество фискальных чеков
· LastBillNumberintНомер последнего фискального чека
· TaxesReceiptTax[]По ставкам НДС: Code, Percent, Amount (сумма НДС), Brut (сумма с НДС)
· PaymentsReportPayment[]По типам оплат: Code (имя типа, напр. NUMERAR), Amount
· PaymentReceiptsTaxes, PaymentReceiptsPaymentsТе же итоги для платёжных квитанций
· CashIn, CashOutdecimalВнесённые и изъятые наличные за смену
· BalancedecimalОстаток наличных в ящике
· TotalYear, TotalYearTaxdecimalОборот и НДС с начала года; только в Z-отчёте
· DatedatetimeМомент выполнения (печати) транзакции
· MEVDatedatetime?Дата регистрации в MEV; null, если ещё не передана
· MEVIDstringИдентификатор, присвоенный MEV
· MEVResponsestringОтвет MEV при регистрации
· TaskIdintНомер транзакции в очереди сервиса
· ShiftIdintСмена (дневной отчёт)
· ShiftOrderIdintНомер транзакции в рамках смены
Пример
GET http://localhost:9203/fpservice/json/GetReport?transactionId=55
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Report": {
    "ReportType": 1,
    "Total": 65.73,
    "TotalUntaxed": 0.00,
    "Tax": 10.96,
    "TotalBill": 1,
    "LastBillNumber": 1,
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "Payments": [{ "Code": "NUMERAR", "Amount": 65.73 }],
    "PaymentReceiptsTaxes": [],
    "PaymentReceiptsPayments": [],
    "CashIn": 500.00,
    "CashOut": 0.00,
    "Balance": 565.73,
    "TotalYear": 184250.40,
    "TotalYearTax": 30708.40,
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 55,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 3
  }
}

Изображение транзакции

GEThttp://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46

Возвращает печатный макет любой транзакции как HTML-страницу (ширина 57 мм, изображения встроены) в кодировке Base64. Удобно для показа чека на экране или отправки клиенту. Если транзакции нет — ошибка 43.

Параметры запроса
ПолеТипОписание
transactionIdint (query)TaskId транзакции — полученный при регистрации или из GetTransactions
Ответ
ПолеТипОписание
ErrorCodeint / enumКод ошибки; 0 (OK) — метод выполнен без ошибок. См. коды ошибок.
ErrorMessagestringПояснительное сообщение об ошибке
TemplatestringHTML в кодировке Base64
Пример
GET http://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Template": "PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+..."
}

Типы оплат

Значение поля Payments[].Code. Названия — из классификации MEV, так они печатаются на чеке.

КодMEVОписаниеДопускается в
1NUMERARналичныевсе
2CARDбанковская картавсе
3.1VAUCHERваучервсе
3.2CEC (CERTIFICAT VALORIC)подарочный сертификатвсе
3.3TICHETдокумент с заранее установленной стоимостью в леяхвсе
5TMEэлектронный талон на питаниеACPS; ACPSPPGL — только в чеках без топлива
6ABONAMENTабонементвсе
7ALT TIPдругой типвсе
8.1CreditкредитACPS (MEV v2), ACPSPPGL
8.2LeasingлизингACPS (MEV v2), ACPSPPGL
8.3AvansавансACPS (MEV v2), ACPSPPGL
8.4ArvunaзадатокACPS (MEV v2), ACPSPPGL
8.5GajзалогACPS (MEV v2), ACPSPPGL

Вид деятельности кассы — в GetServiceState → ActivityType. На АЗС (ACPPGL) допускаются только коды с пометкой «все». Недопустимый код — ошибка 28.

Коды ошибок

Значения поля ErrorCode, возвращаемые всеми методами.

КодИмяЗначение
Сервис
0OKметод выполнен без ошибок
1ServiceUnknownInternalErrorнеизвестная внутренняя ошибка сервиса
2ServiceDatabaseNotRespondingбаза данных сервиса недоступна
3ServiceDatabaseCorruptedбаза данных сервиса повреждена
4ServiceSignatureInvalidцифровая подпись сервиса недействительна
5ServiceNotConfiguredсервис не настроен или настроен неверно
6ServiceActivationCancelledрегистрация сервиса в MEV аннулирована
7ServiceInvalidDateTimeневерно настроены часы компьютера, где работает сервис
8ServiceCloudSyncErrorошибка синхронизации транзакций с ISFiscalCloud и/или MEV
9ServiceDailyReportRequiredнеобходима печать дневного отчёта с закрытием (Z)
10ServiceDailyReportPrintingвыполняется печать дневного отчёта с закрытием
11ServiceCloudConnectionErrorошибка подключения к ISFiscalCloud (только в конфигурации с запретом оффлайн)
12ServiceCloudTimeoutErrorпревышено время ожидания ответа ISFiscalCloud (только в конфигурации с запретом оффлайн)
13ServicePaymentReceiptRangeNotSetнет связи с MEV сверх оффлайн-лимита, а диапазон номеров платёжных квитанций не задан или исчерпан
14ServiceSMSNotConfiguredв запросе есть ClientPhone, но отправка SMS в сервисе не настроена
15ServiceEmailNotConfiguredв запросе есть ClientEmail, но отправка e-mail в сервисе не настроена
16ServiceTaskProcessingв данный момент регистрируется чек или отчёт, приём нового чека временно невозможен — повторите запрос через несколько секунд
Формат запроса
20FormatBillDoesNotContainLinesчек не содержит товаров
21FormatBillDoesNotContainPaymentsчек не содержит оплат
22FormatIncorrectProductNameневерное или пустое наименование товара
23FormatIncorrectQuantityневерное количество
24FormatIncorrectAmountневерная сумма
25FormatIncorrectPriceневерная цена
26FormatUnknownUnitнеизвестная или недопустимая единица измерения
27FormatUnknownVATнеизвестная ставка НДС
28FormatUnknownPaymentнеизвестный код оплаты
29FormatUnknownDepartmentнеизвестное подразделение
30FormatPhoneNumberMissingне указан телефон (нужен при DisplayType = 2)
31FormatEmailMissingне указан e-mail (нужен при DisplayType = 3)
Обработка
40ProcessingInsufficientFundsInBoxнедостаточно наличных в денежном ящике
41ProcessingInsufficientPaymentAmountсумма оплат меньше суммы товаров
42ProcessingChangeCanNotBeCalculatedсдача не может быть рассчитана
43ProcessingTaskNotFoundзадача не найдена
44ProcessingTaskFinishedзадача уже завершена
45ProcessingIllegalCommandнедопустимая команда в текущем состоянии
46ProcessingTaskExistsчек с таким Uid уже существует; ответ содержит его TaskId
Принтер
61PrinterNotFoundпринтер не найден
62PrinterUnavailableпринтер недоступен
63PrinterOfflineпринтер в режиме оффлайн
64PrinterHasJobsInQueueв очереди принтера есть невыполненные задачи
65PrinterIsOutOfPaperв принтере нет бумаги
Фискальная память
71FiscalMemoryNotConnectedфискальная память не подключена
72FiscalMemoryNotFiscalizedфискальная память не фискализирована
73FiscalMemoryIDReadingErrorошибка чтения идентификатора фискальной памяти
74FiscalMemoryWrongIDневерный идентификатор фискальной памяти
75FiscalMemoryReportNotWrittenотчёт не записан в фискальную память
ISFiscalService · IntelectSoft
IS
ISFiscalService
Integrator documentation
RORUEN
Guide
Overview Connection and formats Typical flow
Methods
POSTRegisterFiscalReceipt POSTRegisterServiceReceipt POSTRegisterReport POSTPrintNonFiscalText POSTPrintCopy GETPrintLastCopy GETGetServiceState GETGetReports GETGetTransactions GETGetFiscalReceipt GETGetPaymentReceipt GETGetServiceReceipt GETGetReport GETGetTransactionTemplate
Reference
Payment types Error codes

ISFiscalService API

The Windows service that prints fiscal receipts and reports issued by the point-of-sale application, records them in the electronic journal and transmits them to ISFiscalCloud and MEV.

Base URLhttp://localhost:9203/fpservice
FormatsJSON · XML
Methods14
Service version1.26.2.256

Overview

  1. A third-party point-of-sale application integrated with ISFiscalCloud runs at the store and sends sales to the ISFiscalService web service. Each receipt and report gets a unique sequence number and a QR code on save, is printed on the fiscal or POS printer.
  2. Fiscal receipts, service receipts and reports are transmitted to ISFiscalCloud and to MEV at the same time — not one after the other.
  3. Any buyer holding a receipt with a QR code can verify it at freceipt.eservicii.md or mev.sfs.md, and the merchant sees their receipts in the cabinet on mev.md.

Connection and formats

The service listens locally, on the till computer, on port 9203 (changeable through the Port key in the appSettings of the service config file). Each method is available through three endpoints — the URL segment selects the format of both request and response:

FormatURLContent-Type
JSONhttp://localhost:9203/fpservice/json/{Method}application/json
XMLhttp://localhost:9203/fpservice/xml/{Method}application/xml
SOAPhttp://localhost:9203/fpservice/soap · WSDL: http://localhost:9203/fpservice?wsdltext/xml

Format differences

  • ErrorCode is a number in JSON (0) and a name in XML (OK).
  • Dates are in WCF format /Date(ms+zone)/ in JSON — milliseconds since 1970-01-01 UTC plus the offset — and ISO 8601 in XML.
  • XML requests carry the namespace http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service, with elements in alphabetical order as in the examples.

Task queue

Registration methods do not print synchronously: they queue a task and immediately return its identifiers. TaskId is the queue number, ShiftId the shift (daily report), ShiftOrderId the number within the shift, TaskUid the GUID — yours or auto-assigned.

Common transaction fields

Methods that read transactions back (Get…) return these fields in addition to their own:

FieldTypeDescription
DatedatetimeWhen the transaction was executed (printed)
MEVDatedatetime?Date registered in MEV; null if not there yet
MEVIDstringID assigned by MEV
MEVResponsestringMEV response at registration
TaskIdintTransaction number in the service queue
ShiftIdintShift (daily report)
ShiftOrderIdintTransaction number within the shift

CloudSyncWarning = true is not an error: the task was registered, but the queue holds transactions not yet sent to MEV. Check GetServiceState. If this lasts beyond the offline limit, new receipts are issued as payment receipts — see the rules.

Typical flow

  1. On application start — GetServiceState. If GeneralError is true, show the operator the cause from the state flags.

  2. At the start of the shift, if change float is needed — RegisterServiceReceipt with a positive amount.

  3. For each sale — RegisterFiscalReceipt with your own Uid. Show the QR link to the buyer. On a timeout or network error, resend the same request with the same Uid: if the receipt had gone through, you get error 46 and its TaskId, not a duplicate.

  4. If the receipt did not print (out of paper etc.) — PrintCopy by Uid, not a new registration: a repeated receipt would be a second sale in MEV.

  5. At day end — cash out (RegisterServiceReceipt with a negative amount), then the Z report (RegisterReport, CloseReport = true). 24 hours after the shift opened, the service rejects receipts until a Z report.

  6. For reconciliation — GetReports and GetTransactions give the list, and the Get… methods give each transaction as the service registered it.

Register a fiscal receipt

POSThttp://localhost:9203/fpservice/json/RegisterFiscalReceipt

Queues a fiscal receipt for printing. The response contains the MEV verification link, which must be shown to the buyer as a QR code or printed at the bottom of the receipt.

Retrying is safe. If you send a Uid that is already registered, the service does not create a second receipt: it returns ErrorCode = 46 (ProcessingTaskExists) together with the TaskId of the existing receipt. So on a timeout, resend the same request with the same Uid.

Request parameters
FieldTypeDescription
ClientEmailstringCustomer e-mail for sending a copy of the receipt. Required when DisplayType = 3.
ClientPhonestringCustomer phone for sending a copy by SMS. Required when DisplayType = 2.
DisplayTypeintHow the receipt is delivered: 0 — printed on paper (default); 1 — QR code on the customer display; 2 — SMS; 3 — e-mail
FooterTextstringFree text printed at the end of the receipt
ForcePrintboolForce printing on paper — overrides all other parameters and the fiscal module settings
HeaderTextstringFree text printed at the start of the receipt
LinesBillLine[]Receipt lines — at least one. Structure
MyDiscountUidguidCustomer identifier in the MyDiscount loyalty system
NumberstringReceipt number in the external accounting system
PaymentsBillPayment[]Receipt payments — at least one. Structure
PrinterURIstringURI of the POS printer attached to the service used for printing the receipt. Empty — the Windows default printer is used.
UidguidReceipt GUID in the external system. Empty — assigned by the service. Recommended: always send it — it makes retries safe and lets you request copies by your own ID.

Lines · BillLine

At least one line.

FieldTypeDescription
CodestringProduct code in the external system
DiscountdecimalDiscount, in lei, on the line total
MargindecimalSurcharge, in lei, on the line total
NamestringProduct name; required
PricedecimalUnit price; greater than 0
QuantitydecimalQuantity; greater than 0, up to 3 decimals
UnitCodeintUnit code per MEV classification: 1 — litres, 2 — cubic metres, 3 — non-fuel product, 0 — unspecified. Matters only at fuel stations — see the rules.
UnitNamestringUnit name
VATstringVAT rate code: a letter A–Z among those configured in the service (the list comes in GetServiceState → VATRates), or _ — no VAT. Required.

Payments · BillPayment

At least one payment. The amounts must cover the receipt — see the rules.

FieldTypeDescription
AmountdecimalPayment amount; greater than 0
BankResponsestringBank terminal response, for card payments
CodestringPayment type code — see payment types
RRNstringRRN of the bank transaction, for card payments

Validation rules

The service validates the receipt before queuing it. Some rules depend on the till's activity — the ActivityType field of GetServiceState: ACPS — retail, ACPPGL — fuel station, ACPSPPGL — fuel station with a shop.

  1. Receipt total. Line total = round(Quantity × Price, 2) − Discount + Margin; the receipt total is the sum of the lines.
  2. Payments. If payments are below the total — error 41. If above, the difference is change, and change is given from cash only (code 1): if the cash payment does not cover it — error 42.
  3. Fuel station (ACPPGL). One line and one payment. Allowed UnitCode: 0, 1, 2; 0 is recorded as litres.
  4. Fuel station with shop (ACPSPPGL). Allowed UnitCode: 0–3. Lines with 1 or 2 are fuel, 0 or 3 are goods. A receipt containing fuel has a single payment.
  5. Fuel rounding. For a receipt with a single fuel line, a difference between payment and total of up to the price of 10 ml (Price / 100) is accepted: the line total becomes the payment amount.
  6. Payment codes allowed depend on the activity — see payment types. Otherwise — error 28.
  7. Clock. If the computer time is earlier than the last registered transaction — error 7.
  8. 24-hour shift. More than 24 hours after the shift opened — error 9 until a Z report. If automatic Z is configured in the service, it runs the Z report itself and registers the receipt.
  9. No connection to MEV. If transactions not yet sent to MEV exceeded the offline limit (or the limit is 0 and the cloud does not respond), the receipt is not rejected: it is registered as a payment receipt with a series and number from the range allocated to the till (GetTransactions shows it with Type = 12, details via GetPaymentReceipt). If no range is set or it is exhausted — error 13.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
CloudSyncWarningboolAt least one task in the queue has not yet been transmitted to MEV
ShiftIdintID of the shift (daily report) the task was registered in
ShiftOrderIdintSequence number of the task within the shift
TaskIdintSequence number of the task in the fiscal service queue
TaskUidguidUnique task ID — equals the request Uid, or is assigned automatically if it was missing
QRstringLink to the MEV portal for validating the receipt. Show it as a QR code on the customer display or print it at the bottom of the receipt.
Example
POST http://localhost:9203/fpservice/json/RegisterFiscalReceipt
Content-Type: application/json

{
  "ClientEmail": "",
  "ClientPhone": "",
  "DisplayType": 0,
  "FooterText": "Thank you!",
  "ForcePrint": true,
  "HeaderText": "Operator 1",
  "Lines": [{
    "Code": "2",
    "Discount": 2.00,
    "Margin": 0.00,
    "Name": "Ext DE5",
    "Price": 31.50,
    "Quantity": 2.150,
    "UnitCode": 1,
    "UnitName": "liters",
    "VAT": "A"
  }],
  "Number": "248",
  "Payments": [{
    "Amount": 100.00,
    "BankResponse": "",
    "Code": "1",
    "RRN": ""
  }],
  "PrinterURI": "",
  "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98"
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 1,
  "TaskId": 46,
  "TaskUid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
  "QR": "https://mev.sfs.md/receipt-verifier/33C303B4706C3467CCD14EAA6662CEDE"
}
The same request in XML
POST http://localhost:9203/fpservice/xml/RegisterFiscalReceipt
Content-Type: application/xml

<RegisterFiscalReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <ClientEmail></ClientEmail>
  <ClientPhone></ClientPhone>
  <DisplayType>0</DisplayType>
  <FooterText>Thank you!</FooterText>
  <ForcePrint>true</ForcePrint>
  <HeaderText>Operator 1</HeaderText>
  <Lines>
    <BillLine>
      <Code>2</Code>
      <Discount>2.00</Discount>
      <Margin>0.00</Margin>
      <Name>Ext DE5</Name>
      <Price>31.50</Price>
      <Quantity>2.150</Quantity>
      <UnitCode>1</UnitCode>
      <UnitName>liters</UnitName>
      <VAT>A</VAT>
    </BillLine>
  </Lines>
  <Number>248</Number>
  <Payments>
    <BillPayment>
      <Amount>100.00</Amount>
      <BankResponse></BankResponse>
      <Code>1</Code>
      <RRN></RRN>
    </BillPayment>
  </Payments>
  <PrinterURI></PrinterURI>
  <Uid>2a0ce057-213b-4837-b3c7-d77c91e4661c</Uid>
</RegisterFiscalReceiptRequest>
<RegisterFiscalReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>10</ShiftId>
  <ShiftOrderId>8</ShiftOrderId>
  <TaskId>44</TaskId>
  <TaskUid>2a0ce057-213b-4837-b3c7-d77c91e4661c</TaskUid>
  <QR>https://mev.sfs.md/receipt-verifier/5CA4D2CA0450DF80FEB2A62354D75311</QR>
</RegisterFiscalReceiptResponse>

Register a service receipt

POSThttp://localhost:9203/fpservice/json/RegisterServiceReceipt

Registers a service receipt for cash in (Amount > 0) or cash out (Amount < 0). A withdrawal cannot exceed the cash in the drawer for the current shift — cash payments plus cash-ins, minus withdrawals and change given — otherwise error 40. An amount of 0 — error 24.

Request parameters
FieldTypeDescription
AmountdecimalCash-in amount; a negative value is a withdrawal
ReasonintWithdrawal reason: 0 — refund, 1 — cash collection. Accepted, but not processed by the current service version.
ForcePrintboolForce printing on paper (overrides the fiscal module settings)
PrinterURIstringURI of the POS printer attached to the service used for printing the service receipt. Empty — the Windows default printer is used.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
CloudSyncWarningboolAt least one task in the queue has not yet been transmitted to MEV
ShiftIdintID of the shift (daily report) the task was registered in
ShiftOrderIdintSequence number of the task within the shift
TaskIdintSequence number of the task in the fiscal service queue
TaskUidguidUnique task identifier (assigned automatically)
Example
POST http://localhost:9203/fpservice/json/RegisterServiceReceipt
Content-Type: application/json

{
  "Amount": 10.22,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 3,
  "TaskId": 49,
  "TaskUid": "22ebb07d-57d6-4b5b-96bd-ee6bfd9bebb6"
}
The same request in XML
POST http://localhost:9203/fpservice/xml/RegisterServiceReceipt
Content-Type: application/xml

<RegisterServiceReceiptRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <Amount>10.22</Amount>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterServiceReceiptRequest>
<RegisterServiceReceiptResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>4</ShiftOrderId>
  <TaskId>50</TaskId>
  <TaskUid>def450fe-f9d5-4aa6-a0de-e11c94774b54</TaskUid>
</RegisterServiceReceiptResponse>

Register a daily report

POSThttp://localhost:9203/fpservice/json/RegisterReport

Queues the generation and printing of the daily report: with shift closing (Z report) or without (X report). A Z report closes the current shift; if no shift was open, an empty one is opened and closed. While a previous Z is still being processed — error 10. On tills with fiscal memory, a memory error blocks the Z report but not the X report, which stays available for checking the till.

Request parameters
FieldTypeDescription
CloseReportbooltrue — closing report (Z), false — non-closing (X)
ForcePrintboolForce printing on paper. A Z report may be printed without it if the service is configured to always print Z.
PrinterURIstringURI of the POS printer attached to the service used for printing the report. Empty — the Windows default printer is used.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
CloudSyncWarningboolAt least one task in the queue has not yet been transmitted to MEV
ShiftIdintID of the shift (daily report) the task was registered in
ShiftOrderIdintSequence number of the task within the shift
TaskIdintSequence number of the task in the fiscal service queue
TaskUidguidUnique task identifier (assigned automatically)
Example
POST http://localhost:9203/fpservice/json/RegisterReport
Content-Type: application/json

{
  "CloseReport": false,
  "ForcePrint": true,
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 6,
  "TaskId": 52,
  "TaskUid": "9cc9ac78-270d-429a-9867-c386e3e29409"
}
The same request in XML
POST http://localhost:9203/fpservice/xml/RegisterReport
Content-Type: application/xml

<RegisterReportRequest xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service">
  <CloseReport>false</CloseReport>
  <ForcePrint>true</ForcePrint>
  <PrinterURI></PrinterURI>
</RegisterReportRequest>
<RegisterReportResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <CloudSyncWarning>false</CloudSyncWarning>
  <ShiftId>11</ShiftId>
  <ShiftOrderId>7</ShiftOrderId>
  <TaskId>53</TaskId>
  <TaskUid>ec76c1ba-0dc4-4685-bd8a-994d35fad2e5</TaskUid>
</RegisterReportResponse>

Print non-fiscal text

POSThttp://localhost:9203/fpservice/json/PrintNonFiscalText

Queues printing of free text for the buyer — with no fiscal value.

Request parameters
FieldTypeDescription
Linesstring[]Lines to print; at least one, otherwise error 20
PrinterURIstringURI of the POS printer attached to the service used for printing the text. Empty — the Windows default printer is used.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
CloudSyncWarningboolAt least one task in the queue has not yet been transmitted to MEV
ShiftIdintID of the shift (daily report) the task was registered in
ShiftOrderIdintSequence number of the task within the shift
TaskIdintSequence number of the task in the fiscal service queue
Example
POST http://localhost:9203/fpservice/json/PrintNonFiscalText
Content-Type: application/json

{
  "Lines": ["Acesta este un exemplu", "de bon nefiscal."],
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "CloudSyncWarning": false,
  "ShiftId": 11,
  "ShiftOrderId": 5,
  "TaskId": 63
}

Print a copy of a receipt or report

POSThttp://localhost:9203/fpservice/json/PrintCopy

Queues a reprint of a fiscal receipt, service receipt or X/Z report previously registered through this service. Non-fiscal text and copies cannot be copied. The copy is always printed on paper with the COPIE watermark and gets its own TaskId. If the transaction is not found — error 43.

Request parameters
FieldTypeDescription
TaskIdintQueue number of the task to reprint
TaskUidguidTransaction GUID — the Uid sent at registration or the TaskUid received in the response. One of TaskId or TaskUid is enough; if both are sent, TaskUid wins.
PrinterURIstringURI of the POS printer attached to the service used for printing the copy. Empty — the Windows default printer is used.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
TaskIdintSequence number of the task in the fiscal service queue
Example
POST http://localhost:9203/fpservice/json/PrintCopy
Content-Type: application/json

{
  "TaskId": 61,
  "TaskUid": "00000000-0000-0000-0000-000000000000",
  "PrinterURI": ""
}
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "TaskId": 67
}

Print a copy of the last transaction

GEThttp://localhost:9203/fpservice/json/PrintLastCopy

Queues a reprint of the last completed transaction (fiscal receipt, service receipt, X/Z report) with the COPIE watermark. No parameters. If there is no such transaction — error 43.

Request parameters

None.

Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
TaskIdintSequence number of the task in the fiscal service queue
Example
GET http://localhost:9203/fpservice/json/PrintLastCopy
<PrintCopyTaskResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <TaskId>68</TaskId>
</PrintCopyTaskResponse>

Service state

GEThttp://localhost:9203/fpservice/json/GetServiceState

Returns the current state of the fiscal service: registration numbers, recent transactions and error flags. Call it when your application starts, and before a sale if CloudSyncWarning appeared in earlier responses.

Request parameters

None.

Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
GeneralErrorboolGeneral flag. true — transactions cannot be registered right now; the flags below give the cause.
ActivityTypestringTill activity: ACPS — retail, ACPPGL — fuel station, ACPSPPGL — fuel station with shop. Determines the allowed payment codes and units.
ServiceSerialNumberstringRegistration number of the service in MEV
ServiceDateTimedatetimeCurrent service date/time (computer clock)
FiscalMemorySerialNumberstringFiscal memory serial number; empty if the till has no fiscal memory
FiscalMemoryErrorboolThe fiscal memory reports an error. Raises GeneralError.
FiscalMemoryFiscalizedboolThe fiscal memory is fiscalized
ServiceRegistrationInvalidboolMEV registration is cancelled or the device is unknown to the cloud
ServiceSignatureInvalidboolThe cloud rejected transactions because of the digital signature. Transactions are blocked.
ServiceMEVSyncErrorboolThe oldest transaction not sent to MEV exceeded the offline limit
ServiceDatabaseCorruptedboolThe service database integrity is broken. Transactions are blocked.
OfflineModeEnabledboolSome transactions have been waiting for MEV for over a minute, but the offline limit is not yet exceeded
OfflineHoursLimitintHow many hours the till may work with untransmitted transactions. 0 — offline forbidden. On tills with fiscal memory, 72 applies if unset.
FirstNotSyncedTransactionDatedatetime?Date of the oldest transaction not sent to MEV — offline time is counted from it
FirstNotSyncedTransactionNumberint?TaskId of that transaction
CurrentReportNumberint?Number of the open shift (ShiftId); null if no shift is open
CurrentReportDatedatetime?Opening date of the current shift
CurrentReport24HoursExpiredboolMore than 24 hours since the shift opened. Receipts are rejected with error 9 until a Z report.
VATRatesVATRate[]Configured VAT rates: Code (the letter used in Lines[].VAT) and Percent
…LastTransactionDate, LastTransactionMEVID, LastTransactionNumber, LastSyncedTransactionDate, ServiceDatetimeInvalid, FiscalMemoryReportNotWritten, PrinterUnavailable, PrinterHasJobsInQueue, PrinterIsOutOfPaper, CompanyState — present in the response but not filled by the current version. Do not rely on them.
Example
GET http://localhost:9203/fpservice/json/GetServiceState
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "GeneralError": false,
  "ActivityType": "ACPS",
  "ServiceSerialNumber": "AA0101000023",
  "ServiceDateTime": "/Date(1665499064440+0300)/",
  "FiscalMemorySerialNumber": "",
  "FiscalMemoryError": false,
  "FiscalMemoryFiscalized": false,
  "ServiceRegistrationInvalid": false,
  "ServiceSignatureInvalid": false,
  "ServiceMEVSyncError": false,
  "ServiceDatabaseCorrupted": false,
  "OfflineModeEnabled": false,
  "OfflineHoursLimit": 0,
  "FirstNotSyncedTransactionDate": null,
  "FirstNotSyncedTransactionNumber": null,
  "CurrentReportNumber": 37,
  "CurrentReportDate": "/Date(1665480576767+0300)/",
  "CurrentReport24HoursExpired": false,
  "VATRates": [
    { "Code": "A", "Percent": 20.00 },
    { "Code": "B", "Percent": 8.00 },
    { "Code": "C", "Percent": 0.00 }
  ]
}

List fiscal reports

GEThttp://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23

Returns the Z reports executed on the given day, in chronological order. Without a date — all of them. The open shift is appended at the end if it has receipts: without TaskId and MEVID, with Date = the request time — handy for seeing how many receipts the current shift has. Report figures — GetReport.

Request parameters
FieldTypeDescription
onDatedate (query)Day, as YYYY-MM-DD. Optional.
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
ReportsReportHeader[]Reports found; fields of each below
· DatedatetimeDate the report was registered in the fiscal module
· MEVDatedatetimeDate the report was registered in MEV
· MEVIDstringID assigned by MEV
· MEVResponsestringMEV response at registration
· ShiftIdintShift (daily report) number
· ShiftOrderIdintTask number within the shift
· TaskIdintTask number in the queue
· TaskUidguidUnique task identifier
· TotalBillintNumber of fiscal receipts in the shift
Example
GET http://localhost:9203/fpservice/json/GetReports?onDate=2023-08-23
<GetReportsResponse xmlns="http://schemas.datacontract.org/2004/07/Hardware.FiscalPrinters.Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorCode>OK</ErrorCode>
  <ErrorMessage/>
  <Reports>
    <ReportHeader>
      <Date>2023-08-23T15:19:18.853</Date>
      <MEVDate>2023-08-23T15:19:26.183</MEVDate>
      <MEVID>99f5697f-c1a4-4d86-880f-7a8f46015f50</MEVID>
      <MEVResponse i:nil="true"/>
      <ShiftId>11</ShiftId>
      <ShiftOrderId>0</ShiftOrderId>
      <TaskId>55</TaskId>
      <TaskUid>a414d8d6-1faa-428d-9758-1706266b313e</TaskUid>
      <TotalBill>0</TotalBill>
    </ReportHeader>
  </Reports>
</GetReportsResponse>

Transactions of a shift

GEThttp://localhost:9203/fpservice/json/GetTransactions?shiftID=11

Returns all transactions of the given shift in chronological order: receipts, payment receipts, service receipts, reports, copies. For details use the method matching the transaction type (GetFiscalReceipt, GetPaymentReceipt, GetServiceReceipt, GetReport).

Request parameters
FieldTypeDescription
shiftIDint (query)Shift number — ShiftId from registration responses or CurrentReportNumber from GetServiceState
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
TransactionsTransactionHeader[]Transactions; fields of each below
· Typeint / enumType: 0 fiscal receipt, 1 non-fiscal text, 2 X report, 3 Z report, 5 cash out, 6 cash in, 11 copy, 12 payment receipt. A number in JSON, a name in XML (Bill, BillNonFiscal, XReport, ZReport, WithdrawalOfFunds, SupplyWithMoney, PrintCopy, PaymentReceipt).
· TotalAmountdecimalTransaction amount
· Date, MEVDate, MEVID, MEVResponse, TaskId, ShiftOrderIdAs in the common fields. ShiftId and TaskUid are not filled here.
Example
GET http://localhost:9203/fpservice/json/GetTransactions?shiftID=11
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Transactions": [
    { "Type": 6, "TotalAmount": 500.00, "TaskId": 45, "ShiftOrderId": 0,
      "Date": "/Date(1692792000000+0300)/", "MEVDate": "/Date(1692792004000+0300)/",
      "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" },
    { "Type": 0, "TotalAmount": 65.73, "TaskId": 46, "ShiftOrderId": 1,
      "Date": "/Date(1692793158853+0300)/", "MEVDate": "/Date(1692793166183+0300)/",
      "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50", "MEVResponse": "",
      "ShiftId": 0, "TaskUid": "00000000-0000-0000-0000-000000000000" }
  ]
}

A registered fiscal receipt

GEThttp://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46

Returns the fiscal receipt as the service registered it — with effective prices, computed VAT and change. Useful for reconciling with the external system. If the transaction does not exist or is not a receipt — error 43.

Request parameters
FieldTypeDescription
transactionIdint (query)The transaction TaskId — received at registration or from GetTransactions
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
FiscalReceiptFiscalReceiptThe receipt; fields below
· DatedatetimeWhen the transaction was executed (printed)
· MEVDatedatetime?Date registered in MEV; null if not there yet
· MEVIDstringID assigned by MEV
· MEVResponsestringMEV response at registration
· TaskIdintTransaction number in the service queue
· ShiftIdintShift (daily report)
· ShiftOrderIdintTransaction number within the shift
· NumberstringNumber from the request
· UidguidReceipt Uid
· MyDiscountUid, ClientPhone,
ClientEmail, HeaderText,
FooterText
As received in the request
· LinesReceiptLine[]Lines as registered: Code, Name, UnitCode, UnitName, Quantity, Amount (quantity × price, before discount), Discount, Margin, Price (effective price after discount and surcharge) and VAT — an object with Code, Percent, Amount (VAT amount), Brut (amount incl. VAT)
· PaymentsReceiptPayment[]Code, Amount, RRN, BankResponse
· TaxesReceiptTax[]Totals per VAT rate: Code, Percent, Amount (VAT amount), Brut (amount incl. VAT)
· SubTotalAmountdecimalSubtotal, as printed on the receipt
· TotalAmountdecimalReceipt total
· DepositdecimalAmount paid (all payments)
· ChangedecimalChange given
Example
GET http://localhost:9203/fpservice/json/GetFiscalReceipt?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "FiscalReceipt": {
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 46,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

A registered payment receipt

GEThttp://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47

Returns a payment receipt — the document the service issued instead of a fiscal receipt because MEV was unreachable beyond the offline limit (see the rules). Same fields as GetFiscalReceipt, plus series and number. If the transaction is not a payment receipt — error 43.

Request parameters
FieldTypeDescription
transactionIdint (query)The transaction TaskId — received at registration or from GetTransactions
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
PaymentReceiptPaymentReceiptThe payment receipt: all FiscalReceipt fields plus the one below
· SeriaAndNumberstringSeries and number from the range allocated to the till
Example
GET http://localhost:9203/fpservice/json/GetPaymentReceipt?transactionId=47
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "PaymentReceipt": {
    "SeriaAndNumber": "AA0000125",
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": null,
    "MEVID": "",
    "MEVResponse": "",
    "TaskId": 47,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 1,
    "Number": "248",
    "Uid": "3d0f65db-9f8f-49bc-b71d-8fc014f4af98",
    "MyDiscountUid": "00000000-0000-0000-0000-000000000000",
    "ClientPhone": "",
    "ClientEmail": "",
    "HeaderText": "Operator 1",
    "FooterText": "Thank you!",
    "Lines": [{
      "Code": "2",
      "Name": "Ext DE5",
      "UnitCode": 0,
      "UnitName": "liters",
      "Quantity": 2.150,
      "Amount": 67.73,
      "Discount": 2.00,
      "Margin": 0.00,
      "Price": 30.57,
      "VAT": { "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }
    }],
    "Payments": [{ "Code": "1", "Amount": 100.00, "RRN": "", "BankResponse": "" }],
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "SubTotalAmount": 65.73,
    "TotalAmount": 65.73,
    "Deposit": 100.00,
    "Change": 34.27
  }
}

A registered service receipt

GEThttp://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45

Returns a cash-in or cash-out receipt. If the transaction is not a service receipt — error 43.

Request parameters
FieldTypeDescription
transactionIdint (query)The transaction TaskId — received at registration or from GetTransactions
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
ServiceReceiptServiceReceiptThe receipt; fields below
· AmountdecimalAmount: positive — cash in, negative — cash out
· CashInDrawerdecimalCash in the drawer after the operation
· DatedatetimeWhen the transaction was executed (printed)
· MEVDatedatetime?Date registered in MEV; null if not there yet
· MEVIDstringID assigned by MEV
· MEVResponsestringMEV response at registration
· TaskIdintTransaction number in the service queue
· ShiftIdintShift (daily report)
· ShiftOrderIdintTransaction number within the shift
Example
GET http://localhost:9203/fpservice/json/GetServiceReceipt?transactionId=45
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "ServiceReceipt": {
    "Amount": 500.00,
    "CashInDrawer": 500.00,
    "Date": "/Date(1692792000000+0300)/",
    "MEVDate": "/Date(1692792004000+0300)/",
    "MEVID": "4f1c0a2e-7d3b-4c55-9e0a-2b8d6f7e1c90",
    "MEVResponse": "",
    "TaskId": 45,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 0
  }
}

A registered X or Z report

GEThttp://localhost:9203/fpservice/json/GetReport?transactionId=55

Returns the figures of a daily report: totals per VAT rate and payment type, cash and, for Z, year-to-date totals. If the transaction is not a report — error 43.

Request parameters
FieldTypeDescription
transactionIdint (query)The transaction TaskId — received at registration or from GetTransactions
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
ReportReportThe report; fields below
· ReportTypeint / enum1 — Z (RaportZ), 2 — X (RaportX)
· TotaldecimalTotal daily turnover
· TotalUntaxeddecimalUntaxed daily turnover
· TaxdecimalTotal daily VAT
· TotalBillintNumber of fiscal receipts
· LastBillNumberintNumber of the last fiscal receipt
· TaxesReceiptTax[]Per VAT rate: Code, Percent, Amount (VAT amount), Brut (amount incl. VAT)
· PaymentsReportPayment[]Per payment type: Code (type name, e.g. NUMERAR), Amount
· PaymentReceiptsTaxes, PaymentReceiptsPaymentsThe same totals, for payment receipts
· CashIn, CashOutdecimalCash put in and taken out during the shift
· BalancedecimalCash balance in the drawer
· TotalYear, TotalYearTaxdecimalTurnover and VAT since the start of the year; Z report only
· DatedatetimeWhen the transaction was executed (printed)
· MEVDatedatetime?Date registered in MEV; null if not there yet
· MEVIDstringID assigned by MEV
· MEVResponsestringMEV response at registration
· TaskIdintTransaction number in the service queue
· ShiftIdintShift (daily report)
· ShiftOrderIdintTransaction number within the shift
Example
GET http://localhost:9203/fpservice/json/GetReport?transactionId=55
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Report": {
    "ReportType": 1,
    "Total": 65.73,
    "TotalUntaxed": 0.00,
    "Tax": 10.96,
    "TotalBill": 1,
    "LastBillNumber": 1,
    "Taxes": [{ "Code": "A", "Percent": 20.00, "Amount": 10.96, "Brut": 65.73 }],
    "Payments": [{ "Code": "NUMERAR", "Amount": 65.73 }],
    "PaymentReceiptsTaxes": [],
    "PaymentReceiptsPayments": [],
    "CashIn": 500.00,
    "CashOut": 0.00,
    "Balance": 565.73,
    "TotalYear": 184250.40,
    "TotalYearTax": 30708.40,
    "Date": "/Date(1692793158853+0300)/",
    "MEVDate": "/Date(1692793166183+0300)/",
    "MEVID": "99f5697f-c1a4-4d86-880f-7a8f46015f50",
    "MEVResponse": "",
    "TaskId": 55,
    "TaskUid": "00000000-0000-0000-0000-000000000000",
    "ShiftId": 11,
    "ShiftOrderId": 3
  }
}

Transaction image

GEThttp://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46

Returns the printed layout of any transaction as an HTML page (57 mm wide, images embedded), Base64-encoded. Useful for showing the receipt on screen or sending it to the customer. If the transaction does not exist — error 43.

Request parameters
FieldTypeDescription
transactionIdint (query)The transaction TaskId — received at registration or from GetTransactions
Response
FieldTypeDescription
ErrorCodeint / enumError code; 0 (OK) means success. See error codes.
ErrorMessagestringHuman-readable error message
TemplatestringBase64-encoded HTML
Example
GET http://localhost:9203/fpservice/json/GetTransactionTemplate?transactionId=46
{
  "ErrorCode": 0,
  "ErrorMessage": "",
  "Template": "PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+..."
}

Payment types

Value of Payments[].Code. Names follow the MEV classification and appear as such on the receipt.

CodeMEVDescriptionAllowed in
1NUMERARcashall
2CARDbank cardall
3.1VAUCHERvoucherall
3.2CEC (CERTIFICAT VALORIC)gift certificateall
3.3TICHETdocument with a preset value, in leiall
5TMEelectronic meal voucherACPS; ACPSPPGL — only on receipts without fuel
6ABONAMENTsubscriptionall
7ALT TIPother typeall
8.1CreditcreditACPS (MEV v2), ACPSPPGL
8.2LeasingleasingACPS (MEV v2), ACPSPPGL
8.3Avansadvance paymentACPS (MEV v2), ACPSPPGL
8.4ArvunadepositACPS (MEV v2), ACPSPPGL
8.5GajpledgeACPS (MEV v2), ACPSPPGL

The till activity comes in GetServiceState → ActivityType. At a fuel station (ACPPGL) only the codes marked “all” are allowed. A disallowed code — error 28.

Error codes

Values of ErrorCode returned by every method.

CodeNameMeaning
Service
0OKthe method completed successfully
1ServiceUnknownInternalErrorunknown internal service error
2ServiceDatabaseNotRespondingthe service database is not responding
3ServiceDatabaseCorruptedthe service database is corrupted
4ServiceSignatureInvalidthe service digital signature is invalid
5ServiceNotConfiguredthe service is not configured or misconfigured
6ServiceActivationCancelledthe service registration in MEV was cancelled
7ServiceInvalidDateTimethe clock of the computer running the service is wrong
8ServiceCloudSyncErrortransaction sync error with ISFiscalCloud and/or MEV
9ServiceDailyReportRequireda closing daily report (Z) is required
10ServiceDailyReportPrintingthe closing daily report is being printed
11ServiceCloudConnectionErrorcannot connect to ISFiscalCloud (offline-forbidden configuration only)
12ServiceCloudTimeoutErrorISFiscalCloud response timed out (offline-forbidden configuration only)
13ServicePaymentReceiptRangeNotSetMEV has been unreachable beyond the offline limit and the payment receipt number range is not set or exhausted
14ServiceSMSNotConfiguredthe request has ClientPhone, but SMS delivery is not configured in the service
15ServiceEmailNotConfiguredthe request has ClientEmail, but e-mail delivery is not configured in the service
16ServiceTaskProcessinga receipt or report is being registered right now; a new receipt cannot be accepted temporarily — retry in a few seconds
Request format
20FormatBillDoesNotContainLinesthe receipt has no lines
21FormatBillDoesNotContainPaymentsthe receipt has no payments
22FormatIncorrectProductNameproduct name is invalid or empty
23FormatIncorrectQuantityinvalid quantity
24FormatIncorrectAmountinvalid amount
25FormatIncorrectPriceinvalid price
26FormatUnknownUnitunknown or disallowed unit
27FormatUnknownVATunknown VAT rate
28FormatUnknownPaymentunknown payment code
29FormatUnknownDepartmentunknown department
30FormatPhoneNumberMissingphone number missing (required for DisplayType = 2)
31FormatEmailMissinge-mail missing (required for DisplayType = 3)
Processing
40ProcessingInsufficientFundsInBoxnot enough cash in the drawer
41ProcessingInsufficientPaymentAmountpayment total is lower than the goods total
42ProcessingChangeCanNotBeCalculatedchange cannot be calculated
43ProcessingTaskNotFoundtask not found
44ProcessingTaskFinishedtask already finished
45ProcessingIllegalCommandcommand not allowed in the current state
46ProcessingTaskExistsa receipt with this Uid already exists; the response carries its TaskId
Printer
61PrinterNotFoundprinter not found
62PrinterUnavailableprinter unavailable
63PrinterOfflineprinter is offline
64PrinterHasJobsInQueueprinter queue has pending jobs
65PrinterIsOutOfPaperprinter is out of paper
Fiscal memory
71FiscalMemoryNotConnectedfiscal memory not connected
72FiscalMemoryNotFiscalizedfiscal memory not fiscalized
73FiscalMemoryIDReadingErrorerror reading the fiscal memory ID
74FiscalMemoryWrongIDwrong fiscal memory ID
75FiscalMemoryReportNotWrittenreport was not written to fiscal memory
ISFiscalService · IntelectSoft