- *
- * @property float $baseimponible
- * @property string $codcuentaesp
- * @property string $codejercicio
- * @property string $codsubcuenta
- * @property float $cuotaiva
- * @property float $cuotarecargo
- * @property string $descripcion
- * @property int $idsubcuenta
- * @property float $iva
- * @property float $recargo
- * @property float $total
*/
class PartidaImpuestoResumen extends JoinModel
{
-
- /**
- * Reset the values of all model view properties.
- */
- public function clear(): void
- {
- parent::clear();
- $this->baseimponible = 0.0;
- $this->iva = 0.0;
- $this->recargo = 0.0;
- $this->cuotaiva = 0.0;
- $this->cuotarecargo = 0.0;
- $this->total = 0.0;
- }
-
/**
* Returns an array of fields for the select clausule.
*
@@ -64,16 +35,19 @@ public function clear(): void
protected function getFields(): array
{
return [
- 'baseimponible' => 'SUM(partidas.baseimponible)',
- 'codcuentaesp' => 'COALESCE(subcuentas.codcuentaesp, cuentas.codcuentaesp)',
- 'codejercicio' => 'asientos.codejercicio',
'codsubcuenta' => 'partidas.codsubcuenta',
+ 'iva' => 'COALESCE(partidas.iva, 0)',
+ 'recargo' => 'COALESCE(partidas.recargo, 0)',
+
'descripcion' => 'subcuentas.descripcion',
- 'idsubcuenta' => 'partidas.idsubcuenta',
- 'iva' => 'partidas.iva',
- 'recargo' => 'partidas.recargo',
- 'debe' => 'SUM(partidas.debe)',
- 'haber' => 'SUM(partidas.haber)',
+
+ 'codcuentaesp' => 'COALESCE(subcuentas.codcuentaesp, cuentas.codcuentaesp)',
+ 'tipo_desc' => 'cuentasesp.descripcion',
+
+ 'baseimponible' => 'ROUND(SUM(partidas.baseimponible), 2)',
+ 'debe' => 'ROUND(SUM(partidas.debe), 2)',
+ 'haber' => 'ROUND(SUM(partidas.haber), 2)',
+ 'cuota' => 'ROUND(SUM(' . $this->sqlForCuota() . '), 2)',
];
}
@@ -84,14 +58,12 @@ protected function getFields(): array
*/
protected function getGroupFields(): string
{
- return 'asientos.codejercicio,'
- . 'COALESCE(subcuentas.codcuentaesp, cuentas.codcuentaesp),'
- . 'cuentasesp.descripcion,'
- . 'partidas.codsubcuenta,'
- . 'subcuentas.descripcion,'
- . 'partidas.idsubcuenta,'
- . 'partidas.iva,'
- . 'partidas.recargo';
+ return 'partidas.codsubcuenta'
+ . ', partidas.iva'
+ . ', partidas.recargo'
+ . ', subcuentas.descripcion'
+ . ', COALESCE(subcuentas.codcuentaesp, cuentas.codcuentaesp)'
+ . ', cuentasesp.descripcion';
}
/**
@@ -101,12 +73,12 @@ protected function getGroupFields(): string
*/
protected function getSQLFrom(): string
{
- return 'asientos'
- . ' LEFT JOIN partidas ON partidas.idasiento = asientos.idasiento'
- . ' LEFT JOIN subcuentas ON subcuentas.idsubcuenta = partidas.idsubcuenta'
- . ' LEFT JOIN cuentas ON cuentas.idcuenta = subcuentas.idcuenta'
- . ' LEFT JOIN cuentasesp ON cuentasesp.codcuentaesp = COALESCE(subcuentas.codcuentaesp, cuentas.codcuentaesp)'
- . ' LEFT JOIN series ON series.codserie = partidas.codserie';
+ return 'partidas'
+ . ' INNER JOIN asientos on asientos.idasiento = partidas.idasiento'
+ . ' INNER JOIN subcuentas on subcuentas.idsubcuenta = partidas.idsubcuenta'
+ . ' INNER JOIN cuentas on cuentas.idcuenta = subcuentas.idcuenta'
+ . ' LEFT JOIN cuentasesp on cuentasesp.codcuentaesp = coalesce(subcuentas.codcuentaesp, cuentas.codcuentaesp)'
+ . ' LEFT JOIN series on series.codserie = partidas.codserie';
}
/**
@@ -117,38 +89,25 @@ protected function getSQLFrom(): string
protected function getTables(): array
{
return [
- 'asientos',
'partidas',
+ 'asientos',
'subcuentas',
'cuentas',
- 'cuentasesp'
+ 'cuentasesp',
+ 'series',
];
}
/**
- * Assign the values of the $data array to the model properties.
+ * SQL snippet to calculate the cuota field.
*
- * @param array $data
+ * @return string
*/
- protected function loadFromData(array $data): void
+ private function sqlForCuota(): string
{
- parent::loadFromData($data);
-
- if ($this->iva > 0 && $this->recargo > 0) {
- $this->cuotaiva = $this->baseimponible * ($this->iva / 100.0);
- $this->cuotarecargo = $this->baseimponible * ($this->recargo / 100.0);
- } elseif ($this->iva > 0) {
- $this->cuotaiva = $this->codcuentaesp === 'IVAREP'
- ? $data['haber'] - $data['debe']
- : $data['debe'] - $data['haber'];
- $this->cuotarecargo = 0.0;
- } else {
- $this->cuotarecargo = $this->codcuentaesp === 'IVAREP'
- ? $data['haber'] - $data['debe']
- : $data['debe'] - $data['haber'];
- $this->cuotaiva = 0.0;
- }
-
- $this->total = $this->baseimponible + $this->cuotaiva + $this->cuotarecargo;
+ return 'CASE WHEN partidas.baseimponible < 0 AND (partidas.debe + partidas.haber) > 0
+ THEN (partidas.debe + partidas.haber) * -1
+ ELSE partidas.debe + partidas.haber
+ END';
}
}
diff --git a/Translation/es_ES.json b/Translation/es_ES.json
index 942dbe3..ae20f5f 100644
--- a/Translation/es_ES.json
+++ b/Translation/es_ES.json
@@ -6,5 +6,16 @@
"model-303": "Modelo 303",
"model-303-390": "Modelos 303 y 390",
"model-390": "Modelo 390",
- "year-model-390": "Año (modelo 390)"
+ "year-model-390": "Año (modelo 390)",
+ "---NEW---": "--------------------------",
+ "model-303-new": "Modelos 303 (2025)",
+ "tax-detail": "Detalle de impuestos",
+ "vat-accrued": "IVA repercutido",
+ "quota": "Cuota",
+ "total-accrued-fee": "Cuota total repercutida",
+ "deductible-vat": "IVA deducible",
+ "base": "Base",
+ "total-to-deduct": "Total a deducir",
+ "general-regime-result": "Resultado",
+ "total-result-of-the-general-regime": "Resultado total"
}
\ No newline at end of file
diff --git a/View/Modelo303.html.twig b/View/Modelo303.html.twig
index 7ea7a34..9b072f0 100644
--- a/View/Modelo303.html.twig
+++ b/View/Modelo303.html.twig
@@ -19,178 +19,178 @@
150
- {{ fsc.modelo303['150'] is empty ? '' : number(fsc.modelo303['150'], 2) }}
+ {{ fsc.modelo303.casillaStr('150') }}
151
- {{ fsc.modelo303['151'] is empty ? '' : number(fsc.modelo303['151'], 2) }}
+ {{ fsc.modelo303.casillaStr('151', true) }}
152
- {{ fsc.modelo303['152'] is empty ? '' : number(fsc.modelo303['152'], 2) }}
+ {{ fsc.modelo303.casillaStr('152') }}
165
- {{ fsc.modelo303['165'] is empty ? '' : number(fsc.modelo303['165'], 2) }}
+ {{ fsc.modelo303.casillaStr('165') }}
166
- {{ fsc.modelo303['166'] is empty ? '' : number(fsc.modelo303['166'], 2) }}
+ {{ fsc.modelo303.casillaStr('166') }}
167
- {{ fsc.modelo303['167'] is empty ? '' : number(fsc.modelo303['167'], 2) }}
+ {{ fsc.modelo303.casillaStr('167') }}
01
- {{ fsc.modelo303['01'] is empty ? '' : number(fsc.modelo303['01'], 2) }}
+ {{ fsc.modelo303.casillaStr('01') }}
02
- {{ fsc.modelo303['02'] is empty ? '' : number(fsc.modelo303['02'], 2) }}
+ {{ fsc.modelo303.casillaStr('02') }}
03
- {{ fsc.modelo303['03'] is empty ? '' : number(fsc.modelo303['03'], 2) }}
+ {{ fsc.modelo303.casillaStr('03') }}
153
- {{ fsc.modelo303['153'] is empty ? '' : number(fsc.modelo303['153'], 2) }}
+ {{ fsc.modelo303.casillaStr('153') }}
154
- {{ fsc.modelo303['154'] is empty ? '' : number(fsc.modelo303['154'], 2) }}
+ {{ fsc.modelo303.casillaStr('154') }}
155
- {{ fsc.modelo303['155'] is empty ? '' : number(fsc.modelo303['155'], 2) }}
+ {{ fsc.modelo303.casillaStr('155') }}
04
- {{ fsc.modelo303['04'] is empty ? '' : number(fsc.modelo303['04'], 2) }}
+ {{ fsc.modelo303.casillaStr('04') }}
05
- {{ fsc.modelo303['05'] is empty ? '' : number(fsc.modelo303['05'], 2) }}
+ {{ fsc.modelo303.casillaStr('05') }}
06
- {{ fsc.modelo303['06'] is empty ? '' : number(fsc.modelo303['06'], 2) }}
+ {{ fsc.modelo303.casillaStr('06') }}
07
- {{ fsc.modelo303['07'] is empty ? '' : number(fsc.modelo303['07'], 2) }}
+ {{ fsc.modelo303.casillaStr('07') }}
08
- {{ fsc.modelo303['08'] is empty ? '' : number(fsc.modelo303['08'], 2) }}
+ {{ fsc.modelo303.casillaStr('08') }}
09
- {{ fsc.modelo303['09'] is empty ? '' : number(fsc.modelo303['09'], 2) }}
+ {{ fsc.modelo303.casillaStr('09') }}
10
- {{ fsc.modelo303['10'] is empty ? '' : number(fsc.modelo303['10'], 2) }}
+ {{ fsc.modelo303.casillaStr('10') }}
-
+
11
- {{ fsc.modelo303['11'] is empty ? '' : number(fsc.modelo303['11'], 2) }}
+ {{ fsc.modelo303.casillaStr('11') }}
12
- {{ fsc.modelo303['12'] is empty ? '' : number(fsc.modelo303['12'], 2) }}
+ {{ fsc.modelo303.casillaStr('12') }}
-
+
13
- {{ fsc.modelo303['13'] is empty ? '' : number(fsc.modelo303['13'], 2) }}
+ {{ fsc.modelo303.casillaStr('13') }}
14
- {{ fsc.modelo303['14'] is empty ? '' : number(fsc.modelo303['14'], 2) }}
+ {{ fsc.modelo303.casillaStr('14') }}
-
+
15
- {{ fsc.modelo303['15'] is empty ? '' : number(fsc.modelo303['15'], 2) }}
+ {{ fsc.modelo303.casillaStr('15') }}
156
- {{ fsc.modelo303['156'] is empty ? '' : number(fsc.modelo303['156'], 2) }}
+ {{ fsc.modelo303.casillaStr('156') }}
157
- {{ fsc.modelo303['157'] is empty ? '' : number(fsc.modelo303['157'], 2) }}
+ {{ fsc.modelo303.casillaStr('157') }}
158
- {{ fsc.modelo303['158'] is empty ? '' : number(fsc.modelo303['158'], 2) }}
+ {{ fsc.modelo303.casillaStr('158') }}
168
- {{ fsc.modelo303['168'] is empty ? '' : number(fsc.modelo303['168'], 2) }}
+ {{ fsc.modelo303.casillaStr('168') }}
169
- {{ fsc.modelo303['169'] is empty ? '' : number(fsc.modelo303['169'], 2) }}
+ {{ fsc.modelo303.casillaStr('169') }}
170
- {{ fsc.modelo303['170'] is empty ? '' : number(fsc.modelo303['170'], 2) }}
+ {{ fsc.modelo303.casillaStr('170') }}
16
- {{ fsc.modelo303['16'] is empty ? '' : number(fsc.modelo303['16'], 2) }}
+ {{ fsc.modelo303.casillaStr('16') }}
17
- {{ fsc.modelo303['17'] is empty ? '' : number(fsc.modelo303['17'], 2) }}
+ {{ fsc.modelo303.casillaStr('17') }}
18
- {{ fsc.modelo303['18'] is empty ? '' : number(fsc.modelo303['18'], 2) }}
+ {{ fsc.modelo303.casillaStr('18') }}
19
- {{ fsc.modelo303['19'] is empty ? '' : number(fsc.modelo303['19'], 2) }}
+ {{ fsc.modelo303.casillaStr('19') }}
20
- {{ fsc.modelo303['20'] is empty ? '' : number(fsc.modelo303['20'], 2) }}
+ {{ fsc.modelo303.casillaStr('20') }}
21
- {{ fsc.modelo303['21'] is empty ? '' : number(fsc.modelo303['21'], 2) }}
+ {{ fsc.modelo303.casillaStr('21') }}
22
- {{ fsc.modelo303['22'] is empty ? '' : number(fsc.modelo303['22'], 2) }}
+ {{ fsc.modelo303.casillaStr('22') }}
23
- {{ fsc.modelo303['23'] is empty ? '' : number(fsc.modelo303['23'], 2) }}
+ {{ fsc.modelo303.casillaStr('23') }}
24
- {{ fsc.modelo303['24'] is empty ? '' : number(fsc.modelo303['24'], 2) }}
+ {{ fsc.modelo303.casillaStr('24') }}
25
- {{ fsc.modelo303['25'] is empty ? '' : number(fsc.modelo303['25'], 2) }}
+ {{ fsc.modelo303.casillaStr('25') }}
-
+
26
- {{ fsc.modelo303['26'] is empty ? '' : number(fsc.modelo303['26'], 2) }}
+ {{ fsc.modelo303.casillaStr('26') }}
@@ -201,7 +201,7 @@
{{ trans('total-accrued-fee') }}
27
- {{ fsc.modelo303['27'] is empty ? '' : number(fsc.modelo303['27'], 2) }}
+ {{ fsc.modelo303.casillaStr('27') }}
@@ -225,14 +225,14 @@
- {{ trans('deductible-vat-28') }}
+ {{ trans('deductible-vat') }}
28
- {{ fsc.modelo303['28'] is empty ? '' : number(fsc.modelo303['28'], 2) }}
+ {{ fsc.modelo303.casillaStr('28') }}
29
- {{ fsc.modelo303['29'] is empty ? '' : number(fsc.modelo303['29'], 2) }}
+ {{ fsc.modelo303.casillaStr('29') }}
@@ -243,7 +243,7 @@
{{ trans('total-to-deduct') }}
45
- {{ fsc.modelo303['45'] is empty ? '' : number(fsc.modelo303['45'], 2) }}
+ {{ fsc.modelo303.casillaStr('45') }}
@@ -259,7 +259,7 @@
{{ trans('total-result-of-the-general-regime') }}
46
- {{ fsc.modelo303['46'] is empty ? '' : number(fsc.modelo303['46'], 2) }}
+ {{ fsc.modelo303.casillaStr('46') }}
diff --git a/XMLView/ListPartidaImpuestoResumen.xml b/XMLView/ListPartidaImpuestoResumen.xml
index 30e0178..161ae82 100644
--- a/XMLView/ListPartidaImpuestoResumen.xml
+++ b/XMLView/ListPartidaImpuestoResumen.xml
@@ -16,63 +16,34 @@
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
- * @author Carlos García Gómez
* @author Jose Antonio Cuello Principal
-->
-
-
+
+
-
-
-
-
-
-
+
-
+
-
-
-
-
-
- lt:0
-
-
-
+
-
-
- lt:0
-
-
-
+
-
-
+
+
lt:0
-
-
+
+
lt:0
-
-
-
-
-
-
- IVASOP
- IVAREP
-
-
-
\ No newline at end of file
+
diff --git a/facturascripts.ini b/facturascripts.ini
index a3d3901..198432a 100644
--- a/facturascripts.ini
+++ b/facturascripts.ini
@@ -1,4 +1,4 @@
name = 'Modelo303'
description = 'Modelo 303 y 390 de la Hacienda española para la declaración trimestral y anual de IVA.'
-version = 2.7
-min_version = 2025
\ No newline at end of file
+version = 2.8
+min_version = 2025