def caratula_aec(self): dte_cedido = self.Cesion.dte_cedido() doc_cedido = self.Cesion.xml_doc_cedido() xml = '''<DocumentoAEC ID="{0}"> <Caratula version="1.0"> <RutCedente>{1}</RutCedente> <RutCesionario>{2}</RutCesionario> <NmbContacto>{3}</NmbContacto> <FonoContacto>{4}</FonoContacto> <MailContacto>{5}</MailContacto> <TmstFirmaEnvio>{6}</TmstFirmaEnvio> </Caratula> <Cesiones> {7} </Cesiones> </DocumentoAEC> '''.format( self.Cesion.ID, self.Emisor.RUTEmisor, self.Cesion._cesionario.RUT, self.Cesion._cedente.Nombre, self.Cesion._cedente.Phono, self.Cesion._cedente.eMail, util.time_stamp(), (dte_cedido + '\n' + doc_cedido), ) return xml
def set_barcode(self, xml): ted = False folio = self.Folio timbre = """<TED><DD><RE>99999999-9</RE><TD>11</TD><F>1</F>\ <FE>2000-01-01</FE><RR>99999999-9</RR><RSR>\ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</RSR><MNT>10000</MNT><IT1>IIIIIII\ </IT1></DD></TED>""" parser = etree.XMLParser(remove_blank_text=True) result = etree.fromstring(timbre, parser=parser) xml.append(result) result.find('DD/RE').text = self.Emisor.RUTEmisor result.find('DD/TD').text = str(self.TipoDTE) result.find('DD/F').text = str(folio) if not self.FechaEmis: raise UserError("Problema con la fecha %s" % self.FechaEmis) result.find('DD/FE').text = self.FechaEmis if not self._receptor.RUTRecep: raise UserError("Completar RUT del Receptor") result.find('DD/RR').text = self._receptor.RUTRecep result.find('DD/RSR').text = util._acortar_str( self._receptor.RznSocRecep, 40) result.find('DD/MNT').text = str(self.MntTotal) if self.no_product: result.find('DD/MNT').text = '0' for line in self._lineas_detalle: if line.NroLinDet == 1: result.find('DD/IT1').text = util._acortar_str( line.NmbItem, 40) break resultcaf = self.caf_files.get_caf_file(folio, self.TipoDTE) result.find('DD').append(resultcaf.find('CAF')) timestamp = util.time_stamp() etree.SubElement(result.find('DD'), 'TSTED').text = timestamp keypriv = resultcaf.find('RSASK').text.replace('\t', '') ddxml = etree.tostring(result.find('DD'), encoding="ISO-8859-1", xml_declaration=False).replace(b'\n', b'') firma_caf = Firma({ 'priv_key': keypriv, 'init_signature': False, 'rut_firmante': '60803000-K', }) frmt = firma_caf.generar_firma(ddxml) result.set("version", "1.0") ted_xml = etree.SubElement(result, 'FRMT') ted_xml.set("algoritmo", "SHA1withRSA") ted_xml.text = frmt ted = etree.tostring(result, encoding="ISO-8859-1", xml_declaration=False).replace(b'\n', b'') self.sii_barcode = ted image = False if ted: barcodefile = BytesIO() image = self.pdf417bc(ted) image.save(barcodefile, 'PNG') data = barcodefile.getvalue() self.sii_barcode_img = base64.b64encode(data) ted_xml = etree.SubElement(xml, 'TmstFirma') ted_xml.text = timestamp
def _caratula_recep(self): caratula = collections.OrderedDict() caratula['RutResponde'] = self.RutResponde caratula['RutRecibe'] = self.RutRecibe caratula['NmbContacto'] = self.NmbContacto caratula['FonoContacto'] = self.FonoContacto caratula['MailContacto'] = self.MailContacto caratula['TmstFirmaEnv'] = util.time_stamp() return caratula
def _caratula_respuesta(self): caratula = collections.OrderedDict() caratula['RutResponde'] = self.RutResponde caratula['RutRecibe'] = self.RutRecibe caratula['IdRespuesta'] = self.IdRespuesta caratula['NroDetalles'] = self.NroDetalles caratula['NmbContacto'] = self.NmbContacto caratula['FonoContacto'] = self.FonoContacto caratula['MailContacto'] = self.MailContacto caratula['TmstFirmaResp'] = util.time_stamp() return caratula
def doc_cedido(self, id): xml = '''<DocumentoDTECedido ID="{0}"> {1} <TmstFirma>{2}</TmstFirma> </DocumentoDTECedido> '''.format( id, self.xml_dte, util.time_stamp(), ) return xml
def recibo(self, r): receipt = collections.OrderedDict() receipt['TipoDoc'] = r.TipoDTE receipt['Folio'] = r.Folio receipt['FchEmis'] = r.FechaEmis receipt['RUTEmisor'] = r._dte_emisor.RUTEmisor receipt['RUTRecep'] = r._receptor.RUTRecep receipt['MntTotal'] = r.MntTotal receipt['Recinto'] = self.Recinto receipt['RutFirma'] = self.firma.rut_firmante receipt['Declaracion'] = r.Declaracion receipt['TmstFirmaRecibo'] = util.time_stamp() etree_receipt = util.create_xml({"item": receipt}) return util.xml_to_string(etree_receipt)
def _receipt(self): envio = self.xml_envio resp = collections.OrderedDict() resp['NmbEnvio'] = self.xml_nombre resp['FchRecep'] = util.time_stamp() resp['CodEnvio'] = util._acortar_str(self.CodEnvio, 10) resp['EnvioDTEID'] = envio.find('SetDTE').attrib['ID'] resp['Digest'] = envio.find( "Signature/SignedInfo/Reference/DigestValue").text self._validar_caratula(envio.find('SetDTE/Caratula')) if self.EstadoRecepEnv == 0: self._check_digest_caratula() resp['RutEmisor'] = envio.find('SetDTE/Caratula/RutEmisor').text resp['RutReceptor'] = envio.find('SetDTE/Caratula/RutReceptor').text resp['EstadoRecepEnv'] = str(self.EstadoRecepEnv) resp['RecepEnvGlosa'] = self.RecepEnvGlosa NroDTE = len(envio.findall('SetDTE/DTE')) resp['NroDTE'] = NroDTE resp['item'] = self._validar_dtes() return resp
def caratula_dte(self, EnvioDTE, SubTotDTE): xml = '''<SetDTE ID="SetDoc"> <Caratula version="1.0"> <RutEmisor>{0}</RutEmisor> <RutEnvia>{1}</RutEnvia> <RutReceptor>{2}</RutReceptor> <FchResol>{3}</FchResol> <NroResol>{4}</NroResol> <TmstFirmaEnv>{5}</TmstFirmaEnv> {6}</Caratula>{7} </SetDTE> '''.format(self.Emisor.RUTEmisor, self.firma_electronica.rut_firmante\ if self.firma_electronica else '66666666-6', self.RutReceptor, self.Emisor.FchResol, self.Emisor.NroResol, util.time_stamp(), SubTotDTE, EnvioDTE) return xml
def xml_doc_cedido(self): data = collections.OrderedDict() data['SeqCesion'] = self.SeqCesion data['IdDTE'] = self.IdDTE data['Cedente'] = self.Cedente data['Cesionario'] = self.Cesionario data['MontoCesion'] = self.MontoCesion data['UltimoVencimiento'] = self.UltimoVencimiento data['TmstCesion'] = util.time_stamp() xml = self._dte_to_xml({'item': data}) xml_pret = etree.tostring(xml, pretty_print=True, encoding="ISO-8859-1", xml_declaration=False).decode('ISO-8859-1') doc_cesion_xml = self._crear_info_trans_elec_aec(xml_pret) cesion_xml = self._crear_info_cesion(doc_cesion_xml) cesion = self.firmar( cesion_xml, "CesDoc_%s" % str(self.SeqCesion), 'cesion', ) return cesion.replace('<?xml version="1.0" encoding="ISO-8859-1"?>\n', '')
def caratula_consumo_folios(self, cf, IdEnvio='SetDoc'): if cf.Correlativo != 0: Correlativo = "<Correlativo>"\ + str(cf.Correlativo) + "</Correlativo>" else: Correlativo = '' xml = '''<DocumentoConsumoFolios ID="{10}"> <Caratula version="1.0" > <RutEmisor>{0}</RutEmisor> <RutEnvia>{1}</RutEnvia> <FchResol>{2}</FchResol> <NroResol>{3}</NroResol> <FchInicio>{4}</FchInicio> <FchFinal>{5}</FchFinal>{6} <SecEnvio>{7}</SecEnvio> <TmstFirmaEnv>{8}</TmstFirmaEnv> </Caratula> {9} </DocumentoConsumoFolios> '''.format(self.Emisor.RUTEmisor, self.firma_electronica.rut_firmante, self.Emisor.FchResol, self.Emisor.NroResol, cf.FchInicio, cf.FchFinal, Correlativo, str(cf.SecEnvio), util.time_stamp(), cf.sii_xml_request, IdEnvio) return xml
def validar(self): resumenes = [] resumenesPeriodo = {} resumenPeriodo = {} for rec in self.Documento: rec.sended = True TpoDoc = rec.TipoDTE if TpoDoc not in resumenesPeriodo and self.TipoOperacion != 'GUIA': resumenesPeriodo[TpoDoc] = {} if self.TipoOperacion == 'BOLETA': resumen = self.getResumenBoleta(rec) resumenesPeriodo[TpoDoc] = self._setResumenPeriodoBoleta( resumen, resumenesPeriodo[TpoDoc]) del(resumen['MntNeto']) del(resumen['MntIVA']) del(resumen['TasaIVA']) elif self.TipoOperacion == 'GUIA': resumen = self.getResumenGuia(rec) resumenes.extend([{'Detalle': resumen}]) resumenPeriodo = self._setResumenPeriodoGuias( resumen, resumenPeriodo) else: resumen = self.getResumen(rec) resumenes.extend([{'Detalle': resumen}]) if self.TipoOperacion not in ['BOLETA', 'GUIA']: resumenesPeriodo[TpoDoc] = self._setResumenPeriodo( resumen, resumenesPeriodo[TpoDoc]) if self.boletas: # no es el libro de boletas especial for boletas in self.boletas: resumenesPeriodo[boletas.TipoDTE] = {} resumen = self._setResumenBoletas(boletas) del(resumen['TotDoc']) resumenesPeriodo[boletas.TipoDTE] = self._setResumenPeriodo( resumen, resumenesPeriodo[boletas.TipoDTE]) # resumenes.extend([{'Detalle':resumen}]) lista = ['TpoDoc', 'TpoImp', 'TotDoc', 'TotAnulado', 'TotMntExe', 'TotMntNeto', 'TotalesServicio', 'TotOpIVARec', 'TotMntIVA', 'TotMntIVA', 'TotOpActivoFijo', 'TotMntActivoFijo', 'TotMntIVAActivoFijo', 'TotIVANoRec', 'TotOpIVAUsoComun', 'TotIVAUsoComun', 'FctProp', 'TotCredIVAUsoComun', 'itemOtrosImp', 'TotImpSinCredito', 'TotIVARetTotal', 'TotIVARetParcial', 'TotMntTotal', 'TotIVANoRetenido', 'TotTabPuros', 'TotTabCigarrillos', 'TotTabElaborado', 'TotImpVehiculo', 'TotFolAnulado', 'TotGuiaAnulada', 'TotGuiaVenta', 'TotMntGuiaVta', 'TotMntModificado', 'itemTraslado'] ResumenPeriodo = [] dte = collections.OrderedDict() for r, value in resumenesPeriodo.items(): total = collections.OrderedDict() for v in lista: if v in value: total[v] = value[v] ResumenPeriodo.extend([{'TotalesPeriodo': total}]) #dte['ResumenPeriodo'] = ResumenPeriodo #dte_etree = util.create_xml({'item': dte}) #util.create_xml(resumenes, dte_etree) if self.TipoOperacion == 'GUIA': ResumenPeriodo = collections.OrderedDict() for f in lista: if f in resumenPeriodo: ResumenPeriodo[f] = resumenPeriodo[f] dte['ResumenPeriodo'] = ResumenPeriodo dte['item'] = resumenes dte['TmstFirma'] = util.time_stamp() dte_etree = util.create_xml({'item': dte}) self.sii_xml_request = util.xml_to_string(dte_etree) return True
def timestamp_timbre(self): if not hasattr(self, '_timestamp_timbre') or not self._timestamp_timbre: self._timestamp_timbre = util.time_stamp() return self._timestamp_timbre