coves y edocuments

This commit is contained in:
2025-08-05 07:36:15 -06:00
parent 975fed6f81
commit 5b492b0caa
4 changed files with 84 additions and 504 deletions

View File

@@ -0,0 +1,13 @@
import os
from utils.peticiones import extract_pdf_bytes_from_xml
xml_path = os.path.abspath("./test.xml")
result = extract_pdf_bytes_from_xml(xml_path)
if result and result["pdf_bytes"]:
with open("output_test.pdf", "wb") as f:
f.write(result["pdf_bytes"])
print("PDF extraído y guardado como output_test.pdf")
else:
print("No se pudo extraer el PDF del XML.")

68
main.py
View File

@@ -5,40 +5,40 @@ from api.api_v1.api import api_router
from fastapi.middleware.cors import CORSMiddleware
# Configuración inicial del logging (debe estar al inicio del archivo)
logging.config.dictConfig({
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(asctime)s | %(name)s | %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S",
"use_colors": True,
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": '%(levelprefix)s %(asctime)s | %(client_addr)s | "%(request_line)s" %(status_code)s',
"datefmt": "%Y-%m-%d %H:%M:%S",
},
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout",
},
"access": {
"formatter": "access",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout",
},
},
"loggers": {
"": {"handlers": ["default"], "level": "DEBUG"},
"uvicorn.error": {"level": "DEBUG"},
"uvicorn.access": {"handlers": ["access"], "level": "DEBUG", "propagate": False},
},
})
# logging.config.dictConfig({
# "version": 1,
# "disable_existing_loggers": False,
# "formatters": {
# "default": {
# "()": "uvicorn.logging.DefaultFormatter",
# "fmt": "%(levelprefix)s %(asctime)s | %(name)s | %(message)s",
# "datefmt": "%Y-%m-%d %H:%M:%S",
# "use_colors": True,
# },
# "access": {
# "()": "uvicorn.logging.AccessFormatter",
# "fmt": '%(levelprefix)s %(asctime)s | %(client_addr)s | "%(request_line)s" %(status_code)s',
# "datefmt": "%Y-%m-%d %H:%M:%S",
# },
# },
# "handlers": {
# "default": {
# "formatter": "default",
# "class": "logging.StreamHandler",
# "stream": "ext://sys.stdout",
# },
# "access": {
# "formatter": "access",
# "class": "logging.StreamHandler",
# "stream": "ext://sys.stdout",
# },
# },
# "loggers": {
# "": {"handlers": ["default"], "level": "DEBUG"},
# "uvicorn.error": {"level": "DEBUG"},
# "uvicorn.access": {"handlers": ["access"], "level": "DEBUG", "propagate": False},
# },
# })
def create_application() -> FastAPI:
"""Función factory para crear la aplicación FastAPI"""

439
test.xml
View File

