feature/AS-herencia-datos-facturacion #12
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/AS-herencia-datos-facturacion"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Forma de pago, método de pago y moneda se capturaban a mano en cada factura aunque ya vivieran en la ficha del cliente — y son justo las claves que detienen el timbrado en validación si faltan. Ni el alta manual ni generate_from_shipment las prellenaban. - _inherit_account_billing espeja _resolve_item_concept, el patrón de herencia que ya usa el módulo: lo explícito manda sobre la ficha, y se completa sin borrar. Si la ficha trae texto que no resuelve a una clave del SAT no se asigna nada, así que cambiar de cliente nunca vacía un dato ya capturado. - find_by_code traduce el texto del Account a id de catálogo. Normaliza ('3' -> '03', 'pue' -> 'PUE') y devuelve None sin lanzar: una ficha mal capturada no puede impedir facturar, el faltante lo reporta el timbrado junto al resto. - Se invoca al crear, al cambiar de cliente (re-herencia) y en generate_from_shipment, donde la moneda del embarque gana sobre la de la ficha: es la que se coteó y operó. Incluye el candado de inmutabilidad con timbre, que la herencia hacía necesario: había un solo campo protegido (stamping_mode) y todo lo demás de una factura ya timbrada era editable — cliente, folio, moneda, partidas e impuestos — con lo que la factura y su CFDI podían contar cosas distintas. _reject_if_stamped generaliza esa guarda sobre una lista cerrada de campos del comprobante, y sin lista en partidas e impuestos. Cobrar y anotar siguen permitidos: no alteran el CFDI. send_invoice deja de regenerar el PDF de una factura timbrada, que reescribía en MinIO el documento que el cliente ya recibió. Dos cosas que la herencia obligaba a arreglar: 1. currency y tax_rate tenían default no nulo en el DTO y el frontend sembraba {currency:'MXN', tax_rate:16}, así que el backend nunca podía distinguir "no lo eligió" de "eligió eso" y la herencia habría sido código muerto. Ahora son opcionales; un None se retira del payload para que mande el default de la columna. 2. saveHeader mandaba el objeto completo, con lo que al cambiar de cliente el PATCH llevaba las claves del cliente anterior. Ahora manda solo el delta. Se agrega fin.invoices.exchange_rate: heredar una moneda distinta de MXN producía facturas no timbrables en silencio, porque _build_data pasaba exchange_rate=None siempre y el validador lo exige. La validación sigue siendo del builder, que acumula todos los faltantes juntos. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>