118 lines
4.8 KiB
Python
118 lines
4.8 KiB
Python
# este archivo es un ejemplo para le generacion
|
|
# una factura de venta nacional usando el comando **facho**.
|
|
#
|
|
# ejemplo: facho generate-invoice generate-invoice-from-cli.py
|
|
#
|
|
# importar libreria de modelos
|
|
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, 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]
|
|
|
|
def invoice():
|
|
# factura de venta nacional
|
|
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('SETP990000008')
|
|
# asignar tipo de operacion ver DIAN:6.1.5
|
|
inv.set_operation_type('10')
|
|
inv.set_supplier(form.Party(
|
|
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-14', 'O-48']),
|
|
# ver DIAN:FAJ28
|
|
responsability_regime_code = '48',
|
|
# tipo de organizacion juridica ver DIAN:6.2.3
|
|
organization_code = '1',
|
|
email = "correoempresa@correoempresa.correo",
|
|
address = form.Address(
|
|
'', '', 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 = '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 = "consumidor_final0final.final",
|
|
address = form.Address(
|
|
'', '', form.City('05001', 'Medellín'),
|
|
form.Country('CO', 'Colombia'),
|
|
form.CountrySubentity('05', 'Antioquia')),
|
|
#tax_scheme = form.TaxScheme('01', 'IVA')
|
|
))
|
|
# 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 = '20',
|
|
# fecha de vencimiento de la factura
|
|
due_at = datetime.now(),
|
|
# identificador numerico
|
|
payment_id = '2'
|
|
))
|
|
# adicionar una linea al documento
|
|
inv.add_invoice_line(form.InvoiceLine(
|
|
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 item (sin iva)
|
|
amount = form.Amount(200.00),
|
|
# ver DIAN:6.3.5.1
|
|
type_code = '01',
|
|
type = 'x'
|
|
),
|
|
tax = form.TaxTotal(
|
|
subtotals = [
|
|
form.TaxSubTotal(
|
|
percent = 19.00,
|
|
scheme=form.TaxScheme('01')
|
|
)
|
|
]
|
|
)
|
|
))
|
|
return inv
|
|
|
|
def document_xml():
|
|
return form_xml.DIANInvoiceXML
|