@@ -1,439 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
S:mustUnderstand="1">
<wsu:Timestamp
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2025-07-10T14:24:04Z</wsu:Created>
<wsu:Expires>2025-07-10T14:25:04Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</S:Header>
<S:Body>
<ns2:consultarPedimentoCompletoRespuesta
xmlns="http://www.ventanillaunica.gob.mx/pedimentos/ws/oxml/comunes"
xmlns:ns2="http://www.ventanillaunica.gob.mx/pedimentos/ws/oxml/consultarpedimentocompleto"
xmlns:ns3="http://www.ventanillaunica.gob.mx/common/ws/oxml/respuesta"
xmlns:ns4="http://www.ventanillaunica.gob.mx/common/ws/oxml/resolucion"
xmlns:ns5="http://www.ventanillaunica.gob.mx/common/ws/oxml/respuestatra"
xmlns:ns6="http://www.ventanillaunica.gob.mx/common/ws/oxml/dictamen"
xmlns:ns7="http://www.ventanillaunica.gob.mx/common/ws/oxml/observacion"
xmlns:ns8="http://www.ventanillaunica.gob.mx/common/ws/oxml/requisito"
xmlns:ns9="http://www.ventanillaunica.gob.mx/common/ws/oxml/opinion">
<ns3:tieneError>false</ns3:tieneError>
<ns2:numeroOperacion>21277177344</ns2:numeroOperacion>
<ns2:pedimento>
<ns2:pedimento>2001238</ns2:pedimento>
<ns2:encabezado>
<ns2:tipoOperacion>
<ns2:clave>1</ns2:clave>
<ns2:descripcion>Importacion</ns2:descripcion>
</ns2:tipoOperacion>
<ns2:claveDocumento>
<ns2:clave>IN</ns2:clave>
<ns2:descripcion>IMPORTACION TEMPORAL DE INSUMOS POR IMMEX</ns2:descripcion>
</ns2:claveDocumento>
<ns2:destino>
<ns2:clave>9</ns2:clave>
<ns2:descripcion>INTERIOR DEL PAIS</ns2:descripcion>
</ns2:destino>
<ns2:aduanaEntradaSalida>
<ns2:clave>230</ns2:clave>
<ns2:descripcion>NOGALES, NOGALES, SONORA.</ns2:descripcion>
</ns2:aduanaEntradaSalida>
<ns2:tipoCambio>20.76130</ns2:tipoCambio>
<ns2:pesoBruto>6745.682</ns2:pesoBruto>
<ns2:medioTrasnporteSalida>
<ns2:clave>7</ns2:clave>
<ns2:descripcion>CARRETERO</ns2:descripcion>
</ns2:medioTrasnporteSalida>
<ns2:medioTrasnporteArribo>
<ns2:clave>7</ns2:clave>
<ns2:descripcion>CARRETERO</ns2:descripcion>
</ns2:medioTrasnporteArribo>
<ns2:medioTrasnporteEntrada>
<ns2:clave>7</ns2:clave>
<ns2:descripcion>CARRETERO</ns2:descripcion>
</ns2:medioTrasnporteEntrada>
<ns2:curpApoderadomandatario>GUMM710831HSRZRG08</ns2:curpApoderadomandatario>
<ns2:rfcAgenteAduanalSocFactura>GLG1502247K9</ns2:rfcAgenteAduanalSocFactura>
<ns2:valorDolares>0.00</ns2:valorDolares>
<ns2:valorAduanalTotal>1642523.00</ns2:valorAduanalTotal>
<ns2:valorComercialTotal>1642523.00</ns2:valorComercialTotal>
</ns2:encabezado>
<ns2:rectificacion>
<ns2:aduanaOriginal>
<ns2:clave>230</ns2:clave>
<ns2:descripcion>NOGALES, NOGALES, SONORA.</ns2:descripcion>
</ns2:aduanaOriginal>
<ns2:aduanaDespacho>
<ns2:clave>230</ns2:clave>
<ns2:descripcion>NOGALES, NOGALES, SONORA.</ns2:descripcion>
</ns2:aduanaDespacho>
<ns2:claveDocumento>
<ns2:clave>IN</ns2:clave>
<ns2:descripcion>IMPORTACION TEMPORAL DE INSUMOS POR IMMEX</ns2:descripcion>
</ns2:claveDocumento>
<ns2:fechaPago>2022-07-25-06:00</ns2:fechaPago>
<ns2:pedimentoOriginal>2009506</ns2:pedimentoOriginal>
<ns2:patenteOriginal>1653</ns2:patenteOriginal>
<ns2:fechaOriginal>2022-07-15-06:00</ns2:fechaOriginal>
</ns2:rectificacion>
<ns2:importadorExportador>
<ns2:rfc>MTK861014317</ns2:rfc>
<ns2:razonSocial>MAQUILAS TETA KAWI S.A. DE C.V. </ns2:razonSocial>
<ns2:domicilio>
<ns2:calle>CARRETERA INTERNACIONAL GUADALAJARA-NOGALES </ns2:calle>
<ns2:numeroExterior>KM 1969</ns2:numeroExterior>
<ns2:ciudadMunicipio>Empalme </ns2:ciudadMunicipio>
<ns2:codigoPostal>85340 </ns2:codigoPostal>
</ns2:domicilio>
<ns2:seguros>0.00</ns2:seguros>
<ns2:fletes>0.00</ns2:fletes>
<ns2:embalajes>0.00</ns2:embalajes>
<ns2:incrementables>0.00</ns2:incrementables>
<ns2:aaduanaDespacho>
<ns2:clave>230</ns2:clave>
<ns2:descripcion>NOGALES, NOGALES, SONORA.</ns2:descripcion>
</ns2:aaduanaDespacho>
<ns2:fechas>
<ns2:fecha>2022-07-05-06:00</ns2:fecha>
<ns2:tipo>
<ns2:clave>1</ns2:clave>
<ns2:descripcion>FECHA DE ENTRADA A TERRITORIO NAL.</ns2:descripcion>
</ns2:tipo>
</ns2:fechas>
<ns2:fechas>
<ns2:fecha>2022-07-15-06:00</ns2:fecha>
<ns2:tipo>
<ns2:clave>2</ns2:clave>
<ns2:descripcion>FECHA DE PAGO DE LAS CONTRIBUCIONES</ns2:descripcion>
</ns2:tipo>
</ns2:fechas>
<ns2:efectivo>1412.00</ns2:efectivo>
<ns2:otros>0</ns2:otros>
<ns2:total>1412.00</ns2:total>
<ns2:pais>
<clave>MEX</clave>
<descripcion>MEXICO (ESTADOS UNIDOS MEXICANOS)</descripcion>
</ns2:pais>
</ns2:importadorExportador>
<ns2:tasas>
<ns2:contribucion>
<ns2:clave>15</ns2:clave>
<ns2:descripcion>PREVALIDAAAA</ns2:descripcion>
</ns2:contribucion>
<ns2:tipoTasa>
<clave>2</clave>
<descripcion>ESPECIFICO</descripcion>
</ns2:tipoTasa>
<ns2:tasaAplicable>240.0000000000</ns2:tasaAplicable>
<ns2:formaPago>
<clave>0</clave>
<descripcion>EFECTIVO</descripcion>
</ns2:formaPago>
<ns2:importe>240.00</ns2:importe>
</ns2:tasas>
<ns2:tasas>
<ns2:contribucion>
<ns2:clave>23</ns2:clave>
<ns2:descripcion>IVA PREV</ns2:descripcion>
</ns2:contribucion>
<ns2:tipoTasa>
<clave>1</clave>
<descripcion>PORCENTUAL</descripcion>
</ns2:tipoTasa>
<ns2:tasaAplicable>16.0000000000</ns2:tasaAplicable>
<ns2:formaPago>
<clave>0</clave>
<descripcion>EFECTIVO</descripcion>
</ns2:formaPago>
<ns2:importe>38.00</ns2:importe>
</ns2:tasas>
<ns2:tasas>
<ns2:contribucion>
<ns2:clave>1</ns2:clave>
<ns2:descripcion>DTA</ns2:descripcion>
</ns2:contribucion>
<ns2:tipoTasa>
<clave>4</clave>
<descripcion>ESPECIFICO (CUOTA FIJA) DTA</descripcion>
</ns2:tipoTasa>
<ns2:tasaAplicable>378.0000000000</ns2:tasaAplicable>
<ns2:formaPago>
<clave>0</clave>
<descripcion>EFECTIVO</descripcion>
</ns2:formaPago>
<ns2:importe>1134.00</ns2:importe>
</ns2:tasas>
<ns2:proveedoresCompradores>
<ns2:identificadorFiscal>84-401607200</ns2:identificadorFiscal>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:valorDolares>0.00</ns2:valorDolares>
</ns2:proveedoresCompradores>
<ns2:proveedoresCompradores>
<ns2:identificadorFiscal>84-401607200</ns2:identificadorFiscal>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:valorDolares>0.00</ns2:valorDolares>
</ns2:proveedoresCompradores>
<ns2:proveedoresCompradores>
<ns2:identificadorFiscal>84-401607200</ns2:identificadorFiscal>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:valorDolares>0.00</ns2:valorDolares>
</ns2:proveedoresCompradores>
<ns2:facturas>
<ns2:numero>COVE2258M9IT4</ns2:numero>
<ns2:terminoFacturacion>
<ns2:clave>FCA</ns2:clave>
<ns2:descripcion>FRANCO TRANSPORTISTA (... LUGAR DESIGNADO)</ns2:descripcion>
</ns2:terminoFacturacion>
<ns2:valorDolares>0.00</ns2:valorDolares>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:identificadorFiscalProveedorComprador>84-401607200</ns2:identificadorFiscalProveedorComprador>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
</ns2:facturas>
<ns2:facturas>
<ns2:numero>COVE2257S9033</ns2:numero>
<ns2:terminoFacturacion>
<ns2:clave>FCA</ns2:clave>
<ns2:descripcion>FRANCO TRANSPORTISTA (... LUGAR DESIGNADO)</ns2:descripcion>
</ns2:terminoFacturacion>
<ns2:valorDolares>0.00</ns2:valorDolares>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:identificadorFiscalProveedorComprador>84-401607200</ns2:identificadorFiscalProveedorComprador>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
</ns2:facturas>
<ns2:facturas>
<ns2:numero>COVE2257PY1Z4</ns2:numero>
<ns2:terminoFacturacion>
<ns2:clave>FCA</ns2:clave>
<ns2:descripcion>FRANCO TRANSPORTISTA (... LUGAR DESIGNADO)</ns2:descripcion>
</ns2:terminoFacturacion>
<ns2:valorDolares>0.00</ns2:valorDolares>
<ns2:valorMonedaExtranjera>0.000000</ns2:valorMonedaExtranjera>
<ns2:identificadorFiscalProveedorComprador>84-401607200</ns2:identificadorFiscalProveedorComprador>
<ns2:proveedorComprador>LIBRA GUAYMAS LLC</ns2:proveedorComprador>
</ns2:facturas>
<ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>PC</clave>
<descripcion>PEDIMENTO CONSOLIDADO</descripcion>
</claveIdentificador>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0170220NCKKN2</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0433220889CP2</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0436220ER86M4</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>SO</clave>
<descripcion>SOCIO COMERCIAL CERTIFICADO</descripcion>
</claveIdentificador>
<complemento1>AA</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0436220ER86H4</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>CI</clave>
<descripcion>CERTIFICACION EN MATERIA DE IVA E IEPS</descripcion>
</claveIdentificador>
<complemento1>AAA</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>IM</clave>
<descripcion>AUTORIZACION DE EMPRESA CON PROGRAMA IMMEX</descripcion>
</claveIdentificador>
<complemento1>45242006</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>PP</clave>
<descripcion>PROGRAMAS DE PROMOCIÓN SECTORIAL.</descripcion>
</claveIdentificador>
<complemento1>20011635</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0170220NG6SJ4</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>RC</clave>
<descripcion>REMESAS DE CONSOLIDADO</descripcion>
</claveIdentificador>
<complemento1>1-3</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>ED</clave>
<descripcion>E_DOCUMENT DOCUMENTO DIGITALIZADO</descripcion>
</claveIdentificador>
<complemento1>0436220ESLMS1</complemento1>
</ns2:identificadores>
<ns2:identificadores>
<claveIdentificador>
<clave>IC</clave>
<descripcion>IMPORTADOR CERTIFICADO</descripcion>
</claveIdentificador>
<complemento1>O</complemento1>
</ns2:identificadores>
</ns2:identificadores>
<ns2:observaciones>PEDIMENTO CONSOLIDADO DE IMPORTACION DE CONFORMIDAD CON LOS
ARTICULOS 37, 37-A DE LA LEY ADUANERA Y REGLA DE COMERCIO EXTERIOR 1.9.19.,
CORRESPONDIENTE A LA SEMANA DEL 04 DE JULIO AL 10 DE JULIO DEL 2022. DE
CONFORMIDAD CON EL ARTICULO 89DE LA LEY ADUANERA SE REALIZA RECTIFICACION DE
PEDIMENTO PARA MODIFICAR LO SIGUIENTE: SE RECTIFICA PEDIMENTO EN: VALOR
COMERCIAL DICE: 73,817.52 DEBE DECIR: 79,114.63 PESO BRUTO DICE: 6695.390 DEBE
DECIR: 6745.682 SE RECTIFICA COVE DE FACTURA LIBRA7902RM DICE: COVE2257X6DZ1
DEBE DECIR: COVE2258M9IT4 SE CORRIGE PARTIDA # 81 EN CANTIDAD Y UNIDAD DE MEDIDA
SE AGREGAN PARTIDAS # 93, 94, 95 y 96. SE DIGITALIZA FACTURA E DOCUMENT
0170220NG6SJ4 SE DIGITALIZA REGLA 8va E DOCUMENT 0436220ESLMS1 - - Relacion de
facturas - - FACTR: LIBRA GUAYMAS
LLC,84-401607200,LIBRA7896RM,05-07-2022,COVE2257PY1Z4,USD,26,664.250 FACTR:
LIBRA GUAYMAS
LLC,84-401607200,LIBRA7898RM,06-07-2022,COVE2257S9033,USD,5,422.700 FACTR: LIBRA
GUAYMAS LLC,84-401607200,LIBRA7902RM,08-07-2022,COVE2258M9IT4,USD,47,027.680 </ns2:observaciones>
<ns2:partidas>96</ns2:partidas>
<ns2:partidas>56</ns2:partidas>
<ns2:partidas>7</ns2:partidas>
<ns2:partidas>69</ns2:partidas>
<ns2:partidas>43</ns2:partidas>
<ns2:partidas>95</ns2:partidas>
<ns2:partidas>64</ns2:partidas>
<ns2:partidas>70</ns2:partidas>
<ns2:partidas>8</ns2:partidas>
<ns2:partidas>65</ns2:partidas>
<ns2:partidas>16</ns2:partidas>
<ns2:partidas>79</ns2:partidas>
<ns2:partidas>20</ns2:partidas>
<ns2:partidas>48</ns2:partidas>
<ns2:partidas>26</ns2:partidas>
<ns2:partidas>18</ns2:partidas>
<ns2:partidas>27</ns2:partidas>
<ns2:partidas>54</ns2:partidas>
<ns2:partidas>34</ns2:partidas>
<ns2:partidas>93</ns2:partidas>
<ns2:partidas>44</ns2:partidas>
<ns2:partidas>17</ns2:partidas>
<ns2:partidas>90</ns2:partidas>
<ns2:partidas>37</ns2:partidas>
<ns2:partidas>9</ns2:partidas>
<ns2:partidas>11</ns2:partidas>
<ns2:partidas>51</ns2:partidas>
<ns2:partidas>73</ns2:partidas>
<ns2:partidas>36</ns2:partidas>
<ns2:partidas>66</ns2:partidas>
<ns2:partidas>63</ns2:partidas>
<ns2:partidas>40</ns2:partidas>
<ns2:partidas>88</ns2:partidas>
<ns2:partidas>19</ns2:partidas>
<ns2:partidas>59</ns2:partidas>
<ns2:partidas>15</ns2:partidas>
<ns2:partidas>2</ns2:partidas>
<ns2:partidas>94</ns2:partidas>
<ns2:partidas>68</ns2:partidas>
<ns2:partidas>78</ns2:partidas>
<ns2:partidas>32</ns2:partidas>
<ns2:partidas>39</ns2:partidas>
<ns2:partidas>89</ns2:partidas>
<ns2:partidas>62</ns2:partidas>
<ns2:partidas>4</ns2:partidas>
<ns2:partidas>47</ns2:partidas>
<ns2:partidas>74</ns2:partidas>
<ns2:partidas>41</ns2:partidas>
<ns2:partidas>80</ns2:partidas>
<ns2:partidas>6</ns2:partidas>
<ns2:partidas>42</ns2:partidas>
<ns2:partidas>28</ns2:partidas>
<ns2:partidas>92</ns2:partidas>
<ns2:partidas>49</ns2:partidas>
<ns2:partidas>12</ns2:partidas>
<ns2:partidas>13</ns2:partidas>
<ns2:partidas>84</ns2:partidas>
<ns2:partidas>10</ns2:partidas>
<ns2:partidas>31</ns2:partidas>
<ns2:partidas>87</ns2:partidas>
<ns2:partidas>50</ns2:partidas>
<ns2:partidas>76</ns2:partidas>
<ns2:partidas>22</ns2:partidas>
<ns2:partidas>30</ns2:partidas>
<ns2:partidas>53</ns2:partidas>
<ns2:partidas>71</ns2:partidas>
<ns2:partidas>38</ns2:partidas>
<ns2:partidas>3</ns2:partidas>
<ns2:partidas>33</ns2:partidas>
<ns2:partidas>45</ns2:partidas>
<ns2:partidas>23</ns2:partidas>
<ns2:partidas>25</ns2:partidas>
<ns2:partidas>21</ns2:partidas>
<ns2:partidas>67</ns2:partidas>
<ns2:partidas>85</ns2:partidas>
<ns2:partidas>14</ns2:partidas>
<ns2:partidas>46</ns2:partidas>
<ns2:partidas>29</ns2:partidas>
<ns2:partidas>35</ns2:partidas>
<ns2:partidas>91</ns2:partidas>
<ns2:partidas>24</ns2:partidas>
<ns2:partidas>72</ns2:partidas>
<ns2:partidas>82</ns2:partidas>
<ns2:partidas>61</ns2:partidas>
<ns2:partidas>86</ns2:partidas>
<ns2:partidas>83</ns2:partidas>
<ns2:partidas>77</ns2:partidas>
<ns2:partidas>75</ns2:partidas>
<ns2:partidas>58</ns2:partidas>
<ns2:partidas>81</ns2:partidas>
<ns2:partidas>55</ns2:partidas>
<ns2:partidas>57</ns2:partidas>
<ns2:partidas>5</ns2:partidas>
<ns2:partidas>52</ns2:partidas>
<ns2:partidas>60</ns2:partidas>
<ns2:partidas>1</ns2:partidas>
<ns2:diferenciasContribuciones>
<ns2:claveGravamen>
<ns2:descripcion>DTA</ns2:descripcion>
<ns2:clave>1</ns2:clave>
</ns2:claveGravamen>
<ns2:importePago>364.00</ns2:importePago>
<ns2:formaPago>
<clave>0</clave>
<descripcion>EFECTIVO</descripcion>
</ns2:formaPago>
</ns2:diferenciasContribuciones>
</ns2:pedimento>
</ns2:consultarPedimentoCompletoRespuesta>
</S:Body>
</S:Envelope>

