Exemplo n.º 1
0
 def wa(tf):
     """
     The sundry work arounds to apply
     """
     HelperStr.edit_pattern('TipoCambio="1.0"', 'TipoCambio="1"', tf)
     HelperStr.edit_pattern(
         '(Importe=)"([0-9]*(\.[0-9]{0,1})?)"',
         lambda x: 'Importe="%.2f"' % (float(x.group(2)),), tf
     )
Exemplo n.º 2
0
        def paste_tag_pagos(tf, elements):

            import xml.dom.minidom

            doc = xml.dom.minidom.Document()
            base_ns = "http://www.sat.gob.mx/Pagos"
            pagos = doc.createElementNS(base_ns, 'pago10:Pagos')
            pagos.setAttribute("xmlns:pago10", base_ns)
            pagos.setAttribute(
                "xsi:schemaLocation",
                "http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd"
            )
            pagos.setAttribute("Version", "1.0")

            for d in elements:
                payment = doc.createElement('pago10:Pago')
                payment.setAttribute('NumOperacion', d['NUMERO_OPERACION'])
                payment.setAttribute('Monto', d['MONTO'])
                payment.setAttribute('MonedaP', d['ISO_4217'])
                #GAS payment.setAttribute('TipoCambioP', d['TIPO_DE_CAMBIO'])

                if (d['ISO_4217']) == 'USD':
                    payment.setAttribute('TipoCambioP', d['TIPO_DE_CAMBIO'])

                payment.setAttribute('FormaDePagoP', d['CLAVE'])
                payment.setAttribute('FechaPago', d['TIME_STAMP'])

                dr = doc.createElement('pago10:DoctoRelacionado')
                dr.setAttribute('IdDocumento', d['UUID_DOC'])
                dr.setAttribute('ImpSaldoInsoluto', d['IMP_SALDO_INSOLUTO'])
                dr.setAttribute('ImpSaldoAnt', d['IMP_SALDO_ANT'])
                dr.setAttribute('ImpPagado', d['IMP_PAGADO'])
                dr.setAttribute('MonedaDR', d['MONEDA_DR'])
                dr.setAttribute('NumParcialidad', '1')
                dr.setAttribute('MetodoDePagoDR', 'PPD')
                if (d['MONEDA_DR']) == 'USD':
                    if (d['ISO_4217']) == 'MXN':
                        dr.setAttribute('TipoCambioDR', d['TIPO_DE_CAMBIO_DR'])

                payment.appendChild(dr)

                pagos.appendChild(payment)

            doc.appendChild(pagos)
            content_xml = output = doc.toprettyxml()
            chunk = "{}\n{}\n{}\n{}".format(
                '<cfdi:Complemento>',
                content_xml[22:],  # omits xml declaration
                '</cfdi:Complemento>',
                '</cfdi:Comprobante>')
            HelperStr.edit_pattern('</cfdi:Comprobante>', chunk, tf)
