se agrego el modulo sunat_schema.py que lee el archivo xml y extrae la información
This commit is contained in:
1 parent
937c4d6260
commit
99b7caf535
4 files changed
+516
-11
No files matched your search
@@ -1,11 +1,11 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
import email_utilities
|
||||
import outlook_utilities
|
||||
import database_utilities
|
||||
import logger_utilities
|
||||
import sunat_schema
|
||||
from datetime import datetime, timedelta
|
||||
from config_loader import CONFIG
|
||||
|
||||
@@ -77,6 +77,67 @@ def dejar_mail_si_tiene_adjunto_pdf_o_xml(emails):
|
||||
return emails_con_pdf_o_xml
|
||||
|
||||
########################################################
|
||||
def leer_xml_obtener_datos_validos(emails):
|
||||
json_final = []
|
||||
for e in emails:
|
||||
print(f"\n📬 [{e['fecha']}] {e['subject'][:80]}...")
|
||||
#adjuntos originales
|
||||
print(f" ├── 📂 Adjuntos originales:")
|
||||
|
||||
for idx, a in enumerate(e['adjuntos']):
|
||||
prefijo = " │ └── " if idx == len(e['adjuntos'])-1 else " │ ├── "
|
||||
print(f"{prefijo}{a}")
|
||||
if a.lower().endswith(".xml"):
|
||||
# procesar archivo xml de SUNAT
|
||||
carpeta_adjuntos = os.path.join(os.path.dirname(__file__), CONFIG.client.ruta_descarga)
|
||||
archivo_xml = os.path.join(carpeta_adjuntos, a)
|
||||
print(f" │ 📄 Procesando XML: {a}")
|
||||
data = sunat_schema.extraer_datos_xml(archivo_xml)
|
||||
if data:
|
||||
print(f" │ ✅ Factura extraída: {data.get('serie')}-{data.get('numero')}")
|
||||
json_final.append(data)
|
||||
else:
|
||||
print(" │ ℹ️ XML sin datos (no es factura tipo 01)")
|
||||
|
||||
# opcional: guardar JSON junto al XML
|
||||
archivo_json = f"ejecucion_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.json"
|
||||
with open(archivo_json, "w", encoding="utf-8") as f:
|
||||
json.dump(json_final, f, ensure_ascii=False, indent=4)
|
||||
|
||||
return json_final
|
||||
|
||||
########################################################
|
||||
def anidar_guias_en_facturas(json_final):
|
||||
# obtener solo facturas
|
||||
facturas = [item for item in json_final if item.get("tipo") == "01"]
|
||||
|
||||
# obtener solo guias
|
||||
guias = [item for item in json_final if item.get("tipo") == "31"]
|
||||
|
||||
# recorrer cada factura y buscar guias relacionadas de campo "documento_relacionado" que tenga el mismo numero de serie y numero
|
||||
for factura in facturas:
|
||||
# obtener la guia de tipo ='31' de los documemtos_relacionados
|
||||
guias_transporte = [item for item in factura.get("documentos_referencia", []) if item.get("tipo") == "31"]
|
||||
|
||||
# buscar en la lista de guias si existe una guia que tenga el mismo numero de serie y numero que la guia de transporte
|
||||
for guia in guias_transporte:
|
||||
guia_encontrada = next((g for g in guias if g.get("serie")== guia.get("serie")
|
||||
and g.get("numero")== guia.get("numero")), None)
|
||||
if guia_encontrada:
|
||||
# si se encuentra, anidar la guia dentro de la factura en un nuevo campo "guia_trasporte"
|
||||
factura["guia_transporte"] = guia_encontrada
|
||||
print(f" ├── 📦 Guía {guia_encontrada.get('serie')}-{guia_encontrada.get('numero')} anidada en factura {factura.get('serie')}-{factura.get('numero')}")
|
||||
else:
|
||||
print(f" ├── ⚠️ Guía {guia.get('serie')}-{guia.get('numero')} no encontrada para factura {factura.get('serie')}-{factura.get('numero')}")
|
||||
|
||||
# opcional: guardar JSON junto al XML
|
||||
archivo_json = f"anidado_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.json"
|
||||
with open(archivo_json, "w", encoding="utf-8") as f:
|
||||
json.dump(facturas, f, ensure_ascii=False, indent=4)
|
||||
|
||||
|
||||
return facturas
|
||||
########################################################
|
||||
def main():
|
||||
|
||||
# Inicializar Base de Datos
|
||||
@@ -84,7 +145,7 @@ def main():
|
||||
|
||||
# Calcular fechas
|
||||
hoy = datetime.now()
|
||||
ayer = hoy - timedelta(days=25)
|
||||
ayer = hoy - timedelta(days=30)
|
||||
|
||||
fecha_inicio = ayer.strftime("%Y-%m-%d")
|
||||
fecha_fin = hoy.strftime("%Y-%m-%d")
|
||||
@@ -116,16 +177,12 @@ def main():
|
||||
# también se eliminar los adjuntos no que sean xml y pdf
|
||||
emails = dejar_mail_si_tiene_adjunto_pdf_o_xml(emails)
|
||||
|
||||
# obtener datos de los archivos xml y generar JSON final
|
||||
json_final = leer_xml_obtener_datos_validos(emails)
|
||||
|
||||
anidar_guias_en_facturas(json_final)
|
||||
|
||||
|
||||
for e in emails:
|
||||
print(f"\n📬 [{e['fecha']}] {e['subject'][:80]}...")
|
||||
|
||||
#adjuntos originales
|
||||
print(f" ├── 📂 Adjuntos originales:")
|
||||
for idx, a in enumerate(e['adjuntos']):
|
||||
prefijo = " │ └── " if idx == len(e['adjuntos'])-1 else " │ ├── "
|
||||
print(f"{prefijo}{a}")
|
||||
|
||||
########################################################
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in new issue
Block a user