You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Problema: El XSD requiere este orden: Impuestos → ACuentaTerceros → InformacionAduanera → CuentaPredial → ComplementoConcepto → Parte. El tipo TS tiene orden diferente y ACuentaTerceros/CuentaPredial no están declarados en la interface.
Impacto: XML con múltiples hijos en un concepto puede fallar validación XSD.
Referencia SAT:
cfdv40.xsd línea 189-492: <xs:sequence> dentro de Concepto:
Línea 190: Impuestos (minOccurs="0")
Línea 309: ACuentaTerceros (minOccurs="0")
Línea 351: InformacionAduanera (minOccurs="0", maxOccurs="unbounded")
Línea 369: CuentaPredial (minOccurs="0", maxOccurs="unbounded")
Línea 389: ComplementoConcepto (minOccurs="0")
Línea 399: Parte (minOccurs="0", maxOccurs="unbounded")
BUG-003: Orden de InformacionGlobal y CfdiRelacionados depende del orden de llamada
Problema: Si relacionados() se llama después de informacionGlobal(), CfdiRelacionados queda antes de InformacionGlobal. XSD requiere: InformacionGlobal → CfdiRelacionados → Emisor → Receptor → Conceptos.
Impacto: Rechazo del SAT cuando se usan ambos nodos.
Referencia SAT:
cfdv40.xsd línea 9-692: <xs:sequence> del Comprobante:
Línea 10: InformacionGlobal (primero)
Línea 38: CfdiRelacionados (segundo)
Línea 71: Emisor
Línea 113: Receptor
Línea 178: Conceptos
BUG-004: Mismo tipo para Retencion de Comprobante y de Concepto (schemas distintos)
Problema: Comprobante > Retenciones > Retencion solo tiene Impuesto + Importe. Concepto > Retenciones > Retencion tiene Base, Impuesto, TipoFactor, TasaOCuota, Importe. Se usa XmlTranRentAttributesProperties para ambos, y setRetencion() ordena con las 5 claves, pudiendo inyectar campos undefined en retenciones de Comprobante.
Impacto: XML de Comprobante con retenciones podría tener atributos vacíos que el SAT rechaza.
Referencia SAT:
cfdv40.xsd líneas 596-605: Comprobante > Retencion — solo Impuesto (línea 596, use="required") e Importe (línea 601, use="required"). 2 atributos.
Problema: Cuando ObjetoImp es "02" (Sí objeto de impuesto), el concepto DEBE tener cfdi:Impuestos. No se valida.
Impacto: SAT rechaza el CFDI.
Referencia SAT:
Anexo_20_Guia_de_llenado_CFDI.pdf página ~24, sección Concepto > ObjetoImp: "Se debe registrar la clave correspondiente para indicar si la operación comercial es objeto o no de impuesto." Clave "02" = Sí objeto de impuesto → impuestos deben desglosarse a nivel Concepto.
BUG-008: ObjetoImp="01" con nodo Impuestos no se rechaza
Problema: Cuando Moneda no es "MXN" ni "XXX", TipoCambio es OBLIGATORIO. No se valida.
Impacto: SAT rechaza el CFDI en moneda extranjera sin tipo de cambio.
Referencia SAT:
Anexo_20_Guia_de_llenado_CFDI.pdf sección Comprobante > TipoCambio: "Este campo es requerido cuando la clave de moneda es distinta de 'MXN' (Peso Mexicano) y a la clave 'XXX'."
BUG-011: MontoTotalPagos marcado como opcional en Pagos 2.0
Problema:Total = SubTotal - Descuento + Traslados - Retenciones. No se calcula ni valida.
Referencia SAT:
Anexo_20_Guia_de_llenado_CFDI.pdf sección Comprobante > Total: "Es la suma del subtotal, menos los descuentos aplicables, más las contribuciones recibidas (impuestos trasladados federales o locales, derechos, productos, aprovechamientos, aportaciones de seguridad social, contribuciones de mejoras) menos los impuestos retenidos federales y/o locales. No se permiten valores negativos."
BUG-017: InformacionGlobal no requerido para público en general
Problema: Cuando Receptor.Rfc = XAXX010101000 y TipoDeComprobante es "I" o "E", InformacionGlobal es OBLIGATORIO. No se valida.
Referencia SAT:
Anexo_20_Guia_de_llenado_CFDI.pdf sección InformacionGlobal y ejemplos con RFC XAXX010101000.
cfdv40.xsd línea 10: <xs:element name="InformacionGlobal" minOccurs="0"> — opcional en XSD pero obligatorio por regla de negocio del SAT cuando el receptor es público en general.
BUG-018: Emisor/Receptor inicializados como {} vacíos
Problema:restartCfdi() inicializa 'cfdi:Emisor': {} y 'cfdi:Receptor': {}. Si se serializa sin configurarlos, genera <cfdi:Emisor/> sin atributos requeridos.
Referencia SAT:
cfdv40.xsd línea 71-112: Emisor requiere Rfc (use="required"), Nombre (use="required"), RegimenFiscal (use="required").