1360 lines
60 KiB
Plaintext
1360 lines
60 KiB
Plaintext
*!* 16.10.2023
|
||
*!* ExportEFactura.xmlEFactura : se pare ca la ultima versiune de verificare, cota 0 trebuie sa aiba cod de scutire sau text scutire
|
||
|
||
*!* 31.10.2023
|
||
*!* ExportEFactura.xmlEFactura : corectat eroare articol codbare
|
||
|
||
*!* 13.11.2023
|
||
*!* ParseEFactura - tratare xml CreditNote
|
||
|
||
*!* 28.11.2023
|
||
*!* TrimiteFacturi - se trateaza ExecutionStatus cu sau fara spatii
|
||
|
||
*!* 04.01.2024
|
||
*!* ExportEFactura.xmlEFactura : limitare strada adresa client la 150 caractere
|
||
*!* getXmlEFactura : nu validez xmlefactura daca plFaraValidareEFactura = .T. (din borderou efactura)
|
||
|
||
*!* 10.01.2024
|
||
*!* ExportEFactura.xmlEFactura: corectie completare strada si denumire client. S-au completat in poDate
|
||
*!* ExportEFactura.xmlEFactura: am pus la loc "adresa" in loc de "strada" la <client.streetname>
|
||
*!* AnafEFactura.SendEfactura: am pus parametrul "EXTERN=DA" pentru trimiterea facturilor cu clienti externi
|
||
|
||
*!* 15.01.2024
|
||
*!* ExportEFactura.xmlEFactura: explicatia de pe articol se sparge in primele 200 caractere pe Item.descrition si urmatoarele 300 pe InvoiceLine.note
|
||
|
||
*!* 19.01.2024
|
||
*!* ParseEFactura : am tratat fisierele fara cbc, cac; am tratat invoice.note._nodetext_
|
||
|
||
*!* 23.01.2024
|
||
*!* RaspunsuriFactura : se apeleza endpoint-ul cu paginatie, in caz ca sunt mai mult de 500 de raspunsuri
|
||
|
||
*!* 26.01.2024
|
||
*!* ExportEFactura.xmlEFactura: limitare la 300 caractere invoice.note
|
||
|
||
*!* 30.01.2024
|
||
*!* ExportEFactura.xmlEFactura: cumulare discount pe cote TVA
|
||
|
||
*!* 06.03.2024
|
||
*!* ParseEFactura: extragere TotalTVARON, articol (codCPV, codNC8, codBare, codFurnizor, codClient)
|
||
|
||
|
||
*!* 08.03.2024
|
||
*!* ExportEFactura.xmlEFactura: se completeaza AllowanceCharge la nivel de Invoice.InvoiceLine si Invoice.InvoiceLine.Item.Price
|
||
*!* daca optiunile gnEFACTURA_XML_DISC_PLISTA_LINIE si gnEFACTURA_XML_DISC_PLISTA_ART = 1
|
||
|
||
*!* 08.03.2024
|
||
*!* ExportEFactura.xmlEFactura: se completeaza Invoice.Id cu seria + nr factura, Invoice.Note cu cursul valutar
|
||
|
||
*!* 29.03.2024
|
||
*!* ExportEFactura.xmlEFactura: Se completeaza corect codul taxa pentru operatiile scutite
|
||
|
||
*!* 10.04.2024
|
||
*!* ExportEFactura.xmlEFactura - nu este permis pret negativ. se shimba semnul intre cantitate si pret
|
||
|
||
*!* 02.07.2024
|
||
*!* xmlEFactura - limitare detalii la 4000 caractere
|
||
|
||
*!* 04.07.2024
|
||
*!* xmlEFactura - salvare raspunsuri facturi primite/trimise intr-un director comun
|
||
|
||
*!* 15.07.2024
|
||
*!* xmlEFactura - 10 conturi bancare din datele firmei la modalitati de plata, in loc de 3 conturi bancare
|
||
|
||
*!* 07.08.2024
|
||
*!* xmlEFactura - Atasamente inglobate in xml
|
||
*!* xmlEFactura - completare registrul comertului in BT-46 (client si furnizor)
|
||
*!* xmlEFactura - completare capital social subscris si varsat in BT-33
|
||
|
||
*!* 08.08.2024
|
||
*!* xmlEFactura - Furnizor.StreetName = strada si numar
|
||
|
||
*!* 28.10.2024
|
||
*!* xmlEFactura - GetTipTaxa - completare explicatia TVA la motivul scutirii TVA, cota 0%
|
||
|
||
*!* 06.12.2024
|
||
*!* getXmlEFactura - xml efactura clienti persoane fizice fara cod fiscal - se completeaza Customer.Party.PartyLegalEntity.CompanyId cu 13 zero
|
||
|
||
*!* 13.03.2026
|
||
*!* ValidareEFacturaANAF - folosire validare oauth daca exista token
|
||
|
||
* DO TestValidareEFactura
|
||
#define precizie_max_pret_vz 6
|
||
#define precizie_max_pret_ach 6
|
||
|
||
Do TestParseEFactura
|
||
|
||
Procedure getXmlEFactura
|
||
Lparameters toDateFactura, tcCursorLiniiFactura, tlSilentios, tcFisierXML, tcMesaj
|
||
* tcFisierXML OUT
|
||
* tcMesaj OUT pentru cazu in care generarea xml este silentioasa
|
||
|
||
Local loEFactura As "ExportEFactura"
|
||
Local lcFisierXML, llOk, loInfo, llValidareOnline, lcToken
|
||
|
||
llOk = .F.
|
||
lcMesaj = ''
|
||
lcFisierXML = ''
|
||
lcToken = ''
|
||
|
||
loInfo = Createobject("empty")
|
||
AddProperty(loInfo, 'lOk', m.llOk)
|
||
AddProperty(loInfo, 'cFile', m.lcFisierXML)
|
||
AddProperty(loInfo, 'cMesaj', m.lcMesaj)
|
||
|
||
IF TYPE('pcTokenEfactura') = 'C' AND !EMPTY(m.pcTokenEfactura)
|
||
lcToken = m.pcTokenEfactura
|
||
ENDIF
|
||
|
||
loEFactura = Createobject("ExportEFactura", m.tlSilentios, m.lcToken)
|
||
lcFisierXML = loEFactura.xmlEFactura(toDateFactura, tcCursorLiniiFactura)
|
||
loInfo.cFile = Iif(Type('lcFisierXml') = 'C', m.lcFisierXML, '')
|
||
|
||
* Daca nu validez eFactura
|
||
llFaraValidare = .F.
|
||
If Type('plFaraValidareEFactura') = 'L'
|
||
* Definesc plFaraValidareEFactura pentru a suprascrie parametrul la momentul listarii (in borderoul eFactura)
|
||
llFaraValidare = m.plFaraValidareEFactura
|
||
ENDIF
|
||
|
||
|
||
If !m.llFaraValidare AND !Empty(m.lcFisierXML) And File(m.lcFisierXML)
|
||
|
||
* gnEFACTURA_VALIDARE_ONLINE optiune globala
|
||
llValidareOnline = Iif(Type('gnEFACTURA_VALIDARE_ONLINE') = 'N', (m.gnEFACTURA_VALIDARE_ONLINE = 1), .F.)
|
||
|
||
* Definesc plValidareEfacturaOnline pentru a suprascrie parametrul la momentul listarii (in borderoul eFactura)
|
||
If Type('plValidareEfacturaOnline') = 'L'
|
||
llValidareOnline = m.plValidareEfacturaOnline
|
||
Endif
|
||
llOk = loEFactura.ValidareEFactura(m.lcFisierXML, @lcMesaj, m.llValidareOnline)
|
||
loInfo.lOk = m.llOk
|
||
loInfo.cMesaj = m.lcMesaj
|
||
ENDIF
|
||
|
||
* Daca nu trebuie sa validez, intorc SUCCES
|
||
IF m.llFaraValidare
|
||
loInfo.lOk = .T.
|
||
ENDIF
|
||
|
||
Return m.loInfo
|
||
Endproc && xmlEFactura
|
||
|
||
Define Class ExportEFactura As Custom
|
||
lSilentios = .F.
|
||
cToken = '' && token eFactura, din anaf_efactura.prg
|
||
|
||
Procedure Init
|
||
Lparameters tlSilentios, tcToken
|
||
This.lSilentios = m.tlSilentios
|
||
|
||
IF TYPE('tcToken') = 'C' AND !EMPTY(m.tcToken)
|
||
This.cToken = m.tcToken
|
||
ENDIF
|
||
Endproc && Init
|
||
*
|
||
Procedure xmlEFactura
|
||
Lparameters toDateFactura, tcCursorLiniiFactura
|
||
* toDateFactura = obiect cu capul facturii
|
||
* tcCursorLiniiFactura = cursor cu liniile facturii, asa cum sunt la listare
|
||
|
||
Local oxml As "msxml2.DOMDocument"
|
||
Local lcBanca, lcCaleFisier, lcCodBare, lcCont, lcFileName, lcNumeClient, lcNumeFirma, lcNumeFisier
|
||
Local lcText, lcTextAditional, lcTipTVA, llSucces, llTaxareInversaSauIntracomunitar, lnCont
|
||
Local lnSucces, loClient, lFurnizorPlatitorTVA, lClientPlatitorTVA, llExtern
|
||
Local lcExplicatie, lcLocalitateBuc, lcMotiv, lcTextDescriere, lcTextNota, lcTip, lnDiscftva
|
||
Local lnPretftva, lnPretftvai, lnProcDisc, lnProcTva, lnValDisc, lnValftva, lnValftvai, loRec
|
||
Local laFiles[1], lcDir, lcExtensie, lcFacturaFile, lcFile, lcMimeType, lcScheletonFile, lcSerieAct
|
||
Local ldDataFactura, lnFile, lnFiles, lnNumarFactura, lcText
|
||
*:Global oAdditionalDocumentReference, oAttachment
|
||
|
||
*:Global oAllowance, oBaseAmount
|
||
|
||
*:Global agettipcota[1], maccize, mcodfiscal, mcodjudet, mcomanda, mdensoc, mdiscounturi, mincasat
|
||
*:Global minf_suplm, minvoicetype, mlinii, mliniireducere, mliniistornare, mmoneda, mnrliniiavans
|
||
*:Global mprefix, msector, msufix, mtara, mtipfactura, mtiptert, mtiptvacurent, mtotalallowances
|
||
*:Global mtotalbrut, mtotalcharges, mtotalnet, mtotalnetliniifactura, mtotaltva, mtvai, mtvatotal
|
||
*:Global mum, oPayeeFinancialAccount, oPayeeFinancialAccountId, oPayeeFinancialAccountName
|
||
*:Global oPaymentMeans, oPaymentMeansCode, oadresa, oadresalivrare, oadresas, oallowancecharge
|
||
*:Global oamount, obuyeritem, oclassificationcodbare, oclassificationlot, oclassificationnc
|
||
*:Global oclassificationstandardidnc, ocodbare, ocontact, ocontacts, ocontractreference, ocustomer
|
||
*:Global odelivery, odeliverylocation, odocallowancecharge, oendpointid, oformalegala, oformalegalas
|
||
*:Global oidentificatorformalegala, oidentificatorformalegalas, oidparty, oidpartys, oidstandard
|
||
*:Global oinvoice, oinvoiceline, oitem, oitemamount, oitemprice, oitemtaxcategory, oitemtaxscheme
|
||
*:Global olot, omonetarytotal, oorderreference, oparty, opartyidentification, opartyidentifications
|
||
*:Global opartys, oschemataxe, oschemataxes, oselleritem, ostandarditem, osubtotal, osubtotaltaxa
|
||
*:Global osupplier, otara, otaralivrare, otaras, otaxablesubtotal, otaxcategoryallowance
|
||
*:Global otaxcategorycharge, otaxcategorytotals, otaxe, otaxes, otaxschemeallowance
|
||
*:Global otaxschemetotals, otaxtotal, ototal, ototalbrut, ototaldeduceri, ototalincasat, ototalnet
|
||
*:Global ototalnetfaratva, ototalplata, ototaltaxe, oum
|
||
|
||
If !(Type('toDateFactura.nract') = 'N' And Type('tcCursorLiniiFactura') = 'C' And !Empty(m.tcCursorLiniiFactura) And Used(m.tcCursorLiniiFactura))
|
||
AMESSAGEBOX('Apelati exportul xml EFactura cu parametrii (DateFactura, CursorFactura)!', 0 + 48, _Screen.Caption)
|
||
Return ''
|
||
Endif
|
||
|
||
Local lcSelect, llRectificativa, tcNumeFisier, tcCaleFacturi, loDate, llInstitutiePublica
|
||
lcSelect = Select()
|
||
|
||
loDate = toDateFactura
|
||
*!* lcTipTVA = Upper(Nvl(citeste_optiune('D394_TIP'), 'LUNAR'))
|
||
*!* lcTipTVA = Iif(!Inlist(m.lcTipTVA, 'LUNAR', 'TRIMESTRIAL', 'SEMESTRIAL', 'ANUAL'), 'LUNAR', m.lcTipTVA)
|
||
|
||
* Factura rectificativa
|
||
llRectificativa = Iif(Type('loDate.nRectificativa') = 'N', (loDate.nRectificativa = 1), .F.)
|
||
llRectificativa = m.llRectificativa Or Iif(Type('loDate.tip_saft') = 'N', (loDate.tip_saft = 384), .F.)
|
||
|
||
* Institutie publica - se folosesc coduri articole CPV sau NC8
|
||
llInstitutiePublica = Iif(Type('loDate.institutie_publica') = 'N', (loDate.institutie_publica = 1), .F.)
|
||
|
||
maccize = 0
|
||
mliniireducere = 0
|
||
mtotalcharges = 0
|
||
mtotalallowances = 0
|
||
mtvai = 0
|
||
mincasat = 0
|
||
|
||
If Type('gofirma.codfiscalfro') = 'U'
|
||
AddProperty(gofirma, 'codfiscalfro', getnrfromstring(gofirma.cod_fiscal))
|
||
Endif
|
||
lnSucces = update_jtva_coloane("JV", "cJTVAVanzariTemp", 0)
|
||
llSucces = update_um() && vnom_um
|
||
|
||
Select a.*, b.coloana_jv, ;
|
||
Iif(Left(b.coloana_jv, 2) = 'CE', 1, 0) As intracomunitar, ;
|
||
Iif(b.coloana_jv = 'ROTI', 1, 0) As taxare_inversa, ;
|
||
Iif(Inlist(b.coloana_jv, 'WRSCDD', 'WRSCFDD', 'WRN', 'FODD', 'WRSCDDAB', 'WRSCDDCD'), 1, 0) As scutit, ;
|
||
Iif('DISCOUNT' $ Upper(a.denumire) And a.pretftva < 0, 1, 0) As discount ;
|
||
From (m.tcCursorLiniiFactura) a Left Join cJTVAVanzariTemp b On a.id_jtva_coloana = b.id_jtva_coloana ;
|
||
Into Cursor C_IES_FORM Readwrite
|
||
|
||
|
||
* Nu este permis pret unitar negativ. Schimb semnul intre cantitate si pret unitar
|
||
SELECT c_ies_form
|
||
SCAN FOR pretftva < 0
|
||
REPLACE cantitate WITH -cantitate, pretftva WITH -pretftva, pretctva WITH -pretctva, pretctvai WITH -pretctvai, pretftvai WITH -pretftvai
|
||
ENDSCAN
|
||
|
||
|
||
Select(proc_tva - 1) * 100 As proc_tva, intracomunitar, taxare_inversa, scutit, expltva, ;
|
||
Sum(valtva) As tva, ;
|
||
Sum(valftva) As valoare, CAST('F' as C(5)) As tip, Replicate(' ', 100) As explicatie, Replicate(' ', 100) As motiv ;
|
||
From C_IES_FORM ;
|
||
Group By proc_tva, intracomunitar, taxare_inversa, scutit, expltva ;
|
||
Into Cursor C_TVA_FACTURA ;
|
||
Readwrite
|
||
|
||
Select C_TVA_FACTURA
|
||
Sum tva To mtotaltva
|
||
Index On proc_tva Tag procent
|
||
|
||
loClient = loDate.oClient
|
||
loClient.cod_tara = ALLTRIM(NVL(loClient.cod_tara,''))
|
||
IF EMPTY(loClient.cod_tara)
|
||
loClient.cod_tara = 'RO'
|
||
ENDIF
|
||
|
||
llExtern = (loClient.cod_tara <> 'RO')
|
||
lFurnizorPlatitorTVA = (LEFT(UPPER(ALLTRIM(goFirma.cod_fiscal)),2) = 'RO')
|
||
lClientPlatitorTVA = (LEFT(UPPER(ALLTRIM(loClient.cod_fiscal)),2) = 'RO')
|
||
|
||
mcomanda = ""
|
||
mincasat = 0
|
||
mmoneda = Iif(loDate.in_valuta = 0, 'RON', Iif(!Empty(Nvl(loDate.cValuta, '')), Upper(Alltrim(loDate.cValuta)), 'RON'))
|
||
mmoneda = Iif(mmoneda = 'EURO', 'EUR', mmoneda)
|
||
|
||
*!* mcodfiscal = Alltrim(Nvl(loClient.cod_fiscal, ''))
|
||
mtipfactura = loDate.tip_doc_394 && 'F', 'S', 'M', 'U', 'H'
|
||
*!* mtara = Alltrim(Nvl(loClient.cod_tara, 'RO'))
|
||
*!* mtiptert = Iif(loClient.id_cetatenie = 1, '', Iif(loClient.id_cetatenie = 2, 'I', 'E')) && 1 = RO, 2 = UE, 3 = NON-UE
|
||
*!* mtiptvacurent = Iif(m.lcTipTVA = 'LUNAR', 1, Iif(m.lcTipTVA = 'TRIMESTRIAL', 2, 1)) && 1 = lunar, 2 = trimestrial, 3 = anulare TVA
|
||
mtvai = loDate.tva_incasare
|
||
minf_suplm = ''
|
||
If !Inlist(mtipfactura, 'F', 'S', 'M', 'U', 'H')
|
||
AMESSAGEBOX( "Pentru acest document nu se genereaza factura electronica momentan.", 64, "Atentie...")
|
||
Return ''
|
||
Endif
|
||
* discount-ul are valoare negativa, il inmultesc cu -1
|
||
Select C_IES_FORM
|
||
Calculate Cnt(), Sum(-1 * valftva) For discount = 1 To mliniireducere, mdiscounturi
|
||
Calculate Cnt() For cantitate < 0 To mliniistornare
|
||
mlinii = Reccount('C_IES_FORM')
|
||
mnrliniiavans = 0 && 419
|
||
mtotalallowances = 0
|
||
mtotalallowances = mtotalallowances + mdiscounturi
|
||
Select C_IES_FORM
|
||
Locate For taxare_inversa = 1 Or intracomunitar = 1
|
||
llTaxareInversaSauIntracomunitar = Found()
|
||
|
||
* nomenclator 5305: S=Standard rate,Z=Zero rated goods,E=Exempt from tax,AE=VAT Reverse charge,K=VAT exempt for EEA intra-community supply of goods and services,G=Free export item, tax not charged,O=Service outside scope of tax,L=Canary Islands general indirect tax,M=Tax for production, services and importation in Ceuta and Melilla
|
||
Select C_TVA_FACTURA
|
||
SCAN
|
||
SCATTER NAME loRec
|
||
lcExplicatie = ''
|
||
lcMotiv = ''
|
||
lcTip = This.GetTipTaxa(mtipfactura, loRec.intracomunitar, loRec.taxare_inversa, loRec.scutit, loRec.proc_tva, @lcExplicatie, @lcMotiv, loRec.expltva)
|
||
REPLACE tip WITH m.lcTip, explicatie WITH m.lcExplicatie, motiv WITH m.lcMotiv
|
||
|
||
*!* Do Case
|
||
*!* Case intracomunitar = 1
|
||
*!* Replace tip With 'K', explicatie With 'Livrare intracomunitara', motiv With 'VATEX-EU-IC'
|
||
*!* Case taxare_inversa = 1
|
||
*!* Replace tip With 'AE', explicatie With 'Taxare inversa', motiv With 'VATEX-EU-AE'
|
||
*!* Case scutit = 1
|
||
*!* Replace tip With 'E', explicatie With 'Scutit cu drept de deducere'
|
||
*!* Case mtipfactura = 'F' And proc_tva = 0
|
||
*!* Replace tip With 'Z'
|
||
*!* Case mtipfactura = 'H'
|
||
*!* Replace tip With 'E', explicatie With 'Bunuri second-hand', motiv With 'VATEX-EU-F'
|
||
*!* Case mtipfactura = 'U'
|
||
*!* Replace tip With 'E', explicatie With 'Regim special agentii de turism', motiv With 'VATEX-EU-D'
|
||
*!* Otherwise
|
||
*!* Replace tip With 'S'
|
||
*!* Endcase
|
||
Endscan
|
||
|
||
* Nu am accize. Introduc o linie cu valoare 0
|
||
* Nu mai introduc o linie cu cota TVA = 0, pentru ca daca am penalitati cu cota TVA = 0, se duplica liniile cu cota TVA = 0
|
||
*Insert Into C_TVA_FACTURA (proc_tva, tva, valoare, tip, explicatie, motiv) Values (0, 0, maccize, 'Z', 'Acciza', '')
|
||
|
||
oxml = Createobject("msxml2.DOMDocument")
|
||
oxml.appendchild(oxml.createnode("PROCESSINGINSTRUCTION", "xml", ""))
|
||
oinvoice = oxml.appendchild(oxml.createelement("Invoice"))
|
||
oinvoice.setattribute("xmlns:cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")
|
||
oinvoice.setattribute("xmlns:udt", "urn:oasis:names:specification:ubl:schema:xsd:UnqualifiedDataTypes-2")
|
||
oinvoice.setattribute("xmlns:cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
|
||
oinvoice.setattribute("xmlns:ccts", "urn:un:unece:uncefact:documentation:2")
|
||
oinvoice.setattribute("xmlns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")
|
||
oinvoice.setattribute("xmlns:qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDataTypes-2")
|
||
oinvoice.setattribute("xsi:schemaLocation", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd")
|
||
oinvoice.setattribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
|
||
oinvoice.appendchild(oxml.createelement("cbc:UBLVersionID"))
|
||
oinvoice.lastchild.Text = "2.1"
|
||
oinvoice.appendchild(oxml.createelement("cbc:CustomizationID"))
|
||
oinvoice.lastchild.Text = "urn:cen.eu:en16931:2017#compliant#urn:efactura.mfinante.ro:CIUS-RO:1.0.1"
|
||
oinvoice.appendchild(oxml.createelement("cbc:ID"))
|
||
lcSerieAct = UPPER(Alltrim(XmlSpecialCharacters(RemoveCharacters(loDate.serie_act, .T.))))
|
||
oinvoice.lastchild.Text = m.lcSerieAct + IIF(!EMPTY(m.lcSerieAct), ' ', '') + Alltrim(Str(loDate.nract, 30, 0))
|
||
oinvoice.appendchild(oxml.createelement("cbc:IssueDate"))
|
||
oinvoice.lastchild.Text = Alltrim(Str(Year(loDate.dataact))) + "-" + Padl(Alltrim(Str(Month(loDate.dataact))), 2, "0") + "-" + Padl(Alltrim(Str(Day(loDate.dataact))), 2, "0")
|
||
If !Empty(Nvl(loDate.datascad, {}))
|
||
oinvoice.appendchild(oxml.createelement("cbc:DueDate"))
|
||
oinvoice.lastchild.Text = Alltrim(Str(Year(loDate.datascad))) + "-" + Padl(Alltrim(Str(Month(loDate.datascad))), 2, "0") + "-" + Padl(Alltrim(Str(Day(loDate.datascad))), 2, "0")
|
||
Endif
|
||
minvoicetype = ""
|
||
|
||
If Type('loDate.tip_saft') = 'N' And !Empty(Nvl(loDate.tip_saft, 0))
|
||
minvoicetype = Alltrim(Str(loDate.tip_saft))
|
||
Else
|
||
Do Case
|
||
Case m.llRectificativa
|
||
minvoicetype = "384"
|
||
Case Alltrim(getnrfromstring(loClient.cod_fiscal)) == Alltrim(gofirma.codfiscalfro)
|
||
minvoicetype = "389"
|
||
Case mliniistornare = mlinii
|
||
minvoicetype = "380"
|
||
Otherwise
|
||
minvoicetype = "380"
|
||
Endcase
|
||
Endif
|
||
oinvoice.appendchild(oxml.createelement("cbc:InvoiceTypeCode"))
|
||
oinvoice.lastchild.Text = minvoicetype
|
||
|
||
lcTextAditional = Alltrim(Nvl(loDate.text_aditional, ''))
|
||
If mtvai = 1
|
||
lcTextAditional = m.lcTextAditional + Iif(!Empty(m.lcTextAditional), ' # ', '') + "TVA la incasare"
|
||
Endif
|
||
If m.llTaxareInversaSauIntracomunitar
|
||
lcTextAditional = m.lcTextAditional + Iif(!Empty(m.lcTextAditional), ' # ', '') + "Taxare inversa"
|
||
ENDIF
|
||
|
||
IF !EMPTY(NVL(loDate.curs,0)) AND ATC('curs', m.lcTextAditional) = 0
|
||
lcTextAditional = m.lcTextAditional + Iif(!Empty(m.lcTextAditional), ' # ', '') + "Curs: " + ALLTRIM(STR(loDate.curs, 10,4)) + " RON/" + STRTRAN(ALLTRIM(Nvl(loDate.cValuta, '')),'EURO', 'EUR',1,1,1)
|
||
ENDIF
|
||
|
||
If !Empty(m.lcTextAditional)
|
||
oinvoice.appendchild(oxml.createelement("cbc:Note"))
|
||
lcText = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(m.lcTextAditional, .T.)), 300))
|
||
oinvoice.lastchild.Text = m.lcText
|
||
Endif
|
||
oinvoice.appendchild(oxml.createelement("cbc:DocumentCurrencyCode"))
|
||
If loDate.in_valuta = 1
|
||
oinvoice.lastchild.Text = m.mmoneda
|
||
Else
|
||
oinvoice.lastchild.Text = "RON"
|
||
Endif
|
||
oinvoice.appendchild(oxml.createelement("cbc:TaxCurrencyCode"))
|
||
oinvoice.lastchild.Text = "RON"
|
||
If loDate.tip = 3 And !Empty(Nvl(loDate.descriere, ''))
|
||
oorderreference = oinvoice.appendchild(oxml.createelement("cac:OrderReference"))
|
||
oorderreference.appendchild(oxml.createelement("cbc:ID"))
|
||
oorderreference.lastchild.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(loDate.descriere, .T.)), 100))
|
||
|
||
Endif
|
||
If !Empty(Nvl(loDate.contract, ''))
|
||
ocontractreference = oinvoice.appendchild(oxml.createelement("cac:ContractDocumentReference"))
|
||
ocontractreference.appendchild(oxml.createelement("cbc:ID"))
|
||
ocontractreference.lastchild.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(loDate.contract, .T.)), 100))
|
||
ENDIF
|
||
|
||
* Atasamente inglobate in xml
|
||
IF TYPE('pnAtasamenteEfactura') = 'N' AND m.pnAtasamenteEfactura > 0
|
||
* pnAtasamente = 0: nimic, 1 : factura, 2: toate inclusiv factura, 3: toate fara factura
|
||
ldDataFactura = loDate.dataact
|
||
lnNumarFactura = loDate.nract
|
||
lcFacturaFile = GetPDFFacturaFile(m.ldDataFactura, m.lnNumarFactura) && d:\roa\pdf\20200402_12346_factura.pdf
|
||
lcScheletonFile = Strtran(lcFacturaFile, 'factura', '*', 1, 10, 1) && d:\roa\pdf\20200402_12346_*.pdf (_recapitulatia.pdf, _situatie_stationare.pdf, _declaratie_comandant.pdf)
|
||
lcDir = Addbs(Justpath(m.lcFacturaFile))
|
||
lnFiles = Adir(laFiles, m.lcScheletonFile)
|
||
For lnFile = 1 To m.lnFiles
|
||
lcFileName = laFiles[m.lnFile, 1]
|
||
lcFile = m.lcDir + laFiles[m.lnFile, 1]
|
||
IF !FILE(m.lcFile)
|
||
LOOP
|
||
ENDIF
|
||
IF (m.pnAtasamenteEfactura = 1 AND '_factura'$ LOWER(m.lcFileName)) OR m.pnAtasamenteEfactura = 2 OR (m.pnAtasamenteEfactura = 3 AND !'_factura'$ LOWER(m.lcFileName))
|
||
oAdditionalDocumentReference = oinvoice.appendchild(oxml.createelement("cac:AdditionalDocumentReference"))
|
||
oAdditionalDocumentReference.appendchild(oxml.createelement("cbc:ID"))
|
||
oAdditionalDocumentReference.lastchild.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(m.lcFileName, .T.)), 50))
|
||
oAdditionalDocumentReference.appendchild(oxml.createelement("cbc:DocumentDescription"))
|
||
oAdditionalDocumentReference.lastchild.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(m.lcFileName, .T.)), 50))
|
||
oAttachment = oAdditionalDocumentReference.appendchild(oxml.createelement("cac:Attachment"))
|
||
oEmbeddedDocumentBinaryObject = oAttachment.appendchild(oxml.createelement("cbc:EmbeddedDocumentBinaryObject"))
|
||
lcExtensie = LOWER(JUSTEXT(m.lcFileName))
|
||
lcMimeType = GetMimeType(m.lcExtensie) && wwutils.prg
|
||
oEmbeddedDocumentBinaryObject.setattribute("mimeCode", m.lcMimeType)
|
||
oEmbeddedDocumentBinaryObject.setattribute("filename", m.lcFileName)
|
||
oEmbeddedDocumentBinaryObject.Text = STRCONV(FILETOSTR(m.lcFile),13)
|
||
ENDIF
|
||
Endfor
|
||
ENDIF && Type(pnAtasamenteEfactura)
|
||
|
||
|
||
osupplier = oinvoice.appendchild(oxml.createelement("cac:AccountingSupplierParty"))
|
||
oparty = osupplier.appendchild(oxml.createelement("cac:Party"))
|
||
If Empty(Nvl(gofirma.email, ''))
|
||
AMESSAGEBOX( ;
|
||
"Completati adresa de email a societatii in datele firmei." + ;
|
||
Chr(13) + ;
|
||
"Aceasta este necesara pentru primirea raspunsului facturii electronice.", ;
|
||
48, ;
|
||
"Date incomplete..." ;
|
||
)
|
||
Return ''
|
||
Endif
|
||
|
||
oendpointid = oparty.appendchild(oxml.createelement("cbc:EndpointID"))
|
||
oendpointid.setattribute("schemeID", ;
|
||
"EM")
|
||
oendpointid.Text = Alltrim(gofirma.email)
|
||
|
||
lcPartyIdentification = ALLTRIM(NVL(goFirma.reg_comert, ''))
|
||
If !Empty(m.lcPartyIdentification)
|
||
opartyidentification = oparty.appendchild(oxml.createelement("cac:PartyIdentification"))
|
||
oidparty = opartyidentification.appendchild(oxml.createelement("cbc:ID")) && BT-29
|
||
oidparty.Text = m.lcPartyIdentification
|
||
Endif
|
||
oadresa = oparty.appendchild(oxml.createelement("cac:PostalAddress"))
|
||
If Empty(Nvl(gofirma.strada, ''))
|
||
AMESSAGEBOX( "Completati strada in datele firmei.", 48, "Date incomplete..." )
|
||
Return ''
|
||
Endif
|
||
|
||
oadresa.appendchild(oxml.createelement("cbc:StreetName"))
|
||
oadresa.lastchild.Text = Alltrim(Nvl(gofirma.strada, '')) + ' ' + Alltrim(Nvl(gofirma.numar, ''))
|
||
|
||
If Empty(Nvl(gofirma.localitate, ''))
|
||
AMESSAGEBOX( "Completati localitatea in datele firmei.", 48, "Date incomplete..." )
|
||
Return ''
|
||
Endif
|
||
If Empty(Nvl(gofirma.judet, ''))
|
||
AMESSAGEBOX( "Alegeti judetul in datele firmei.", 48, "Date incomplete..." )
|
||
Return ''
|
||
* Nu mai completez sectorul, doar localitatea "BUCURESTI SECTORUL 1"
|
||
*!* Else
|
||
*!* If gofirma.judet = "BUCURESTI" And Empty(Nvl(gofirma.sector, ''))
|
||
*!* AMESSAGEBOX( "Completati sectorul in datele firmei.", 48, "Date incomplete..." )
|
||
*!* Return ''
|
||
*!* Endif
|
||
Endif
|
||
oadresa.appendchild(oxml.createelement("cbc:CityName"))
|
||
If gofirma.judet = "BUCURESTI"
|
||
oadresa.lastchild.Text = ALLTRIM(STRTRAN(Upper(gofirma.localitate), "BUCURESTI SECTORUL ", "SECTOR"))
|
||
Else
|
||
oadresa.lastchild.Text = Alltrim(Upper(gofirma.localitate))
|
||
Endif
|
||
mcodjudet = gofirma.indicativ_judet
|
||
|
||
oadresa.appendchild(oxml.createelement("cbc:CountrySubentity"))
|
||
|
||
oadresa.lastchild.Text = "RO-" + Alltrim(mcodjudet)
|
||
otara = oadresa.appendchild(oxml.createelement("cac:Country"))
|
||
otara.appendchild(oxml.createelement("cbc:IdentificationCode"))
|
||
otara.lastchild.Text = "RO"
|
||
|
||
otaxe = oparty.appendchild(oxml.createelement("cac:PartyTaxScheme"))
|
||
otaxe.appendchild(oxml.createelement("cbc:CompanyID")) && BT-31
|
||
otaxe.lastchild.Text = IIF(m.lFurnizorPlatitorTVA, "RO", "") + Alltrim(gofirma.codfiscalfro)
|
||
oschemataxe = otaxe.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
IF m.lFurnizorPlatitorTVA
|
||
oschemataxe.appendchild(oxml.createelement("cbc:ID"))
|
||
oschemataxe.lastchild.Text = "VAT"
|
||
ENDIF
|
||
|
||
oformalegala = oparty.appendchild(oxml.createelement("cac:PartyLegalEntity"))
|
||
oformalegala.appendchild(oxml.createelement("cbc:RegistrationName"))
|
||
lcText = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(gofirma.firma, .T.)), 200))
|
||
oformalegala.lastchild.Text = m.lcText
|
||
|
||
oidentificatorformalegala = oformalegala.appendchild(oxml.createelement("cbc:CompanyID")) && BT-30
|
||
* Furnizor platitor TVA : Reg Comert, Furnizor neplatitor TVA : CIF
|
||
IF !Empty(Nvl(gofirma.reg_comert, ''))
|
||
oidentificatorformalegala.Text = Alltrim(gofirma.reg_comert)
|
||
ELSE
|
||
oidentificatorformalegala.Text = Alltrim(gofirma.codfiscalfro)
|
||
Endif
|
||
mdensoc = Upper(Alltrim(gofirma.firma)) + " "
|
||
|
||
lcText = IIF(!EMPTY(NVL(gofirma.forma_juridica,'')), Alltrim(NVL(gofirma.forma_juridica,'')), '')
|
||
lcText = m.lcText + IIF(!EMPTY(m.lcText), " # ", "") + IIF(!EMPTY(NVL(gofirma.capital_soc_sub, 0)), "Capital social subscris: " + Alltrim(STR(gofirma.capital_soc_sub)), '')
|
||
lcText = m.lcText + IIF(!EMPTY(m.lcText), " # ", "") + IIF(!EMPTY(NVL(gofirma.capital_soc_var, 0)), "Capital social varsat: " + Alltrim(STR(gofirma.capital_soc_var)), '')
|
||
If !Empty(Nvl(gofirma.forma_juridica, ''))
|
||
oformalegala.appendchild(oxml.createelement("cbc:CompanyLegalForm")) && BT-33
|
||
oformalegala.lastchild.Text = m.lcText
|
||
|
||
ENDIF
|
||
|
||
If !Empty(Nvl(gofirma.nume, '')) Or !Empty(Nvl(gofirma.prenume, '')) Or !Empty(Nvl(gofirma.email, '')) Or !Empty(Nvl(gofirma.telefon, ''))
|
||
ocontact = oparty.appendchild(oxml.createelement("cac:Contact"))
|
||
If !Empty(Nvl(gofirma.nume, '')) Or !Empty(Nvl(gofirma.prenume, ''))
|
||
ocontact.appendchild(oxml.createelement("cbc:Name"))
|
||
ocontact.lastchild.Text = Alltrim(Nvl(gofirma.nume, '')) + " " + Alltrim(Nvl(gofirma.prenume, ''))
|
||
Endif
|
||
If !Empty(Nvl(gofirma.telefon, ''))
|
||
ocontact.appendchild(oxml.createelement("cbc:Telephone"))
|
||
ocontact.lastchild.Text = Alltrim(gofirma.telefon)
|
||
Endif
|
||
If !Empty(Nvl(gofirma.email, ''))
|
||
ocontact.appendchild(oxml.createelement("cbc:ElectronicMail"))
|
||
ocontact.lastchild.Text = Alltrim(gofirma.email)
|
||
Endif
|
||
Endif
|
||
|
||
ocustomer = oinvoice.appendchild(oxml.createelement("cac:AccountingCustomerParty"))
|
||
opartys = ocustomer.appendchild(oxml.createelement("cac:Party"))
|
||
If !Empty(Nvl(loClient.email_facturare, ''))
|
||
oendpointid = opartys.appendchild(oxml.createelement("cbc:EndpointID"))
|
||
oendpointid.setattribute("schemeID", "EM")
|
||
oendpointid.Text = Alltrim(loClient.email_facturare)
|
||
ENDIF
|
||
|
||
* Registrul Comertului
|
||
lcPartyIdentification = IIF(!EMPTY(NVL(loClient.reg_comert,'')), ALLTRIM(NVL(loClient.reg_comert,'')), '')
|
||
If !Empty(m.lcPartyIdentification)
|
||
opartyidentifications = opartys.appendchild(oxml.createelement("cac:PartyIdentification"))
|
||
oidpartys = opartyidentifications.appendchild(oxml.createelement("cbc:ID")) && BT-46
|
||
oidpartys.Text = m.lcPartyIdentification
|
||
Endif
|
||
oadresas = opartys.appendchild(oxml.createelement("cac:PostalAddress"))
|
||
|
||
If Empty(Nvl(loClient.adresa, ''))
|
||
AMESSAGEBOX("Completati adresa clientului.", 48, "Date incomplete..." )
|
||
Return ''
|
||
Endif
|
||
oadresas.appendchild(oxml.createelement("cbc:StreetName")) && adresa linia 1
|
||
oadresas.lastchild.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(loClient.adresa, .T.)), 150))
|
||
|
||
If Empty(Nvl(loClient.localitate, ''))
|
||
AMESSAGEBOX("Completati localitatea in adresa clientului.", 48, "Date incomplete..." )
|
||
Return ''
|
||
Endif
|
||
oadresas.appendchild(oxml.createelement("cbc:CityName"))
|
||
If !m.llExtern AND Empty(Nvl(loClient.judet, ''))
|
||
AMESSAGEBOX("Alegeti judetul clientului.", 48, "Date incomplete..." )
|
||
Return ''
|
||
Endif
|
||
If loClient.judet = "BUCURESTI"
|
||
msector = ""
|
||
lcLocalitateBuc = Upper(loClient.localitate)
|
||
lcLocalitateBuc = Alltrim(Strtran(m.lcLocalitateBuc, 'BUCURESTI', ''))
|
||
lcLocalitateBuc = Alltrim(Strtran(m.lcLocalitateBuc, 'SECTORUL ', 'SECTOR', 1, 1, 1)) && TREBUIE SA FIE "SECTOR1" in loc de "SECTORUL 1"
|
||
|
||
If !"SECTOR" $ m.lcLocalitateBuc
|
||
AMESSAGEBOX("Alegeti un sector valid pentru Bucuresti in adresa clientului.", 48, "Atentie...")
|
||
Return ''
|
||
Endif
|
||
oadresas.lastchild.Text = m.lcLocalitateBuc
|
||
Else
|
||
oadresas.lastchild.Text = Alltrim(loClient.localitate)
|
||
ENDIF
|
||
IF !m.llExtern
|
||
oadresas.appendchild(oxml.createelement("cbc:CountrySubentity"))
|
||
oadresas.lastchild.Text = IIF(!m.llExtern, "RO-" + Alltrim(loClient.indicativ_judet), '')
|
||
ENDIF
|
||
otaras = oadresas.appendchild(oxml.createelement("cac:Country"))
|
||
otaras.appendchild(oxml.createelement("cbc:IdentificationCode"))
|
||
otaras.lastchild.Text = Iif(!Empty(Nvl(loClient.cod_tara, '')), Alltrim(loClient.cod_tara), "RO")
|
||
|
||
If Alltrim(loClient.cod_tara) = 'RO' And !Empty(Nvl(loClient.cod_fiscal, '')) AND 'RO'$UPPER(loClient.cod_fiscal) And verifcf(loClient.cod_fiscal)
|
||
* clienti RO, platitori TVA, cu cod fiscal cu RO
|
||
otaxes = opartys.appendchild(oxml.createelement("cac:PartyTaxScheme"))
|
||
otaxes.appendchild(oxml.createelement("cbc:CompanyID"))
|
||
otaxes.lastchild.Text = "RO" + Alltrim(getnrfromstring(Nvl(loClient.cod_fiscal, ''))) && BT-48
|
||
oschemataxes = otaxes.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
oschemataxes.appendchild(oxml.createelement("cbc:ID"))
|
||
oschemataxes.lastchild.Text = "VAT"
|
||
ELSE
|
||
* clienti non-RO, cu cod fiscal
|
||
otaxes = opartys.appendchild(oxml.createelement("cac:PartyTaxScheme"))
|
||
IF !Empty(Nvl(loClient.cod_tara, '')) AND Alltrim(loClient.cod_tara) <> 'RO' AND !Empty(Nvl(loClient.cod_fiscal, ''))
|
||
otaxes.appendchild(oxml.createelement("cbc:CompanyID"))
|
||
otaxes.lastchild.Text = loClient.cod_tara + Alltrim(getnrfromstring(Nvl(loClient.cod_fiscal, '')))
|
||
ENDIF
|
||
oschemataxes = otaxes.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
oschemataxes.appendchild(oxml.createelement("cbc:ID"))
|
||
oschemataxes.lastchild.Text = "VAT"
|
||
Endif
|
||
oformalegalas = opartys.appendchild(oxml.createelement("cac:PartyLegalEntity"))
|
||
oformalegalas.appendchild(oxml.createelement("cbc:RegistrationName"))
|
||
oformalegalas.lastchild.Text = Alltrim(Nvl(loClient.denumireclient, ''))
|
||
|
||
If !Empty(Nvl(loClient.cod_fiscal, ''))
|
||
oidentificatorformalegalas = oformalegalas.appendchild(oxml.createelement("cbc:CompanyID")) && BT-47
|
||
IF Alltrim(loClient.cod_tara) = 'RO'
|
||
IF 'RO'$UPPER(NVL(loClient.cod_fiscal,''))
|
||
* clienti RO, platitori TVA, pot sa pun Reg. Comert sau codul fiscal
|
||
oidentificatorformalegalas.Text = ALLTRIM(NVL(loClient.reg_comert,''))
|
||
ELSE
|
||
* clienti RO, neplatitori TVA, se pune codul fiscal
|
||
oidentificatorformalegalas.Text = Alltrim(getnrfromstring(Nvl(loClient.cod_fiscal, '')))
|
||
ENDIF
|
||
ELSE
|
||
oidentificatorformalegalas.setattribute("schemeID", "0028") && International Standard ISO 6523 https://docs.peppol.eu/poacc/billing/3.0/codelist/ICD/
|
||
oidentificatorformalegalas.text = loClient.cod_tara + Alltrim(getnrfromstring(Nvl(loClient.cod_fiscal, '')))
|
||
ENDIF
|
||
ELSE
|
||
IF EMPTY(NVL(loClient.cod_fiscal,'')) AND NVL(loClient.tip_persoana,0) = 2
|
||
* clienti RO, persoane fizice, fara cod fiscal. se pune 0 de 13 ori
|
||
oidentificatorformalegalas = oformalegalas.appendchild(oxml.createelement("cbc:CompanyID"))
|
||
oidentificatorformalegalas.Text = REPLICATE('0',13)
|
||
ELSE
|
||
IF m.llExtern && Alltrim(loClient.cod_tara) = 'RO'
|
||
IF EMPTY(NVL(loClient.reg_comert, ''))
|
||
AMESSAGEBOX("Completati identificatorul clientului (Reg. Comert)!", 48, "Date incomplete..." )
|
||
Return ''
|
||
ENDIF
|
||
oidentificatorformalegalas = oformalegalas.appendchild(oxml.createelement("cbc:CompanyID"))
|
||
oidentificatorformalegalas.text = ALLTRIM(NVL(loClient.reg_comert,''))
|
||
ENDIF
|
||
ENDIF
|
||
Endif
|
||
mdensoc = Alltrim(Nvl(loClient.denumireclient, '')) + " "
|
||
mprefix = ""
|
||
msufix = ""
|
||
Do Case
|
||
Case mdensoc = "S.C. " Or mdensoc = "SC "
|
||
mprefix = "Societate comerciala"
|
||
Case mdensoc = "P.F. " Or mdensoc = "PF "
|
||
mprefix = "Persoana fizica"
|
||
Case mdensoc = "P.F.A. " Or mdensoc = "PFA "
|
||
mprefix = "Persoana fizica autorizata"
|
||
Case mdensoc = "A.F. " Or mdensoc = "AF "
|
||
mprefix = "Asociatie familiala"
|
||
Endcase
|
||
Do Case
|
||
Case " S.R.L." $ mdensoc ;
|
||
.Or. " SRL " $ mdensoc
|
||
msufix = "Societate cu raspundere limitata"
|
||
Case " S.A." $ mdensoc .Or. ;
|
||
" SA " $ mdensoc
|
||
msufix = "Societate pe actiuni"
|
||
Endcase
|
||
If !Empty(mprefix)
|
||
oformalegalas.appendchild(oxml.createelement("cbc:CompanyLegalForm"))
|
||
oformalegalas.lastchild.Text = mprefix
|
||
Endif
|
||
If !Empty(Nvl(loClient.telefon, '')) Or !Empty(Nvl(loClient.email_facturare, ''))
|
||
ocontacts = opartys.appendchild(oxml.createelement("cac:Contact"))
|
||
*!* If !EMPTY(C_IES_FORM.delegat)
|
||
*!* ocontacts.appendchild(oxml.createelement("cbc:Name"))
|
||
*!* ocontacts.lastchild.Text = ALLTRIM(C_IES_FORM.delegat)
|
||
*!* Endif
|
||
If !Empty(Nvl(loClient.telefon, ''))
|
||
ocontacts.appendchild(oxml.createelement("cbc:Telephone"))
|
||
ocontacts.lastchild.Text = Alltrim(loClient.telefon)
|
||
Endif
|
||
If !Empty(Nvl(loClient.email_facturare, ''))
|
||
ocontacts.appendchild(oxml.createelement("cbc:ElectronicMail"))
|
||
ocontacts.lastchild.Text = Alltrim(loClient.email_facturare)
|
||
Endif
|
||
Endif
|
||
|
||
* la adresa de livrare, daca exista in xml, trebuie completata neaparat strada, nu numai judetul si localitatea
|
||
If !Empty(Nvl(loClient.adresa_livrare, ''))
|
||
odelivery = oinvoice.appendchild(oxml.createelement("cac:Delivery"))
|
||
odeliverylocation = odelivery.appendchild(oxml.createelement("cac:DeliveryLocation"))
|
||
oadresalivrare = odeliverylocation.appendchild(oxml.createelement("cac:Address"))
|
||
IF EMPTY(Nvl(loClient.stradal, ''))
|
||
AMESSAGEBOX( "Completati strada in adresa de livrare a clientului!", 48, "Atentie...")
|
||
Return ''
|
||
ENDIF
|
||
oadresalivrare.appendchild(oxml.createelement("cbc:StreetName"))
|
||
oadresalivrare.lastchild.Text = Alltrim(Nvl(loClient.stradal, ''))
|
||
|
||
oadresalivrare.appendchild(oxml.createelement("cbc:CityName"))
|
||
If Empty(Nvl(loClient.localitatel, ''))
|
||
AMESSAGEBOX( "Alegeti localitatea din adresa de livrare.", 48, "Atentie...")
|
||
Return ''
|
||
Endif
|
||
If Empty(Nvl(loClient.indicativ_judetl, ''))
|
||
AMESSAGEBOX( "Alegeti judetul din adresa de livrare.", 48, "Atentie...")
|
||
Return ''
|
||
Endif
|
||
If loClient.judetl = "BUCURESTI"
|
||
msector = ""
|
||
lcLocalitateBuc = Upper(loClient.localitatel)
|
||
lcLocalitateBuc = Alltrim(Strtran(m.lcLocalitateBuc, 'BUCURESTI', ''))
|
||
lcLocalitateBuc = Alltrim(Strtran(m.lcLocalitateBuc, 'SECTORUL ', 'SECTOR', 1, 1, 1)) && TREBUIE SA FIE "SECTOR1" in loc de "SECTORUL 1"
|
||
|
||
If !"SECTOR" $ m.lcLocalitateBuc
|
||
AMESSAGEBOX( "Alegeti un sector valid pentru Bucuresti, in adresa de livrare.", 48, "Atentie...")
|
||
Return ''
|
||
Endif
|
||
|
||
oadresalivrare.lastchild.Text = m.lcLocalitateBuc
|
||
Else
|
||
oadresalivrare.lastchild.Text = Alltrim(loClient.localitatel)
|
||
Endif
|
||
oadresalivrare.appendchild(oxml.createelement("cbc:CountrySubentity"))
|
||
oadresalivrare.lastchild.Text = "RO-" + Alltrim(loClient.indicativ_judet)
|
||
otaralivrare = oadresalivrare.appendchild(oxml.createelement("cac:Country"))
|
||
otaralivrare.appendchild(oxml.createelement("cbc:IdentificationCode"))
|
||
otaralivrare.lastchild.Text = "RO"
|
||
Endif && adresa_livrare
|
||
|
||
|
||
* Conturi IBAN instructiune plata
|
||
For lnCont = 1 To 10
|
||
lcCont = Alltrim(Nvl(Evaluate('goFirma.cont_banca' + Alltrim(Str(m.lnCont))), ''))
|
||
lcBanca = Alltrim(Nvl(Evaluate('goFirma.banca' + Alltrim(Str(m.lnCont))), ''))
|
||
|
||
If !Empty(Nvl(m.lcCont, ''))
|
||
oPaymentMeans = oinvoice.appendchild(oxml.createelement("cac:PaymentMeans"))
|
||
oPaymentMeansCode = oPaymentMeans.appendchild(oxml.createelement("cbc:PaymentMeansCode"))
|
||
oPaymentMeansCode.Text = '42' && virament bancar
|
||
oPayeeFinancialAccount = oPaymentMeans.appendchild(oxml.createelement("cac:PayeeFinancialAccount"))
|
||
oPayeeFinancialAccountId = oPayeeFinancialAccount.appendchild(oxml.createelement("cbc:ID"))
|
||
oPayeeFinancialAccountId.Text = m.lcCont && cont IBAN
|
||
oPayeeFinancialAccountName = oPayeeFinancialAccount.appendchild(oxml.createelement("cbc:Name"))
|
||
oPayeeFinancialAccountName.Text = m.lcBanca && nume cont
|
||
Endif
|
||
Endfor
|
||
|
||
Select C_IES_FORM
|
||
If mliniireducere > 0
|
||
SELECT SUM(-1*valftva) as valftva, proc_tva ;
|
||
FROM C_IES_FORM ;
|
||
WHERE discount = 1 ;
|
||
GROUP BY proc_tva ;
|
||
ORDER BY proc_tva ;
|
||
INTO CURSOR cDiscounturiTemp
|
||
|
||
Select cDiscounturiTemp
|
||
SCAN
|
||
lnValftva = cDiscounturiTemp.valftva
|
||
lnProcTva = cDiscounturiTemp.proc_tva
|
||
|
||
oallowancecharge = oinvoice.appendchild(oxml.createelement("cac:AllowanceCharge"))
|
||
oallowancecharge.appendchild(oxml.createelement("cbc:ChargeIndicator"))
|
||
oallowancecharge.lastchild.Text = "false"
|
||
oallowancecharge.appendchild(oxml.createelement("cbc:AllowanceChargeReasonCode"))
|
||
oallowancecharge.lastchild.Text = "95"
|
||
oallowancecharge.appendchild(oxml.createelement("cbc:AllowanceChargeReason"))
|
||
oallowancecharge.lastchild.Text = "Discount"
|
||
odocallowancecharge = oallowancecharge.appendchild(oxml.createelement("cbc:Amount")) && BT-92
|
||
odocallowancecharge.setattribute("currencyID", "RON")
|
||
odocallowancecharge.Text = Alltrim(Str(m.lnValftva, 15, 2))
|
||
otaxcategoryallowance = oallowancecharge.appendchild(oxml.createelement("cac:TaxCategory"))
|
||
otaxcategoryallowance.appendchild(oxml.createelement("cbc:ID"))
|
||
Select tip From ;
|
||
C_TVA_FACTURA ;
|
||
Where proc_tva = (m.lnProcTva - 1) * 100 ;
|
||
Into Array agettipcota
|
||
otaxcategoryallowance.lastchild.Text = Alltrim(agettipcota(1))
|
||
otaxcategoryallowance.appendchild(oxml.createelement("cbc:Percent"))
|
||
otaxcategoryallowance.lastchild.Text = Alltrim(Str((m.lnProcTva - 1) * 100, 2, 0))
|
||
otaxschemeallowance = otaxcategoryallowance.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
otaxschemeallowance.appendchild(oxml.createelement("cbc:ID"))
|
||
otaxschemeallowance.lastchild.Text = "VAT"
|
||
ENDSCAN
|
||
|
||
USE IN (SELECT('cDiscounturiTemp'))
|
||
Endif
|
||
If maccize <> 0
|
||
oallowancecharge = oinvoice.appendchild(oxml.createelement("cac:AllowanceCharge"))
|
||
oallowancecharge.appendchild(oxml.createelement("cbc:ChargeIndicator"))
|
||
oallowancecharge.lastchild.Text = "true"
|
||
oallowancecharge.appendchild(oxml.createelement("cbc:AllowanceChargeReason"))
|
||
oallowancecharge.lastchild.Text = "Acciza"
|
||
odocallowancecharge = oallowancecharge.appendchild(oxml.createelement("cbc:Amount"))
|
||
odocallowancecharge.setattribute("currencyID", "RON")
|
||
odocallowancecharge.Text = Alltrim(Str(maccize, 15, 2))
|
||
otaxcategorycharge = oallowancecharge.appendchild(oxml.createelement("cac:TaxCategory"))
|
||
otaxcategorycharge.appendchild(oxml.createelement("cbc:ID"))
|
||
otaxcategorycharge.lastchild.Text = "Z"
|
||
otaxcategorycharge.appendchild(oxml.createelement("cbc:Percent"))
|
||
otaxcategorycharge.lastchild.Text = "0"
|
||
otaxschemeallowance = otaxcategorycharge.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
otaxschemeallowance.appendchild(oxml.createelement("cbc:ID"))
|
||
otaxschemeallowance.lastchild.Text = "VAT"
|
||
ENDIF
|
||
|
||
If Reccount("C_TVA_FACTURA") > 0
|
||
otaxtotal = oinvoice.appendchild(oxml.createelement("cac:TaxTotal"))
|
||
Calculate Sum(tva) To mtvatotal In C_TVA_FACTURA
|
||
|
||
ototal = otaxtotal.appendchild(oxml.createelement("cbc:TaxAmount"))
|
||
ototal.setattribute("currencyID", mmoneda)
|
||
ototal.Text = Alltrim(Str(mtvatotal, 15, 2))
|
||
Select C_TVA_FACTURA
|
||
Set Order To procent
|
||
Scan
|
||
otaxablesubtotal = otaxtotal.appendchild(oxml.createelement("cac:TaxSubtotal"))
|
||
osubtotal = otaxablesubtotal.appendchild(oxml.createelement("cbc:TaxableAmount"))
|
||
osubtotal.setattribute("currencyID", mmoneda)
|
||
osubtotal.Text = Alltrim(Str(C_TVA_FACTURA.valoare, 15, 2))
|
||
osubtotaltaxa = otaxablesubtotal.appendchild(oxml.createelement("cbc:TaxAmount"))
|
||
osubtotaltaxa.setattribute("currencyID", mmoneda)
|
||
osubtotaltaxa.Text = Alltrim(Str(C_TVA_FACTURA.tva, 15, 2))
|
||
otaxcategorytotals = otaxablesubtotal.appendchild(oxml.createelement("cac:TaxCategory"))
|
||
otaxcategorytotals.appendchild(oxml.createelement("cbc:ID"))
|
||
otaxcategorytotals.lastchild.Text = Alltrim(C_TVA_FACTURA.tip)
|
||
otaxcategorytotals.appendchild(oxml.createelement("cbc:Percent"))
|
||
otaxcategorytotals.lastchild.Text = Alltrim(Str(C_TVA_FACTURA.proc_tva, 2, 0))
|
||
* eroare regula: BR_Z_10: O detaliere a TVA (BG-23) cu codul categoriei de TVA (BT-118) Cota zero trebuie sa nu aiba un cod al motivului de exceptare de la TVA (BT-121) sau un text cu motivul exceptarii de la TVA (BT-120).
|
||
|
||
If !Empty(C_TVA_FACTURA.motiv) AND (INLIST(Alltrim(C_TVA_FACTURA.tip), 'K', 'AE') OR C_TVA_FACTURA.proc_tva <> 0)
|
||
* BT 121 CODUL MOTIVULUI SCUTIRII PENTRU LIVRARI INTRACOMUNITARE K (vatex-eu-k) SAU TAXARE INVERSA AE (vatex-eu-ae)
|
||
otaxcategorytotals.appendchild(oxml.createelement("cbc:TaxExemptionReasonCode"))
|
||
otaxcategorytotals.lastchild.Text = Alltrim(C_TVA_FACTURA.motiv)
|
||
Endif
|
||
If !Empty(C_TVA_FACTURA.explicatie) && And C_TVA_FACTURA.proc_tva <> 0 && se pare ca la ultima versiune de verificare, cota 0 trebuie sa aiba cod de scutire sau text scutire
|
||
otaxcategorytotals.appendchild(oxml.createelement("cbc:TaxExemptionReason"))
|
||
otaxcategorytotals.lastchild.Text = Alltrim(C_TVA_FACTURA.explicatie)
|
||
Endif
|
||
otaxschemetotals = otaxcategorytotals.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
otaxschemetotals.appendchild(oxml.createelement("cbc:ID"))
|
||
otaxschemetotals.lastchild.Text = "VAT"
|
||
Endscan
|
||
|
||
Select C_IES_FORM
|
||
Locate
|
||
If mmoneda <> "RON"
|
||
otaxtotal = oinvoice.appendchild(oxml.createelement("cac:TaxTotal"))
|
||
ototal = otaxtotal.appendchild(oxml.createelement("cbc:TaxAmount"))
|
||
ototal.setattribute("currencyID", "RON")
|
||
ototal.Text = Alltrim(Str(Round(mtvatotal * loDate.Curs, 2), 15, 2))
|
||
Endif
|
||
Endif && Reccount("C_TVA_FACTURA") > 0
|
||
|
||
Select C_IES_FORM
|
||
Sum valftva To mtotalnet For discount = 0
|
||
|
||
Locate
|
||
mtotalnetliniifactura = mtotalnet
|
||
|
||
mtotalnet = mtotalnet + mtotalcharges - mtotalallowances
|
||
mtotalbrut = mtotalnet + mtotaltva
|
||
omonetarytotal = oinvoice.appendchild(oxml.createelement("cac:LegalMonetaryTotal"))
|
||
ototalnet = omonetarytotal.appendchild(oxml.createelement("cbc:LineExtensionAmount")) && BT-106
|
||
ototalnet.setattribute("currencyID", mmoneda)
|
||
ototalnet.Text = Alltrim(Str(mtotalnetliniifactura, 15, 2))
|
||
ototalnetfaratva = omonetarytotal.appendchild(oxml.createelement("cbc:TaxExclusiveAmount")) && BT-109
|
||
ototalnetfaratva.setattribute("currencyID", mmoneda)
|
||
ototalnetfaratva.Text = Alltrim(Str(mtotalnet, 15, 2))
|
||
ototalbrut = omonetarytotal.appendchild(oxml.createelement("cbc:TaxInclusiveAmount")) && BT-112
|
||
ototalbrut.setattribute("currencyID", mmoneda)
|
||
ototalbrut.Text = Alltrim(Str(mtotalbrut, 15, 2))
|
||
If mtotalallowances <> 0
|
||
ototaldeduceri = omonetarytotal.appendchild(oxml.createelement("cbc:AllowanceTotalAmount")) && BT-107
|
||
ototaldeduceri.setattribute("currencyID", mmoneda)
|
||
ototaldeduceri.Text = Alltrim(Str(mtotalallowances, 15, 2))
|
||
Endif
|
||
If mtotalcharges <> 0
|
||
ototaltaxe = omonetarytotal.appendchild(oxml.createelement("cbc:ChargeTotalAmount")) && BT-108
|
||
ototaltaxe.setattribute("currencyID", mmoneda)
|
||
ototaltaxe.Text = Alltrim(Str(mtotalcharges, 15, 2))
|
||
Endif
|
||
If mincasat <> 0
|
||
ototalincasat = omonetarytotal.appendchild(oxml.createelement("cbc:PrepaidAmount"))
|
||
ototalincasat.setattribute("currencyID", mmoneda)
|
||
ototalincasat.Text = Alltrim(Str(mincasat, 15, 2))
|
||
Endif
|
||
ototalplata = omonetarytotal.appendchild(oxml.createelement("cbc:PayableAmount"))
|
||
ototalplata.setattribute("currencyID", mmoneda)
|
||
ototalplata.Text = Alltrim(Str(mtotalbrut - mincasat, 15, 2))
|
||
|
||
Select C_IES_FORM
|
||
Scan For discount = 0
|
||
SCATTER NAME loRec
|
||
|
||
* Discount
|
||
lnValftva = valftva
|
||
lnValftvai = valftvai
|
||
lnValDisc = valftvai-valftva
|
||
lnPretftva = pretftva
|
||
lnPretftvai = pretftvai
|
||
lnDiscftva = pretftvai-pretftva
|
||
lnProcDisc = proc_disc
|
||
|
||
oinvoiceline = oinvoice.appendchild(oxml.createelement("cac:InvoiceLine"))
|
||
oinvoiceline.appendchild(oxml.createelement("cbc:ID"))
|
||
oinvoiceline.lastchild.Text = Alltrim(Str(Recno(), 4, 0))
|
||
|
||
lcText = ''
|
||
lcTextDescriere = ''
|
||
lcTextNota = ''
|
||
IF !EMPTY(ALLTRIM(NVL(C_IES_FORM.explicatie,'')))
|
||
lcText = XmlSpecialCharacters(RemoveCharacters(Alltrim(C_IES_FORM.explicatie), .T.))
|
||
lcTextDescriere = SUBSTR(m.lcText, 1, 200) && item.description, maxim 200 caractere
|
||
lcTextNota = ALLTRIM(SUBSTR(m.lcText, 201, 300)) && line.note, maxim 300 caractere
|
||
ENDIF
|
||
|
||
If !EMPTY(m.lcTextNota)
|
||
oinvoiceline.appendchild(oxml.createelement("cbc:Note"))
|
||
oinvoiceline.lastchild.Text = m.lcTextNota
|
||
ENDIF
|
||
|
||
mum = Iif(Empty(Nvl(cod_um_iso, "")), "H87", Alltrim(cod_um_iso))
|
||
oum = oinvoiceline.appendchild(oxml.createelement("cbc:InvoicedQuantity"))
|
||
oum.setattribute("unitCode", mum)
|
||
oum.Text = Alltrim(Str(C_IES_FORM.cantitate, 15, 3))
|
||
oamount = oinvoiceline.appendchild(oxml.createelement("cbc:LineExtensionAmount")) && BT-131
|
||
oamount.setattribute("currencyID", mmoneda)
|
||
oamount.Text = Alltrim(Str(C_IES_FORM.valftva, 15, 2))
|
||
*!* If _Tally > 0
|
||
*!* oorderlinereference = oinvoiceline.appendchild(oxml.createelement("cac:OrderLineReference"))
|
||
*!* oorderlinereference.appendchild(oxml.createelement("cbc:LineID"))
|
||
*!* oorderlinereference.lastchild.Text = ALLTRIM(agetcomenzilinie(1, 2)) + "/" + ALLTRIM(Dtoc(agetcomenzilinie(1, 3)))
|
||
*!* Endif
|
||
|
||
* Daca am discount (valftvai valoare de lista <> valftva valoare factura)
|
||
*!* <cac:AllowanceCharge>
|
||
*!* <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
||
*!* <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
|
||
*!* <cbc:MultiplierFactorNumeric>35.00</cbc:MultiplierFactorNumeric>
|
||
*!* <cbc:Amount currencyID="RON">17.33</cbc:Amount>
|
||
*!* <cbc:BaseAmount currencyID="RON">49.52</cbc:BaseAmount>
|
||
*!* </cac:AllowanceCharge>
|
||
IF TYPE('gnEFACTURA_XML_DISC_PLISTA_LINIE') = 'N' AND m.gnEFACTURA_XML_DISC_PLISTA_LINIE = 1 AND m.lnPretftvai > m.lnPretftva
|
||
oAllowance = oinvoiceline.appendchild(oxml.createelement("cac:AllowanceCharge"))
|
||
|
||
oAllowance.appendchild(oxml.createelement("cbc:ChargeIndicator"))
|
||
oAllowance.lastchild.Text = 'false'
|
||
|
||
oAllowance.appendchild(oxml.createelement("cbc:AllowanceChargeReasonCode"))
|
||
oAllowance.lastchild.Text = '95'
|
||
|
||
oAllowance.appendchild(oxml.createelement("cbc:MultiplierFactorNumeric"))
|
||
oAllowance.lastchild.Text = ALLTRIM(STR(m.lnProcDisc,5,2))
|
||
|
||
oAmount = oAllowance.appendchild(oxml.createelement("cbc:Amount"))
|
||
oAmount.setattribute("currencyID", mmoneda)
|
||
oAmount.Text = Alltrim(Str(m.lnValDisc, 15, 2))
|
||
|
||
oBaseAmount = oAllowance.appendchild(oxml.createelement("cbc:BaseAmount"))
|
||
oBaseAmount.setattribute("currencyID", mmoneda)
|
||
oBaseAmount.Text = Alltrim(Str(m.lnValftvai, 15, 2))
|
||
ENDIF
|
||
|
||
oitem = oinvoiceline.appendchild(oxml.createelement("cac:Item"))
|
||
If !Empty(m.lcTextDescriere)
|
||
oitem.appendchild(oxml.createelement("cbc:Description"))
|
||
oitem.lastchild.Text = m.lcTextDescriere
|
||
Endif
|
||
If !Empty(C_IES_FORM.denumire)
|
||
oitem.appendchild(oxml.createelement("cbc:Name"))
|
||
lcText = LEFT(XmlSpecialCharacters(RemoveCharacters(Alltrim(C_IES_FORM.denumire), .T.)),100) && maxim 100 caractere
|
||
oitem.lastchild.Text = m.lcText
|
||
Endif
|
||
If !Empty(Nvl(C_IES_FORM.codmatc, ''))
|
||
obuyeritem = oitem.appendchild(oxml.createelement("cac:BuyersItemIdentification"))
|
||
obuyeritem.appendchild(oxml.createelement("cbc:ID"))
|
||
obuyeritem.lastchild.Text = Alltrim(C_IES_FORM.codmatc)
|
||
Endif
|
||
If !Empty(Nvl(C_IES_FORM.codmat, ''))
|
||
oselleritem = oitem.appendchild(oxml.createelement("cac:SellersItemIdentification"))
|
||
oselleritem.appendchild(oxml.createelement("cbc:ID"))
|
||
oselleritem.lastchild.Text = Alltrim(C_IES_FORM.codmat)
|
||
Endif
|
||
|
||
lcCodBare = GetCodBareByIdArticol(C_IES_FORM.id_articol)
|
||
If !Empty(m.lcCodBare)
|
||
ostandarditem = oitem.appendchild(oxml.createelement("cac:StandardItemIdentification"))
|
||
oidstandard = ostandarditem.appendchild(oxml.createelement("cbc:ID"))
|
||
oidstandard.setattribute("schemeID", "0160")
|
||
oidstandard.Text = Alltrim(m.lcCodBare)
|
||
|
||
oclassificationcodbare = oitem.appendchild(oxml.createelement("cac:CommodityClassification"))
|
||
ocodbare = oclassificationcodbare.appendchild(oxml.createelement("cbc:ItemClassificationCode"))
|
||
ocodbare.setattribute("listID", "EN")
|
||
ocodbare.Text = Left(Alltrim(m.lcCodBare), 13)
|
||
Endif
|
||
|
||
If !Empty(Nvl(C_IES_FORM.serie, ''))
|
||
oclassificationlot = oitem.appendchild(oxml.createelement("cac:CommodityClassification"))
|
||
olot = oclassificationlot.appendchild(oxml.createelement("cbc:ItemClassificationCode"))
|
||
olot.setattribute("listID", "BB")
|
||
olot.Text = Alltrim(Left(XmlSpecialCharacters(RemoveCharacters(C_IES_FORM.serie, .T.)), 50))
|
||
Endif
|
||
|
||
If !Empty(Nvl(C_IES_FORM.codcpv, ''))
|
||
oclassificationnc = oitem.appendchild(oxml.createelement("cac:CommodityClassification"))
|
||
oclassificationstandardidnc = oclassificationnc.appendchild(oxml.createelement("cbc:ItemClassificationCode"))
|
||
oclassificationstandardidnc.setattribute("listID", "STI")
|
||
oclassificationstandardidnc.Text = Alltrim(C_IES_FORM.codcpv)
|
||
Endif
|
||
|
||
If !Empty(Nvl(C_IES_FORM.codnc8, ''))
|
||
oclassificationnc = oitem.appendchild(oxml.createelement("cac:CommodityClassification"))
|
||
oclassificationstandardidnc = oclassificationnc.appendchild(oxml.createelement("cbc:ItemClassificationCode"))
|
||
oclassificationstandardidnc.setattribute("listID", "TSP")
|
||
oclassificationstandardidnc.Text = Alltrim(C_IES_FORM.codnc8)
|
||
Endif
|
||
|
||
oitemtaxcategory = oitem.appendchild(oxml.createelement("cac:ClassifiedTaxCategory"))
|
||
*!* Select tip From C_TVA_FACTURA ;
|
||
*!* Where proc_tva = (C_IES_FORM.proc_tva - 1) * 100 ;
|
||
*!* Into Array agettipcota
|
||
*!* lcTip = Alltrim(agettipcota(1))
|
||
|
||
lcTip = This.GetTipTaxa(mtipfactura, loRec.intracomunitar, loRec.taxare_inversa, loRec.scutit, (loRec.proc_tva -1)*100)
|
||
|
||
oitemtaxcategory.appendchild(oxml.createelement("cbc:ID"))
|
||
oitemtaxcategory.lastchild.Text = m.lcTip
|
||
oitemtaxcategory.appendchild(oxml.createelement("cbc:Percent"))
|
||
oitemtaxcategory.lastchild.Text = Alltrim(Str((C_IES_FORM.proc_tva - 1) * 100, 2, 0))
|
||
oitemtaxscheme = oitemtaxcategory.appendchild(oxml.createelement("cac:TaxScheme"))
|
||
oitemtaxscheme.appendchild(oxml.createelement("cbc:ID"))
|
||
oitemtaxscheme.lastchild.Text = "VAT"
|
||
oitemprice = oinvoiceline.appendchild(oxml.createelement("cac:Price"))
|
||
oitemamount = oitemprice.appendchild(oxml.createelement("cbc:PriceAmount"))
|
||
oitemamount.setattribute("currencyID", mmoneda)
|
||
oitemamount.Text = Alltrim(Str(C_IES_FORM.pretftva, 15, precizie_max_pret_vz))
|
||
|
||
* Discount unitar pret
|
||
*!* <cac:AllowanceCharge>
|
||
*!* <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
||
*!* <cbc:Amount currencyID="RON">8.67</cbc:Amount>
|
||
*!* <cbc:BaseAmount currencyID="RON">24.76</cbc:BaseAmount>
|
||
*!* </cac:AllowanceCharge>
|
||
IF TYPE('gnEFACTURA_XML_DISC_PLISTA_ART') = 'N' AND m.gnEFACTURA_XML_DISC_PLISTA_ART = 1 AND m.lnPretftvai > m.lnPretftva
|
||
oAllowance = oitemprice.appendchild(oxml.createelement("cac:AllowanceCharge"))
|
||
|
||
oAllowance.appendchild(oxml.createelement("cbc:ChargeIndicator"))
|
||
oAllowance.lastchild.Text = 'false'
|
||
|
||
oAmount = oAllowance.appendchild(oxml.createelement("cbc:Amount"))
|
||
oAmount.setattribute("currencyID", mmoneda)
|
||
oAmount.Text = Alltrim(Str(ABS(m.lnDiscftva), 15, 4))
|
||
|
||
oBaseAmount = oAllowance.appendchild(oxml.createelement("cbc:BaseAmount"))
|
||
oBaseAmount.setattribute("currencyID", mmoneda)
|
||
oBaseAmount.Text = Alltrim(Str(ABS(m.lnPretftvai), 15, 4))
|
||
ENDIF
|
||
|
||
Endscan
|
||
|
||
|
||
Wait Window 'Salvare fisier XML...' Nowait
|
||
|
||
lcCaleFisier = GetPdfPath("Efactura")
|
||
|
||
lcNumeClient = WindowsSpecialCharacters(Nvl(loClient.denumireclient, ''), "_")
|
||
lcNumeClient = Strtran(Alltrim(m.lcNumeClient), [ ], [_], 1, 100, 1)
|
||
lcNumeClient = ALLTRIM(LEFT(WindowsSpecialCharacters(m.lcNumeClient, "_"), 70))
|
||
|
||
lcNumeFisier = 'efactura_' + Dtos(loDate.dataact) + '_' + Alltrim(Str(loDate.nract)) + '_' + m.lcNumeClient
|
||
|
||
lcFileName = m.lcCaleFisier + lcNumeFisier + '.xml'
|
||
|
||
If File(m.lcFileName)
|
||
Delete File (m.lcFileName)
|
||
Endif
|
||
|
||
* scriu fisierul xml
|
||
oxml.Save(m.lcFileName)
|
||
If File(m.lcFileName)
|
||
Return m.lcFileName
|
||
Else
|
||
AMESSAGEBOX('Nu s-a putut salva fisierul ' + m.lcFileName, 0 + 48, _Screen.Caption)
|
||
Return ''
|
||
Endif
|
||
|
||
Endproc && XMLEFactura
|
||
|
||
|
||
* GetTipTaxa: intoarce Tip Taxa
|
||
* tcExplicatie, tcMotiv pentru tip E scutit: optional OUT
|
||
* lcTip = This.GetTipTaxa('F', 1, 0, 0, 0, @lcExplicatie, @lcMotiv, lcExplicatieTVA)
|
||
PROCEDURE GetTipTaxa
|
||
LPARAMETERS tcTipFactura, tnIntracomunitar, tnTaxareInversa, tnScutit, tnProcTva, tcExplicatie, tcMotiv, tcExplicatieTVA
|
||
* tcExplicatieTVA (optional): pentru completarea tcExplicatie pentru Scutit, ca sa nu mai fie la toate "scutit cu drept de deducere"
|
||
|
||
lcTip = ''
|
||
tcExplicatie = ''
|
||
tcMotiv = ''
|
||
lcTipFactura = UPPER(ALLTRIM(NVL(m.tcTipFactura, '')))
|
||
llIntracomunitar = (tnIntracomunitar = 1)
|
||
llTaxareInversa = (tnTaxareInversa = 1)
|
||
llScutit = (tnScutit = 1)
|
||
lnProcTva = m.tnProcTva
|
||
|
||
Do Case
|
||
Case m.llIntracomunitar
|
||
lcTip = 'K'
|
||
tcExplicatie = 'Livrare intracomunitara'
|
||
tcMotiv = 'VATEX-EU-IC'
|
||
Case m.llTaxareInversa
|
||
lcTip = 'AE'
|
||
tcExplicatie = 'Taxare inversa'
|
||
tcMotiv = 'VATEX-EU-AE'
|
||
Case m.llScutit
|
||
lcTip = 'E'
|
||
tcExplicatie = IIF(!EMPTY(m.tcExplicatieTVA) and TYPE('tcExplicatieTVA') = 'C', m.tcExplicatieTVA, 'Scutit cu drept de deducere')
|
||
Case m.lcTipFactura = 'F' And m.lnProcTva = 0
|
||
lcTip = 'Z'
|
||
Case m.lcTipFactura = 'H'
|
||
lcTip = 'E'
|
||
tcExplicatie = 'Bunuri second-hand'
|
||
tcMotiv = 'VATEX-EU-F'
|
||
Case m.lcTipFactura = 'U'
|
||
lcTip = 'E'
|
||
tcExplicatie = 'Regim special agentii de turism'
|
||
tcMotiv = 'VATEX-EU-D'
|
||
Otherwise
|
||
lcTip = 'S'
|
||
Endcase
|
||
|
||
RETURN m.lcTip
|
||
ENDPROC && GetTipTaxa
|
||
*********
|
||
*******************************
|
||
* Validare eFactura online ANAF sau offline DukIntegrator
|
||
* OUT PARAMETER: mesaj eroare
|
||
* RETURN: .T. VALID, .F. INVALID
|
||
*******************************
|
||
Procedure ValidareEFactura
|
||
Lparameters tcFileName, tcMesaj, tlValidareEFacturaOnline
|
||
|
||
Local llValid
|
||
|
||
llValid = .F.
|
||
|
||
* tlOnline: (implicit .F.) .T. daca se valideaza xml eFactura Online
|
||
If Pcount() < 3 Or !m.tlValidareEFacturaOnline
|
||
llValid = This.ValidareEFacturaDUK(tcFileName, @tcMesaj)
|
||
Else
|
||
llValid = This.ValidareEFacturaANAF(tcFileName, @tcMesaj)
|
||
Endif
|
||
Return m.llValid
|
||
Endproc
|
||
|
||
Procedure ValidareEFacturaDUK
|
||
Lparameters tcFileName, tcMesaj
|
||
* tcMesaj: OUT mesaj daca validarea este silentioasa
|
||
|
||
Local lcFileName, lcFisierRaspuns, lnTimes
|
||
Local lcComunPath, lcConfigDir, lcParams, lcValidator, llOk, lcMesaj
|
||
lcMesaj = ''
|
||
lcFileName = m.tcFileName
|
||
llOk = .F.
|
||
llSilentios = This.lSilentios
|
||
|
||
Wait Window 'Validare fisier ' + m.lcFileName Nowait
|
||
lcFisierRaspuns = Forceext(m.lcFileName, 'txt')
|
||
If File(m.lcFisierRaspuns)
|
||
Delete File (m.lcFisierRaspuns)
|
||
Endif
|
||
|
||
* validez xml
|
||
lcComunPath = m.gcBasePath + Iif(gcAppName = "CONCONT", "COMUNCONTAFIN\", "COMUNROA\")
|
||
lcValidator = m.lcComunPath + [dist_efactura\DUKIntegrator.jar] && ROA\COMUNROA\DIST_EFACTURA\DUKIntegrator.jar
|
||
If !File(m.lcValidator)
|
||
open_default_app('https://mfinante.gov.ro/web/efactura/informatii-tehnice')
|
||
AMESSAGEBOX('Nu exista fisierul: "' + m.lcValidator + '"!' + Chr(13) + Chr(10) + ;
|
||
'Pentru validare xml Efactura, instalati validatorul Efactura in directorul: "' + Justpath(m.lcValidator) + '"', 0 + 48, _Screen.Caption)
|
||
Else
|
||
lcConfigDir = m.lcComunPath + [dist_efactura\config]
|
||
lcParams = ' -c "' + m.lcConfigDir + '" -v FACT1 "' + m.lcFileName + '" "' + m.lcFisierRaspuns + '"'
|
||
|
||
open_default_app(m.lcValidator, m.lcParams)
|
||
|
||
lnTimes = 0
|
||
Do While lnTimes <= 10 And !File(m.lcFisierRaspuns)
|
||
lnTimes = lnTimes + 1
|
||
Wait Window Timeout 1 ""
|
||
Enddo
|
||
If File(m.lcFisierRaspuns)
|
||
If Lower(Filetostr(m.lcFisierRaspuns)) = "ok"
|
||
lcMesaj = "Factura este valida. O puteti <20>ncarca prin SPV, la sectiunea 'Factura electronica', cu optiunea de sintaxa XML - UBL" + Chr(13) + Chr(10) + m.lcFileName
|
||
If !m.llSilentios
|
||
AMESSAGEBOX(m.lcMesaj, 0 + 48, _Screen.Caption)
|
||
Endif
|
||
Delete File(m.lcFisierRaspuns)
|
||
llOk = .T.
|
||
Else
|
||
lcMesaj = 'Validare cu erori fisier: ' + m.lcFileName
|
||
|
||
If !m.llSilentios
|
||
AMESSAGEBOX(m.lcMesaj, 0 + 48, _Screen.Caption)
|
||
open_default_app(m.lcFisierRaspuns)
|
||
Endif
|
||
lcMesaj = m.lcMesaj + + Chr(13) + Chr(10) + ;
|
||
'Fisier raspuns: ' + m.lcFisierRaspuns + Chr(13) + Chr(10) + Chr(13) + Chr(10) ;
|
||
+ Filetostr(m.lcFisierRaspuns) + Chr(13) + Chr(10) + Chr(13) + Chr(10)
|
||
Endif
|
||
Else
|
||
lcMesaj = 'Nu s-a creat fisierul raspuns ' + m.lcFisierRaspuns + ' dupa validare!'
|
||
If !m.llSilentios
|
||
AMESSAGEBOX(m.lcMesaj, 0 + 48, _Screen.Caption)
|
||
Endif
|
||
Endif
|
||
Endif
|
||
|
||
*** deschid explorer in directorul de export
|
||
If !m.llSilentios
|
||
open_default_app(Justpath(m.lcFileName))
|
||
Endif
|
||
|
||
tcMesaj = m.lcMesaj
|
||
Return m.llOk
|
||
Endproc && ValidareEFacturaDUK
|
||
|
||
Procedure ValidareEFacturaANAF
|
||
Lparameters tcFileName, tcMesaj
|
||
* tcMesaj: OUT mesaj daca validarea este silentioasa
|
||
* lReturn: .T. valid, .F. invalid
|
||
Local loReturn, llValid
|
||
Local loHTTP As 'winHTTP.winHTTPrequest.5.1'
|
||
Local lcFileName, lcFisierRaspuns, lcMesaj, lcSend, lcServer, lcStare, llOk, llSilentios, llSucces
|
||
Local lnMesaj, lnMesaje, loJson, loMessage, loEx as Exception, lcToken
|
||
|
||
llValid = .F.
|
||
lcMesaj = ''
|
||
lcFileName = m.tcFileName
|
||
llOk = .F.
|
||
llSilentios = This.lSilentios
|
||
lcMesaj = ''
|
||
lcToken = This.cToken
|
||
|
||
loReturn = Createobject("empty")
|
||
AddProperty(loReturn, "lSucces", .F.)
|
||
AddProperty(loReturn, "cFile", '')
|
||
AddProperty(loReturn, "cResponse", '')
|
||
AddProperty(loReturn, "nStatus", 0)
|
||
|
||
Wait Window 'Validare fisier ' + m.lcFileName Nowait
|
||
lcFisierRaspuns = Forceext(m.lcFileName, 'txt')
|
||
If File(m.lcFisierRaspuns)
|
||
Delete File (m.lcFisierRaspuns)
|
||
Endif
|
||
|
||
* validez xml
|
||
|
||
If !Empty(m.lcFileName) And Type('lcFileName') = 'C' And File(m.lcFileName)
|
||
TRY
|
||
lcSend = Filetostr(m.lcFileName)
|
||
|
||
IF !EMPTY(m.lcToken)
|
||
* validare oauth
|
||
lcServer = [https://api.anaf.ro/prod/FCTEL/rest/validare/FACT1]
|
||
ELSE
|
||
* validare fara autentificare
|
||
lcServer = [https://webservicesp.anaf.ro/prod/FCTEL/rest/validare/FACT1]
|
||
ENDIF
|
||
|
||
loHTTP = Createobject('winHTTP.winHTTPrequest.5.1')
|
||
loHTTP.Open('POST', lcServer, .F.)
|
||
loHTTP.setRequestHeader("Content-Type", "text/plain")
|
||
IF !EMPTY(m.lcToken) && validare oauth
|
||
loHTTP.setRequestHeader('Authorization', 'Bearer ' + m.lcToken)
|
||
ENDIF
|
||
Try
|
||
poLog.Log(m.lcServer)
|
||
Catch
|
||
Endtry
|
||
loHTTP.Send(m.lcSend)
|
||
|
||
loReturn.nStatus = loHTTP.Status
|
||
loReturn.cResponse = loHTTP.ResponseText
|
||
loReturn.lSucces = (loHTTP.Status = 200)
|
||
CATCH TO loEx
|
||
loReturn.cResponse = m.lcMesaj + Chr(13) + Chr(10) + '<errorMessage="' + loEx.message + '">'
|
||
loReturn.lSucces = .F.
|
||
ENDTRY
|
||
|
||
Else
|
||
loReturn.cResponse = m.lcMesaj + Chr(13) + Chr(10) + '<errorMessage="Nu exista fisierul' + m.lcFileName + '">'
|
||
loReturn.lSucces = .F.
|
||
Endif
|
||
|
||
If loReturn.lSucces
|
||
loJson = nfjsonread(loReturn.cResponse)
|
||
If Type('loJson.stare') = 'C' And !Empty(loJson.stare)
|
||
lcStare = Alltrim(Lower(loJson.stare))
|
||
llValid = (m.lcStare == 'ok')
|
||
If !m.llValid
|
||
If Type('loJson.messages_vfpsafe_') = 'U'
|
||
llSucces = .F.
|
||
lcMesaj = 'Nu exista informatia [messages] in raspuns.' + Chr(13) + Chr(10) + loReturn.cResponse
|
||
Else
|
||
lnMesaje = Alen(loJson.messages_vfpsafe_)
|
||
lcMesaj = ''
|
||
For lnMesaj = 1 To m.lnMesaje
|
||
loMessage = loJson.messages_vfpsafe_[m.lnMesaj]
|
||
If Type('loMessage.message') = 'C'
|
||
lcMesaj = lcMesaj + loMessage.Message + Chr(13) + Chr(10)
|
||
Endif
|
||
Endfor
|
||
Endif && messages
|
||
|
||
If !m.llSilentios And !Empty(m.lcMesaj)
|
||
AMESSAGEBOX(m.lcMesaj, 0 + 48, _Screen.Caption)
|
||
Endif
|
||
|
||
Else
|
||
lcMesaj = "Factura este valida. O puteti <20>ncarca prin SPV, la sectiunea 'Factura electronica', cu optiunea de sintaxa XML - UBL" + Chr(13) + Chr(10) + m.lcFileName
|
||
If !m.llSilentios
|
||
AMESSAGEBOX(m.lcMesaj, 0 + 48, _Screen.Caption)
|
||
Endif
|
||
Endif && llValid
|
||
Endif && loJson.stare
|
||
Endif && loReturn.lSucces
|
||
|
||
*** deschid explorer in directorul de export
|
||
If !m.llSilentios
|
||
open_default_app(Justpath(m.lcFileName))
|
||
Endif
|
||
|
||
tcMesaj = m.lcMesaj
|
||
Return m.llValid
|
||
Endproc && ValidareEFacturaANAF
|
||
|
||
Enddefine && ExportEFactura
|
||
|
||
|
||
|
||
|
||
|
||
PROCEDURE TestValidareEFactura
|
||
|
||
Local loExport As 'ExportEFactura'
|
||
Local lcFile, llValid, lcMesaj, llOnline
|
||
lcMesaj = ''
|
||
llOnline = .T.
|
||
lcFile = 'f:\efactura_rompetrol.xml'
|
||
loExport = CREATEOBJECT('ExportEFactura')
|
||
SET STEP ON
|
||
llValid = loExport.ValidareEFactura(m.lcFile, @lcMesaj, m.llOnline)
|
||
|
||
ENDPROC && TestValidareEFactura |