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 )
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)
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)
def two_dec_attr(attr): HelperStr.edit_pattern( '(' + attr + '=)"([0-9]*(\.[0-9]{0,1})?)"', lambda x: attr + '="%.2f"' % (float(x.group(2)), ), tf)
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)