View File

@@ -129,36 +129,54 @@ def extract_acuse_documento_from_soap(soap_response_text): # Testeado
logger.error(f"Error extrayendo acuseDocumento: {e}")
return None
def extract_pdf_bytes_from_xml(xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
# Busca el tag <File> (ajusta el namespace si es necesario)
"""
Igual que extract_pdf_bytes_from_xml_content pero recibe una ruta de archivo.
"""
with open(xml_path, 'r', encoding='utf-8') as f:
xml_content = f.read()
return extract_pdf_bytes_from_xml_content(xml_content)
def extract_pdf_bytes_from_xml_content(xml_content: str):
"""
Extrae el PDF y metadatos desde un string XML.
"""
root = ET.fromstring(xml_content)
file_elem = root.find('.//File')
if file_elem is not None and file_elem.text:
# Limpia el contenido base64
if file_elem is None:
for elem in root.iter():
if elem.tag.endswith('File') and elem.text:
file_elem = elem
break
if file_elem is not None and file_elem.text and file_elem.text.strip():
base64_data = file_elem.text.strip().replace('\n', '').replace('\r', '')
pdf_bytes = base64.b64decode(base64_data)
cadena_original = None
sello_digital = None
# Buscar CadenaOriginal y SelloDigital en el XML
cadena_elem = root.find('.//CadenaOriginal')
if cadena_elem is None:
for elem in root.iter():
if elem.tag.endswith('CadenaOriginal') and elem.text:
cadena_elem = elem
break
if cadena_elem is not None and cadena_elem.text:
cadena_original = cadena_elem.text.strip()
sello_elem = root.find('.//SelloDigital')
if sello_elem is None:
for elem in root.iter():
if elem.tag.endswith('SelloDigital') and elem.text:
sello_elem = elem
break
if sello_elem is not None and sello_elem.text:
sello_digital = sello_elem.text.strip()
return {
"pdf_bytes": pdf_bytes,
"cadena_original": cadena_original,
"sello_digital": sello_digital
}
return pdf_bytes
else:
raise ValueError("No se encontró el tag <File> con contenido válido.")
raise ValueError("No se encontró el tag <File> con contenido válido. Verifique que el XML contiene el tag <File> con datos base64.")
def decode_acuse_base64_content(base64_content): # Testeado
"""
@@ -846,32 +864,20 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
# Extraer contenido Base64 del acuse
logger.info("Extrayendo documento binario del edocument...")
response = extract_pdf_bytes_from_xml(soap_response.text)
response = extract_pdf_bytes_from_xml_content(soap_response.text)
pdf_bytes = response.get('pdf_bytes')
# cadena_original = response.get('cadena_original')
# sello_digital = response.get('sello_digital')
if not acuse_base64:
logger.error("No se pudo extraer el contenido del acuseDocumento")
raise HTTPException(status_code=500, detail="No se pudo extraer el documento del acuse")
# Decodificar contenido Base64
response_edoc = rest_controller.put_edocument(edocument_id=ide, data={
"numero_edocument": edocument['numero_edocument'],
"pedimento": response_service['pedimento'],
# "cadena_original": cadena_original,
# "sello_digital": sello_digital
})
if not pdf_bytes:
logger.error("No se pudo decodificar el contenido Base64 del acuse")
raise HTTPException(status_code=500, detail="No se pudo decodificar el documento del acuse")
logger.error("No se pudo decodificar el contenido Base64 del documento e-document")
raise HTTPException(status_code=500, detail="No se pudo decodificar el documento del e-document")
# Verificar que es un PDF válido
if not pdf_bytes.startswith(b'%PDF'):
logger.warning("El contenido decodificado no parece ser un PDF válido")
# Continuar de todos modos, podría ser otro tipo de documento
# Generar nombre del archivo
remesas = 1 if response_service['pedimento'].get('remesas', 0) else 0
patente = response_service['pedimento'].get('patente', 'N/A')
@@ -880,7 +886,7 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
tipo_operacion = response_service['pedimento'].get('tipo_operacion', 'N/A')
pedimento = response_service['pedimento'].get('pedimento', 'N/A')
_file_name = f"vu_EDC_{remesas}{no_partidas}{tipo_operacion}_{aduana}_{patente}_{pedimento}_{idx}.pdf"
# Enviar el documento PDF usando binary_content
logger.info(f"Enviando documento PDF: {_file_name} ({len(pdf_bytes)} bytes)")
document_response = await rest_controller.post_document(
@@ -904,7 +910,7 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
logger.error(f"Error inesperado en get_acuse: {e}")
import traceback
logger.error(f"Traceback: {traceback.format_exc()}")
raise HTTPException(status_code=500, detail=f"Error interno al procesar acuse: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error interno al procesar acuse")
async def get_soap_cove(credenciales, response_service, soap_controller, cove, idx):
"""