def format_wrt(self, output_file, dat): c = Comprobante() c.Version = '3.3' c.Folio = "test attribute" #optional c.Fecha = '{0:%Y-%m-%dT%H:%M:%S}'.format(datetime.datetime.now()) c.Sello = "BLABLALASELLO" c.FormaPago = "01" #optional c.NoCertificado = "00001000000202529199" c.Certificado = "certificado en base64" c.SubTotal = "4180.0" c.Total = "4848.80" c.Moneda = "MXN" c.TipoCambio = "1.0" #optional (requerido en ciertos casos) c.TipoDeComprobante = 'I' # c.metodoDePago = "NO IDENTIFICADO" #optional c.LugarExpedicion = "60050" c.Emisor = pyxb.BIND() c.Emisor.Nombre = "PRODUCTOS INDUSTRIALES SAAR S.A. DE C.V." #opcional c.Emisor.Rfc = "PIS850531CS4" c.Emisor.RegimenFiscal = '601' c.Receptor = pyxb.BIND() c.Receptor.Nombre = "PRODUCTOS INDUSTRIALES SAAR S.A. DE C.V." #opcional c.Receptor.Rfc = "PIS850531CS4" c.Receptor.UsoCFDI = 'G01' c.Conceptos = pyxb.BIND( pyxb.BIND(Cantidad=5, ClaveUnidad='C81', ClaveProdServ='01010101', Descripcion='Palitroche', ValorUnitario='10', Importe='50')) writedom_cfdi(c.toDOM(), self.__MAKEUP_PROPOS, output_file)
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 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 wrap_up(tf, of): with open(of, 'w', encoding="utf-8") as a: a.write( sign_cfdi( dat['KEY_PRIVATE'], dat['XSLT_SCRIPT'], tf ) ) os.remove(tf) c = Comprobante() c.Version = '3.3' c.MetodoPago = "PPD" # optional and hardcode until ui can suply such value c.LugarExpedicion = dat['LUGAR_EXPEDICION'] 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.TipoDeComprobante = 'E' c.SubTotal = dat['TOTALES']['IMPORTE_SUM'] 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.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=i['IMPORTE'], 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 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) wa(tmp_file) wrap_up(tmp_file, output_file)