Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 13 additions & 159 deletions Controller/EditRegularizacionImpuesto.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@
use FacturaScripts\Core\Base\DataBase\DataBaseWhere;
use FacturaScripts\Core\DataSrc\Impuestos;
use FacturaScripts\Core\DataSrc\Series;
use FacturaScripts\Core\KernelException;
use FacturaScripts\Core\Lib\ExtendedController\BaseView;
use FacturaScripts\Core\Lib\ExtendedController\EditController;
use FacturaScripts\Core\Model\Asiento;
use FacturaScripts\Core\Tools;
use FacturaScripts\Dinamic\Lib\Accounting\VatRegularizationToAccounting;
use FacturaScripts\Dinamic\Lib\SubAccountTools;
use FacturaScripts\Dinamic\Model\Join\PartidaImpuestoResumen;
use FacturaScripts\Dinamic\Model\Partida;
use FacturaScripts\Dinamic\Model\RegularizacionImpuesto;
use FacturaScripts\Plugins\Modelo303\Lib\Modelo303Calculator;
use FacturaScripts\Plugins\Modelo303\Lib\Modelo303Data;

/**
* Controller to list the items in the RegularizacionImpuesto model
Expand All @@ -50,8 +51,7 @@ class EditRegularizacionImpuesto extends EditController
/** @var float */
public $total;

/** @var array */
public array $modelo303 = [];
public Modelo303Data $modelo303;

public function getModelClassName(): string
{
Expand Down Expand Up @@ -209,163 +209,17 @@ protected function getListPartidaImpuesto(BaseView $view, int $group): void
}
}

/**
* @throws KernelException
*/
protected function getListPartidaImpuestoResumen(BaseView $view): void
{
$impuestos = Impuestos::all();

// obtenemos los codigos de subcuentas de los impuestos
$subcuentas = array_values(array_unique(array_filter(array_merge(
array_column($impuestos, 'codsubcuentarep'),
array_column($impuestos, 'codsubcuentasop'),
))));

// Obtenemos los asientos para poder filtrar
// por fecha. Asi nos aseguramos que se filtra
// primero por fecha de devengo y si no existe
// por fecha de factura
$asientos = Asiento::all([
new DataBaseWhere('codejercicio', $this->getModel()->codejercicio),
new DataBaseWhere('fecha', $this->getModel()->fechainicio, '>='),
new DataBaseWhere('fecha', $this->getModel()->fechafin, '<'),
], [], 0, 0);
$idsAsientos = array_unique(array_column($asientos, Asiento::primaryColumn()));

if(empty($idsAsientos)) {
Tools::log()->warning('accounting-entry-not-found');
return;
}

$partidas = Partida::all([
new DataBaseWhere('idasiento', $idsAsientos, 'IN'),
new DataBaseWhere('codsubcuenta', $subcuentas, 'IN')
], [], 0, 0);

// agrupamos por subcuenta
$partidasAgrupadas = [];
foreach ($partidas as $partida) {
$partidasAgrupadas[$partida->codsubcuenta][] = $partida;
}

// inicializamos el modelo303
$this->modelo303 = [];
for ($i = 0; $i <= 200; $i++) {
$this->modelo303[sprintf('%02d', $i)] = 0.00;
}

// set default values
$this->modelo303['02'] = 4.00;
$this->modelo303['05'] = 10.00;
$this->modelo303['08'] = 21.00;
$this->modelo303['157'] = 1.75;
$this->modelo303['169'] = 0.5;
$this->modelo303['20'] = 1.4;
$this->modelo303['23'] = 5.2;

// obtenemos los códigos de subcuentas agrupados según tipo iva
// esto lo hacemos por si existen varios impuestos
// del mismo iva y distintas subcuentas
$subcuentasSegunIVA = [];
foreach ($impuestos as $impuesto) {
$subcuentasSegunIVA[$impuesto->iva]['repercutido'][] = $impuesto->codsubcuentarep;
$subcuentasSegunIVA[$impuesto->iva]['soportado'][] = $impuesto->codsubcuentasop;
}

// obtenemos los codigos de subcuentas agrupados según tipo recargo
// esto lo hacemos por si existen varios impuestos
// del mismo recargo y distintas subcuentas
$subcuentasSegunRecargo = [];
foreach ($impuestos as $impuesto) {
$subcuentasSegunRecargo[$impuesto->recargo]['repercutido'][] = $impuesto->codsubcuentarepre;
$subcuentasSegunRecargo[$impuesto->recargo]['soportado'][] = $impuesto->codsubcuentasopre;
}

foreach ($partidasAgrupadas as $subcuenta => $movimientos) {
foreach ($movimientos as $mov) {
// IVA 4%
if (in_array($subcuenta, $subcuentasSegunIVA[4]['repercutido'])) {
$this->modelo303['01'] += $mov->baseimponible;
$this->modelo303['03'] += $mov->haber;
}

// IVA 10%
if (in_array($subcuenta, $subcuentasSegunIVA[10]['repercutido'])) {
$this->modelo303['04'] += $mov->baseimponible;
$this->modelo303['06'] += $mov->haber;
}

// IVA 21%
if (in_array($subcuenta, $subcuentasSegunIVA[21]['repercutido'])) {
$this->modelo303['07'] += $mov->baseimponible;
$this->modelo303['09'] += $mov->haber;
}

// IVA 0%
if (in_array($subcuenta, $subcuentasSegunIVA[0]['repercutido'])) {
$this->modelo303['150'] += $mov->baseimponible;
$this->modelo303['152'] += $mov->haber;
}

// RECARGO 1.75%
if (in_array($subcuenta, $subcuentasSegunRecargo[1.75]['repercutido'])) {
$this->modelo303['156'] += $mov->baseimponible;
$this->modelo303['158'] += $mov->haber;
}

// RECARGO 0.5%
if (in_array($subcuenta, $subcuentasSegunRecargo[0.5]['repercutido'])) {
$this->modelo303['168'] += $mov->baseimponible;
$this->modelo303['170'] += $mov->haber;
}

// RECARGO 1.4%
if (in_array($subcuenta, $subcuentasSegunRecargo[1.4]['repercutido'])) {
$this->modelo303['19'] += $mov->baseimponible;
$this->modelo303['21'] += $mov->haber;
}

// RECARGO 5.2%
if (in_array($subcuenta, $subcuentasSegunRecargo[5.2]['repercutido'])) {
$this->modelo303['22'] += $mov->baseimponible;
$this->modelo303['24'] += $mov->haber;
}
}
}

// Total cuota devengada
$this->modelo303['27'] = $this->modelo303['152'] + $this->modelo303['167'] + $this->modelo303['03'] + $this->modelo303['155'] + $this->modelo303['06'] + $this->modelo303['09'] + $this->modelo303['11'] + $this->modelo303['13'] + $this->modelo303['15'] + $this->modelo303['158'] + $this->modelo303['170'] + $this->modelo303['18'] + $this->modelo303['21'] + $this->modelo303['24'] + $this->modelo303['26'];

/**
* IVA DEDUCIBLE
*/

// Por cuotas soportadas en operaciones interiores corrientes
foreach ($partidasAgrupadas as $subcuenta => $movimientos) {
foreach ($movimientos as $mov) {
// IVA 4%
if (in_array($subcuenta, $subcuentasSegunIVA[4]['soportado'])) {
$this->modelo303['28'] += $mov->baseimponible;
$this->modelo303['29'] += $mov->debe;
}

// IVA 10%
if (in_array($subcuenta, $subcuentasSegunIVA[10]['soportado'])) {
$this->modelo303['28'] += $mov->baseimponible;
$this->modelo303['29'] += $mov->debe;
}

// IVA 21%
if (in_array($subcuenta, $subcuentasSegunIVA[21]['soportado'])) {
$this->modelo303['28'] += $mov->baseimponible;
$this->modelo303['29'] += $mov->debe;
}
}
}

// Total a deducir
$this->modelo303['45'] = $this->modelo303['29'] + $this->modelo303['31'] + $this->modelo303['33'] + $this->modelo303['35'] + $this->modelo303['37'] + $this->modelo303['39'] + $this->modelo303['41'] + $this->modelo303['42'] + $this->modelo303['43'] + $this->modelo303['44'];

// Resultado régimen general
$this->modelo303['46'] = $this->modelo303['27'] - $this->modelo303['45'];
// Calculamos casillas del modelo 303
$this->modelo303 = Modelo303Calculator::calculate(
$this->getModel()->codejercicio,
$this->getModel()->fechainicio,
$this->getModel()->fechafin,
);
}

/**
Expand Down
51 changes: 51 additions & 0 deletions Lib/AccountingItems.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

namespace FacturaScripts\Plugins\Modelo303\Lib;

use FacturaScripts\Core\Base\DataBase\DataBaseWhere;
use FacturaScripts\Core\DataSrc\Impuestos;
use FacturaScripts\Core\Model\Asiento;
use FacturaScripts\Core\Tools;
use FacturaScripts\Dinamic\Model\Partida;

class AccountingItems
{
public static function groupedBySubaccount(string $codejercicio, string $fechainicio, string $fechafin): array
{
$impuestos = Impuestos::all();

// obtenemos los codigos de subcuentas de los impuestos
$subcuentas = array_values(array_unique(array_filter(array_merge(
array_column($impuestos, 'codsubcuentarep'),
array_column($impuestos, 'codsubcuentasop'),
))));

// Obtenemos los asientos para poder filtrar
// por fecha. Asi nos aseguramos que se filtra
// primero por fecha de devengo y si no existe
// por fecha de factura
$asientos = Asiento::all([
new DataBaseWhere('codejercicio', $codejercicio),
new DataBaseWhere('fecha', $fechainicio, '>='),
new DataBaseWhere('fecha', $fechafin, '<'),
], [], 0, 0);
$idsAsientos = array_unique(array_column($asientos, Asiento::primaryColumn()));

if(empty($idsAsientos)) {
Tools::log()->warning('accounting-entry-not-found');
return [];
}

$partidas = Partida::all([
new DataBaseWhere('idasiento', $idsAsientos, 'IN'),
new DataBaseWhere('codsubcuenta', $subcuentas, 'IN')
], [], 0, 0);

$partidasAgrupadas = [];
foreach ($partidas as $partida) {
$partidasAgrupadas[$partida->codsubcuenta][] = $partida;
}

return $partidasAgrupadas;
}
}
Loading