diff --git a/examples/generate-invoice-from-cli.py b/examples/generate-invoice-from-cli.py index 9c89ab3..edb6cdd 100644 --- a/examples/generate-invoice-from-cli.py +++ b/examples/generate-invoice-from-cli.py @@ -4,83 +4,100 @@ # ejemplo: facho generate-invoice generate-invoice-from-cli.py # # importar libreria de modelos -import facho.fe.form as form -import facho.fe.form_xml +from facho.fe import form +from facho.fe import form_xml # importar libreria extensiones xml para cumplir decreto from facho.fe import fe # importar otras necesarias -from datetime import datetime +from datetime import datetime, date + +# Datos del fomulario del SET de pruebas +INVOICE_AUTHORIZATION = '181360000001' #Número suministrado por la Dian en el momento de la creación del SET de Pruebas +ID_SOFTWARE = '57bcb6d1-c591-5a90-b80a-cb030ec91440' #Id suministrado por la Dian en el momento de la creación del SET de Pruebas +PIN = '19642' #Número creado por la empresa para poder crear el SET de pruebas +CLAVE_TECNICA = 'fc9eac422eba16e21ffd8c5f94b3f30a6e38162d' ##Id suministrado por la Dian en el momento de la creación del SET de Pruebas + + +# callback que retonar las extensiones XML necesarias +# para que el documento final XML cumpla el decreto. +# +# muchos de los valores usados son obtenidos +# del servicio web de la DIAN. +def extensions(inv): + security_code = fe.DianXMLExtensionSoftwareSecurityCode(ID_SOFTWARE, PIN, inv.invoice_ident) + authorization_provider = fe.DianXMLExtensionAuthorizationProvider() + cufe = fe.DianXMLExtensionCUFE(inv, CLAVE_TECNICA, fe.AMBIENTE_PRUEBAS) + software_provider = fe.DianXMLExtensionSoftwareProvider('nit_empresa', 'dígito_verificación', ID_SOFTWARE) + inv_authorization = fe.DianXMLExtensionInvoiceAuthorization(INVOICE_AUTHORIZATION, + datetime(2019, 1, 19),#Datos toamdos de + datetime(2030, 1, 19),#la configuración + 'SETP', 990000000, 995000000)#del SET de pruebas + return [security_code, authorization_provider, cufe, software_provider, inv_authorization] -# callback que retorna el modelado de documento electronico -# a generar def invoice(): # factura de venta nacional - inv = form.NationalSalesInvoice() + inv = form.Invoice('01') # asignar periodo de facturacion inv.set_period(datetime.now(), datetime.now()) # asignar fecha de emision de la factura inv.set_issue(datetime.now()) # asignar prefijo y numero del documento - inv.set_ident('SETP990003033') + inv.set_ident('SETP990000008') # asignar tipo de operacion ver DIAN:6.1.5 inv.set_operation_type('10') - # asignar proveedor inv.set_supplier(form.Party( - legal_name = 'FACHO SOS', - name = 'FACHO SOS', - ident = form.PartyIdentification('900579212', '5', '31'), + legal_name = 'Nombre registrado de la empresa', + name = 'Nombre comercial o él mismo nombre registrado', + ident = form.PartyIdentification('nit_empresa', 'digito_verificación', '31'), # obligaciones del contribuyente ver DIAN:FAK26 - responsability_code = form.Responsability(['O-07', 'O-09', 'O-14', 'O-48']), + responsability_code = form.Responsability(['O-07', 'O-14', 'O-48']), # ver DIAN:FAJ28 responsability_regime_code = '48', # tipo de organizacion juridica ver DIAN:6.2.3 organization_code = '1', - email = "sdds@sd.com", + email = "correoempresa@correoempresa.correo", address = form.Address( - name = '', - street = '', - city = form.City('05001', 'Medellín'), - country = form.Country('CO', 'Colombia'), - countrysubentity = form.CountrySubentity('05', 'Antioquia')) + '', '', form.City('05001', 'Medellín'), + form.Country('CO', 'Colombia'), + form.CountrySubentity('05', 'Antioquia')), )) + #Tercero a quien se le factura inv.set_customer(form.Party( - legal_name = 'facho-customer', - name = 'facho-customer', - ident = form.PartyIdentification('999999999', '', '13'), + legal_name = 'consumidor final', + name = 'consumidor final', + ident = form.PartyIdentification('222222222222', '', '13'), responsability_code = form.Responsability(['R-99-PN']), responsability_regime_code = '49', organization_code = '2', - email = "sdds@sd.com", + email = "consumidor_final0final.final", address = form.Address( - name = '', - street = '', - city = form.City('05001', 'Medellín'), - country = form.Country('CO', 'Colombia'), - countrysubentity = form.CountrySubentity('05', 'Antioquia')) + '', '', form.City('05001', 'Medellín'), + form.Country('CO', 'Colombia'), + form.CountrySubentity('05', 'Antioquia')), + #tax_scheme = form.TaxScheme('01', 'IVA') )) - # asignar metodo de pago + # asignar metodo de pago inv.set_payment_mean(form.PaymentMean( # metodo de pago ver DIAN:3.4.1 id = '1', # codigo correspondiente al medio de pago ver DIAN:3.4.2 - code = '10', - # fecha de vencimiento de la factura + code = '20', + # fecha de vencimiento de la factura due_at = datetime.now(), - # identificador numerico - payment_id = '1' + payment_id = '2' )) # adicionar una linea al documento inv.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1, '94'), - description = 'producto facho', + quantity = form.Quantity(int(20.5), '94'), # item general de codigo 999 + description = 'productO3', item = form.StandardItem('test', 9999), price = form.Price( - # precio base del tiem - amount = form.Amount(100.00), + # precio base del item (sin iva) + amount = form.Amount(200.00), # ver DIAN:6.3.5.1 type_code = '01', type = 'x' @@ -89,31 +106,12 @@ def invoice(): subtotals = [ form.TaxSubTotal( percent = 19.00, + scheme=form.TaxScheme('01') ) ] ) )) return inv -# callback que retonar las extensiones XML necesarias -# para que el documento final XML cumpla el decreto. -# -# muchos de los valores usados son obtenidos -# del servicio web de la DIAN. -def extensions(inv): - security_code = fe.DianXMLExtensionSoftwareSecurityCode('id software', 'pin', inv.invoice_ident) - authorization_provider = fe.DianXMLExtensionAuthorizationProvider() - cufe = fe.DianXMLExtensionCUFE(inv, fe.DianXMLExtensionCUFE.AMBIENTE_PRUEBAS, - 'clave tecnica') - nit = form.PartyIdentification('nit', '5', '31') - software_provider = fe.DianXMLExtensionSoftwareProvider(nit, nit.dv, 'id software') - inv_authorization = fe.DianXMLExtensionInvoiceAuthorization('invoice autorization', - datetime(2019, 1, 19), - datetime(2030, 1, 19), - 'SETP', 990000001, 995000000) - return [security_code, authorization_provider, cufe, software_provider, inv_authorization] - - -# callback con transformador a XML def document_xml(): return form_xml.DIANInvoiceXML