Merge branch 'fix_generate_qr'
noe.izquierdo authored
5960ce4f

# l10n_mx_ir_attachment_facture modulo

Este modulo esta destinado a ser el principal manejador cuando se trate de timbrar un documento en el SAT. El modulo maneja todo el proceso necesario; desde la creacion del archivo XML, pasando por la creacion el sello digital, timbrado del XML en el SAT, hasta la creacion del archivo PDF

## Uso del modulo

El archivo python principal de este modulo es ir_attachment_facture.py. Los otros archivos python solo se encargan de proporcionar una relacion entre el archivo ir_attachment_facture.py con el resto del ERP. Por ejemplo analizemos account_journal.py:

sign_sat = fields.Boolean(
    'Sign SAT', copy=False,
    help='If this field is enabled, then sign through the'
    ' webservice of the Mexican SAT'
)
param_pacs = fields.One2many(
    'params.pac', 'pararm_pac_id'
)

sign_sat es usado para indicarle al ERP si los documentos creados en el diario deben ser timbrados en el SAT o no

param_pacs nos permite seleccionar los proveedores PACs que queremos esten disponibles en ese diario, pueden ser tantos como el ERP tenga disponibles

![Configuracion de diario](diario_configuracion.png)

### ir_attachment_facture.py

Este archivo de python tienen dos funciones principales:

  1. Una de ellas es sign_cfdi_sat, la cual es usada para timbrar uno o muchos CFDIs ante el SAT.
  2. La segunda funcion es cancel_cfdi_sat, la cual es usada para cancelar CFDIs

Hablando de timbrar un CFDI podemos revisemos los siguientes datos importantes:

  1. Cuando se emite un CFDI, los pasos para timbrarlo ante el SAT son siempre los mismos, no importa de que tipo de CFDI se trate.
  2. Los unicos cambios en el proceso de timbrar un CFDI de un tipo o uno de otro, son la estructura de los arhivos XML y PDF, todo lo demas se mantiene igual.

Entonces este archivo realiza todo el funcionamiento en general y deja para ir_attachment_facturae_config.py el resto

En resumen:

  1. Ningun otro modulo nececista agregar funcionalidad alguna para tener su CFDI timbrado ante el SAT, este modulo lo hace todo
  2. Cualquier modulo que quiera hacer uso de este modulo debe añadir un registro en la tabla ir_attachment_facture_config

### ir_attachment_facturae_config.py

Que es esto??

Como comentamos anteriormente, la unica diferencia al momento de timbar una factura y una nomia, por dar un ejemmplo, es la estructura de sus archivos XML y PDF.

Entoces lo que la tabla ir_attachment_facture_config contiene es

La tabla ir_attachment_facturae_config debe contener la refencia a las plantillas a usar para la generacion del XML y PDF (tanto de timbrado como de cancelacion)

Un ejemplo tomado del modulo l10n_mx_facturae: > Note: El modulo l10n_mx_facturae se conectara al modulo l10n_mx_ir_attachment para que juntos puedan timbrar una factura >

Solo dos cosas requiere hacer el modulo l10n_mx_facturae

  1. Crear una entrada en ir_attachment_facture_config:

    <record model="ir.attachment.facturae.mx.config" id="ir_attachment_facturae_mx_config_invoice">
        <field name="model">account.invoice</field>
        <field name="template_xml_sign">invoice.report.aaero.xml</field>
        <field name="template_pdf_sign">invoice.report.aaero</field>
    </record>
  2. Llamar a la funcion sign_cfdi_sat:

    def sign_invoice_sat(self, cr, uid, ids, context=None):
        context = dict(context or {})
        ir_attach_obj = self.pool.get('ir.attachment.facturae.mx')
        for account_invoice in self.browse(cr, uid, ids, context):
            if account_invoice.journal_id.sign_sat:
                ir_attach_obj.sign_cfdi_sat(
                    cr, uid, ids, object_id=account_invoice.id,
                    object_model='account.invoice',**
                    name=account_invoice.fname_invoice)

### Como funciona sign_cfdi_sat:

Busca en la tabla ir_attachment_facture_config que tenga modelo
igual al parametro object_model
if Existe alguna entrada:
    if no existe un objeto ir_attachment_facture previo relacionado con el documento a timbrar en el SAT:
        1.- Recrear objecto a timbrar usado los paramentros pasados a la funcion
                (_object_model_ y _object_id_),
        2.- Crear objecto ir_attachment_facturae
        3.- Crear archivo XML
        4.- Firmar archivo XML usando los certificados cargados en el ERP
        5.- Mandar a timbrar el archivo timbrado, pasando como paremetro todos
            los PACs posibles que se seleccionaron a usar en el diario.
            El diario se lee del objecto recreado en el paso 1
        6.- Guardar XML timbrado en ir_attachment, pero haciendo referencia al
            objecto recreado en paso 1
        7.- Crear archivo PDF
        8.- Guardar archivo PDF creado en ir_attachment, pero haciendo referencia al
            objecto recreado en paso 1
else:
    Mandar mensaje de Error al usuario

### Descripcion de los parametros de sign_cfdi_sat

A continuacion se describe los paramentros que recibe la funcion y su uso

  1. object_id: Id del objecto a timbrar. Ejemplo: 150
  2. object_model: Nombre del modelo a timbrar. Ejemplo: account.invoice
  3. name: Nombre que tendran los archivos adjuntos. Ejemplo: F-150