Skip to content

Modelo 303: corregir redondeo y mapear todas las operaciones (tarea 4542)#24

Merged
daniel89fg merged 3 commits into
masterfrom
tarea-4542-modelo303-operaciones-y-redondeo
Jun 16, 2026
Merged

Modelo 303: corregir redondeo y mapear todas las operaciones (tarea 4542)#24
daniel89fg merged 3 commits into
masterfrom
tarea-4542-modelo303-operaciones-y-redondeo

Conversation

@daniel89fg

Copy link
Copy Markdown
Member

Descripción

Resuelve dos problemas relacionados del Modelo 303 que comparten los mismos archivos:

  1. Desfase de céntimos entre pestañas. Las pestañas Resumen, Compras/Ventas y Cuentas no cuadraban porque usaban tres consultas distintas, con filtros y cálculo de la cuota diferentes.
  2. Casillas incorrectas según el tipo de operación (tarea 4542). El reparto a casillas se decidía solo por la cuenta especial y el tipo impositivo, ignorando la operación de la factura. Una compra con inversión del sujeto pasivo caía en las casillas de ventas nacionales (07/09) en lugar de 12/13 + 28/29, y las intracomunitarias no se separaban bien.

Sustituye al PR #21, corrigiendo además el mapeo de intracomunitarias que aquel resolvía mal (las enviaba a 12/13 + 28/29 cuando deben ir a 10/11 + 36/37), siguiendo las indicaciones del revisor en ese PR.

Tarea relacionada

Tarea #4542

Cambios realizados

Unificación de datos y redondeo:

  • EditRegularizacionImpuesto: criterio común commonTaxWhere para las tres consultas (misma empresa+ejercicio+fechas, exclusión de todos los asientos de regularización, series.siniva=false, exclusión de apertura/cierre y selección de cuentas por grupo de cuenta especial en vez de LIKE 477%/472%).
  • PartidaImpuesto: la cuota es siempre el importe contable real (debe/haber con corrección de signo en bases negativas), nunca un recálculo base×tipo.
  • VatRegularizationToAccounting::getSubtotals: alineado con el mismo criterio.

Mapeo por tipo de operación:

  • PartidaImpuestoResumen: añade operacion (JOIN por idasiento mediante subconsultas que solo exponen idasiento y operacion, evitando columnas ambiguas) y tipodoc (compra/venta).
  • Modelo303: enrutado por operación → ISP 12/13 + 28/29; intracomunitarias/servicios 10/11 + 36/37; importación 32/33; ventas exentas (intracom 59, exportación 60, ISP 122) desde las facturas. Las partidas net-zero de ventas intracomunitarias se excluyen del régimen general. Comodines en casillaMap y avisos cuando un importe no encaja en ninguna casilla.
  • Vista: muestra las casillas informativas 59, 60 y 122.

Cómo probar

  • Tests: vendor/bin/phpunit Plugins/Modelo303/Test (incluye Modelo303SquaresTest que cubre nacional, ISP, intracomunitaria genérica y específica, importación, venta intracom que no contamina, recargo, tasa no mapeada y avisos).
  • Manual: en una regularización con facturas de compra marcadas como inversión del sujeto pasivo e intracomunitarias, comprobar que el Resumen cuadra con Compras/Ventas y con el asiento, y que las casillas 12/13, 28/29, 10/11, 36/37, 59, 60 y 122 se rellenan según corresponde.

Notas

  • La casilla 77 (IVA devengado de importación, liquidado por aduana) no tiene origen contable automático en FacturaScripts; queda documentada en el código.

🤖 Generated with Claude Code

Daniel Fernández Giménez and others added 2 commits June 11, 2026 16:32
El reparto a casillas se decidía solo por la cuenta especial y el tipo
impositivo, ignorando la operación de la factura. Así, una compra con
inversión del sujeto pasivo caía en las casillas de ventas nacionales
(07/09) en lugar de 12/13 + 28/29, y las intracomunitarias no se
separaban correctamente.

- PartidaImpuestoResumen aporta la operación (JOIN por idasiento mediante
  subconsultas que solo exponen idasiento y operacion, para no crear
  columnas ambiguas) y el tipo de documento (compra/venta).
- Modelo303 enruta por operación: ISP -> 12/13 + 28/29; intracomunitarias
  y servicios -> 10/11 + 36/37; importación -> 32/33; ventas exentas
  (intracom 59, exportación 60, ISP 122) desde las facturas. Las partidas
  de autorrepercusión de ventas intracomunitarias (neto cero) se excluyen
  del régimen general.
- casillaMap con comodín para que ninguna tasa se pierda y avisos cuando
  un importe no encaja en ninguna casilla.
- La vista muestra las casillas informativas 59, 60 y 122.
- Test unitario del reparto de casillas para todos los casos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Las pestañas Resumen, Compras/Ventas y Cuentas no cuadraban porque usaban
tres consultas distintas, con filtros y cálculo de la cuota diferentes.

- EditRegularizacionImpuesto: nuevo criterio común (commonTaxWhere) usado
  por las tres consultas (misma empresa+ejercicio+fechas, exclusión de
  todos los asientos de regularización, series.siniva=false, exclusión de
  apertura/cierre y selección de cuentas por grupo de cuenta especial en
  lugar del LIKE 477%/472%). Además carga las bases exentas de ventas y
  muestra los avisos del resumen.
- PartidaImpuesto: la cuota es siempre el importe contable real
  (debe/haber con corrección de signo en bases negativas), nunca un
  recálculo base*tipo; el destino IVA/recargo lo decide la cuenta especial.
- VatRegularizationToAccounting: getSubtotals se alinea con el mismo
  criterio (idempresa, siniva y exclusión de regularizaciones).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@daniel89fg
daniel89fg merged commit deedd98 into master Jun 16, 2026
2 checks passed
@daniel89fg
daniel89fg deleted the tarea-4542-modelo303-operaciones-y-redondeo branch June 16, 2026 16:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant