diff --git a/facho/cli.py b/facho/cli.py index 91bc360..5bd3c8a 100644 --- a/facho/cli.py +++ b/facho/cli.py @@ -53,10 +53,44 @@ def SendTestSetAsync(private_key, public_key, password, filename, zipfile): client = dian.DianSignatureClient(private_key, public_key, password=password) resp = client.request(dian.SendTestSetAsync( - filename, zipfile.read().encode('utf-8') + filename, open(zipfile, 'r').read().encode('utf-8') )) print(resp) + +@click.command() +@click.option('--private-key', type=click.Path(exists=True)) +@click.option('--passphrase') +@click.argument('scriptname', type=click.Path(exists=True), required=True) +def generate_invoice(private_key, passphrase, scriptname): + """ + imprime xml en pantalla. + SCRIPTNAME espera + def invoice() -> form.Invoice + def extensions(form.Invoice): -> List[facho.FachoXMLExtension] + """ + import importlib.util + + spec = importlib.util.spec_from_file_location('invoice', scriptname) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + import facho.fe.form as form + from facho import fe + + invoice = module.invoice() + xml = form.DIANInvoiceXML(invoice) + + extensions = module.extensions(invoice) + for extension in extensions: + xml.add_extension(extension) + + if private_key: + signer = fe.DianXMLExtensionSigner(private_key, passphrase=passphrase) + xml.add_extension(signer) + xml.attach_extensions() + print(str(xml)) + @click.group() def main(): @@ -64,3 +98,4 @@ def main(): main.add_command(consultaResolucionesFacturacion) main.add_command(SendTestSetAsync) +main.add_command(generate_invoice) diff --git a/facho/facho.py b/facho/facho.py index 8418459..47026ef 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -6,6 +6,12 @@ from lxml.etree import Element, SubElement, tostring import re +class FachoXMLExtension: + + def build(self, fachoxml): + raise NotImplementedError + + class LXMLBuilder: """ extrae la manipulacion de XML diff --git a/facho/fe/fe.py b/facho/fe/fe.py index 5300dfd..787c33a 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -1,7 +1,7 @@ # This file is part of facho. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. -from ..facho import FachoXML +from ..facho import FachoXML, FachoXMLExtension import xmlsig import xades from datetime import datetime @@ -40,7 +40,7 @@ class FeXML(FachoXML): -class DianXMLExtensionSoftwareSecurityCode: +class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension): # RESOLUCION 0001: pagina 535 def __init__(self, id_software: str, pin: str, invoice_ident: str): @@ -56,7 +56,8 @@ class DianXMLExtensionSoftwareSecurityCode: return dian_path, m.hexdigest() -class DianXMLExtensionSigner: +class DianXMLExtensionSigner(FachoXMLExtension): + # RESOLUCION 0001: pagina 516 POLICY_ID = 'https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf' POLICY_NAME = 'Dian' diff --git a/setup.py b/setup.py index 8542879..2482a5f 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,10 @@ setup( license="GNU General Public License v3", long_description=readme + '\n\n' + history, include_package_data=True, + package_data = { + # If any package contains *.txt or *.rst files, include them: + '': ['*.gc'] + }, keywords='facho', name='facho', packages=find_packages(exclude=("tests",)),