Exemplo n.º 3
0
    def format_wrt(self, output_file, dat):
        self.logger.debug('dumping contents of dat: {}'.format(repr(dat)))

        def save(xo):
            tmp_dir = tempfile.gettempdir()
            f = os.path.join(tmp_dir, HelperStr.random_str())
            writedom_cfdi(xo.toDOM(), self.__MAKEUP_PROPOS, f)
            return f

        c = Comprobante()
        c.Version = '3.3'
        c.Serie = dat['CONTROL']['SERIE']  # optional
        c.Folio = dat['CONTROL']['FOLIO']  # optional
        c.Fecha = dat['TIME_STAMP']
        c.Sello = '__DIGITAL_SIGN_HERE__'
        c.FormaPago = dat["FORMA_PAGO"]['CLAVE']  # optional
        c.NoCertificado = dat['NUMERO_CERTIFICADO']
        c.Certificado = dat['CERT_B64']
        c.SubTotal = dat['TOTALES']['IMPORTE_SUM']
        c.Descuento = dat['TOTALES'][
            'DESCTO_SUM'] if dat['TOTALES']['DESCTO_SUM'] > 0 else None
        c.Total = dat['TOTALES']['MONTO_TOTAL']
        if dat['MONEDA']['ISO_4217'] == 'MXN':
            c.TipoCambio = 1
        else:
            # optional (requerido en ciertos casos)
            c.TipoCambio = truncate(dat['MONEDA']['TIPO_DE_CAMBIO'],
                                    self.__NDECIMALS)
        c.Moneda = dat['MONEDA']['ISO_4217']
        c.TipoDeComprobante = 'I'
        c.MetodoPago = dat['METODO_PAGO']  # optional
        c.LugarExpedicion = dat['LUGAR_EXPEDICION']

        c.Emisor = pyxb.BIND()
        c.Emisor.Nombre = dat['EMISOR']['RAZON_SOCIAL']  # optional
        c.Emisor.Rfc = dat['EMISOR']['RFC']
        c.Emisor.RegimenFiscal = dat['EMISOR']['REGIMEN_FISCAL']

        c.Receptor = pyxb.BIND()
        c.Receptor.Nombre = dat['RECEPTOR']['RAZON_SOCIAL']  # optional
        c.Receptor.Rfc = dat['RECEPTOR']['RFC']
        c.Receptor.UsoCFDI = dat['RECEPTOR']['USO_CFDI']

        c.Conceptos = pyxb.BIND()
        for i in dat['CONCEPTOS']:
            c.Conceptos.append(
                pyxb.BIND(
                    Cantidad=i['CANTIDAD'],
                    ClaveUnidad=i['UNIDAD'],
                    ClaveProdServ=i['PRODSERV'],
                    Descripcion=i['DESCRIPCION'],
                    ValorUnitario=i['PRECIO_UNITARIO'],
                    NoIdentificacion=i['SKU'],  # optional
                    Importe=truncate(i['IMPORTE'], self.__NDECIMALS),
                    Descuento=i['DESCTO'] if i['DESCTO'] > 0 else None,
                    Impuestos=self.__tag_impuestos(i)
                    if i['TASA_IMPUESTO'] > 0 else None))

        def traslado(c, tc, imp):
            return pyxb.BIND(TipoFactor='Tasa',
                             Impuesto=c,
                             TasaOCuota=tc,
                             Importe=imp)

        def zigma(v):
            z = Decimal(0)
            for w in v:
                z += self.__narf(w['importe'])
            return float(z)

        c.Impuestos = pyxb.BIND(
            TotalImpuestosRetenidos=0,
            TotalImpuestosTrasladados=zigma(dat['TRASLADOS']),
            Traslados=pyxb.BIND(*tuple([
                traslado(t['clave'], self.__place_tasa(t['tasa']),
                         t['importe']) for t in dat['TRASLADOS']
            ])))

        tmp_file = save(c)
        HelperStr.edit_pattern('TipoCambio="1.0"', 'TipoCambio="1"',
                               tmp_file)  # XXX: Horrible workaround
        HelperStr.edit_pattern(
            '(Descuento=)"([0-9]*(\.[0-9]{0,1})?)"',
            lambda x: 'Descuento="%.2f"' % (float(x.group(2)), ), tmp_file)
        HelperStr.edit_pattern(
            '(Importe=)"([0-9]*(\.[0-9]{0,1})?)"', lambda x: 'Importe="%.2f"' %
            (float(x.group(2)), ), tmp_file)
        with open(output_file, 'w', encoding="utf-8") as a:
            a.write(sign_cfdi(dat['KEY_PRIVATE'], dat['XSLT_SCRIPT'],
                              tmp_file))
        os.remove(tmp_file)
Exemplo n.º 4
0
 def two_dec_attr(attr):
     HelperStr.edit_pattern(
         '(' + attr + '=)"([0-9]*(\.[0-9]{0,1})?)"',
         lambda x: attr + '="%.2f"' % (float(x.group(2)), ), tf)
Exemplo n.º 5
0
        def wa(tf):
            """
            The sundry work arounds to apply
            """
            def two_dec_attr(attr):
                HelperStr.edit_pattern(
                    '(' + attr + '=)"([0-9]*(\.[0-9]{0,1})?)"',
                    lambda x: attr + '="%.2f"' % (float(x.group(2)), ), tf)

            HelperStr.edit_pattern('ValorUnitario="0.0"', 'ValorUnitario="0"',
                                   tf)
            HelperStr.edit_pattern('Importe="0(\.0{1})"', 'Importe="0"', tf)
            HelperStr.edit_pattern('Cantidad="1.0"', 'Cantidad="1"', tf)
            HelperStr.edit_pattern('TipoCambio="1.0"', 'TipoCambio="1"', tf)
            HelperStr.edit_pattern('Total="0.0"', 'Total="0"', tf)
            HelperStr.edit_pattern('SubTotal="0.0"', 'SubTotal="0"', tf)

            for a in ['Monto', 'ImpSaldoInsoluto', 'ImpPagado', 'ImpSaldoAnt']:
                two_dec_attr(a)