Skip to content
Merged
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
42 changes: 33 additions & 9 deletions Lib/Txt347Export.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

namespace FacturaScripts\Plugins\Modelo347\Lib;

use FacturaScripts\Core\DataSrc\Paises;
use FacturaScripts\Core\Tools;
use FacturaScripts\Dinamic\Model\Ejercicio;
use FacturaScripts\Dinamic\Model\Empresa;
Expand Down Expand Up @@ -57,14 +58,35 @@ public static function export(string $codejercicio, array $customersData, array

protected static function checkCifNif(array $item): string
{
if (strtoupper($item['codpais']) !== 'ES'
&& false === in_array(strtoupper($item['tipoidfiscal']), ['DNI', 'CIF', 'NIF'])) {
if (false === self::isSpanish($item['codpais'] ?? '')) {
return self::formatString('', 9, ' ', STR_PAD_RIGHT);
}

return self::formatString($item['cifnif'], 9, '0', STR_PAD_RIGHT);
}

protected static function isSpanish(string $codpais): bool
{
$pais = Paises::get($codpais);
return strtoupper($pais->codiso ?? '') === 'ES';
}

protected static function getNifOperadorComunitario(array $item): string
{
$codpais = $item['codpais'] ?? '';
if (false === self::isSpanish($codpais) && !empty($item['cifnif']) && Paises::miembroUE($codpais)) {
$pais = Paises::get($codpais);
Comment on lines +68 to +78
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Paises::get($codpais) se llama en isSpanish() y de nuevo en getNifOperadorComunitario() (además de leer codiso dos veces). Si Paises::get() implica acceso a caché/BD, esto duplica trabajo por cada registro. Para evitarlo, obtén el país una sola vez en getNifOperadorComunitario() (y deriva de ahí si es España y el codiso), o cambia isSpanish() para aceptar el objeto país/codiso ya resuelto.

Suggested change
protected static function isSpanish(string $codpais): bool
{
$pais = Paises::get($codpais);
return strtoupper($pais->codiso ?? '') === 'ES';
}
protected static function getNifOperadorComunitario(array $item): string
{
$codpais = $item['codpais'] ?? '';
if (false === self::isSpanish($codpais) && !empty($item['cifnif']) && Paises::miembroUE($codpais)) {
$pais = Paises::get($codpais);
protected static function isSpanish(string $codpais, ?Pais $pais = null): bool
{
if (null === $pais) {
$pais = Paises::get($codpais);
}
return strtoupper($pais->codiso ?? '') === 'ES';
}
protected static function getNifOperadorComunitario(array $item): string
{
$codpais = $item['codpais'] ?? '';
$pais = Paises::get($codpais);
if (false === self::isSpanish($codpais, $pais) && !empty($item['cifnif']) && Paises::miembroUE($codpais)) {

Copilot uses AI. Check for mistakes.
$countryCode = self::formatString($pais->codiso ?? '', 2, ' ', STR_PAD_RIGHT);
$vat = strtoupper(preg_replace('/[^A-Z0-9]/', '', $item['cifnif']));
$iso = strtoupper($pais->codiso ?? '');
if (!empty($iso) && str_starts_with($vat, $iso)) {
$vat = substr($vat, strlen($iso));
}
return $countryCode . self::formatString($vat, 15, ' ', STR_PAD_RIGHT);
}
return self::formatString('', 17, ' ', STR_PAD_RIGHT);
}

protected static function formatAmount(float $amount, int $length, int $align): string
{
$signed = ($amount < 0.00) ? 'N' : ' ';
Expand Down Expand Up @@ -115,7 +137,7 @@ protected static function getCompanyData(): string
. self::formatString('', 1, ' ', STR_PAD_LEFT)
. self::formatString('', 1, ' ', STR_PAD_LEFT) // DECLARACIÓN COMPLEMENTARIA O SUSTITUTIVA
. self::formatString('', 13, '0', STR_PAD_RIGHT) // NÚMERO IDENTIFICATIVO DE LA DECLARACIÓN ANTERIOR
. self::formatString(count(self::$customersData) + count(self::$suppliersData), 9, '0', STR_PAD_RIGHT) // NÚMERO TOTAL DE PERSONAS Y ENTIDADES
. self::formatString(count(self::$customersData) + count(self::$suppliersData), 9, '0', STR_PAD_LEFT) // NÚMERO TOTAL DE PERSONAS Y ENTIDADES
. self::formatAmount(self::$total, 16, STR_PAD_LEFT) // IMPORTE TOTAL ANUAL DE LAS OPERACIONES
. self::formatString('', 9, '0', STR_PAD_RIGHT) // NÚMERO TOTAL DE INMUEBLES
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE TOTAL ANUAL DE LAS OPERACIONES DE ARRENDAMIENTO DE LOCALES DE NEGOCIO
Expand Down Expand Up @@ -157,12 +179,13 @@ protected static function getCustomerData(): string
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE PERCIBIDO POR TRANSMISIONES DE INMUEBLES SUJETAS A IVA TERCER TRIMESTRE
. self::formatAmount($item['t4'], 16, STR_PAD_LEFT) // IMPORTE DE LAS OPERACIONES CUARTO TRIMESTRE
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE PERCIBIDO POR TRANSMISIONES DE INMUEBLES SUJETAS A IVA CUARTO TRIMESTRE
. self::formatString('', 17, ' ', STR_PAD_LEFT) // NIF OPERADOR COMUNITARIO
. self::getNifOperadorComunitario($item) // NIF OPERADOR COMUNITARIO
. ' ' // OPERACIONES RÉGIMEN ESPECIAL CRITERIO DE CAJA IVA
. ' ' // OPERACIÓN CON INVERSIÓN DEL SUJETO PASIVO
. ' ' // OPERACIÓN CON BIENES VINCULADOS O DESTINADOS A VINCULARSE AL RÉGIMEN DE DEPÓSITO DISTINTO DEL ADUANERO
. self::formatString('', 16, ' ', STR_PAD_LEFT) // IMPORTE ANUAL DE LAS OPERACIONES DEVENGADAS CONFORME AL CRITERIO DE CAJA DEL IVA
. self::formatString('', 201, ' ', STR_PAD_LEFT); // BLANCOS
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE ANUAL DE LAS OPERACIONES DEVENGADAS CONFORME AL CRITERIO DE CAJA DEL IVA
. self::formatString('000000', 6, '0', STR_PAD_LEFT) // NUMERO DE CONVOCATORIA BDNS
. self::formatString('', 195, ' ', STR_PAD_LEFT); // BLANCOS
}
return $txt;
}
Expand Down Expand Up @@ -405,12 +428,13 @@ protected static function getSupplierData(): string
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE PERCIBIDO POR TRANSMISIONES DE INMUEBLES SUJETAS A IVA TERCER TRIMESTRE
. self::formatAmount($item['t4'], 16, STR_PAD_LEFT) // IMPORTE DE LAS OPERACIONES CUARTO TRIMESTRE
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE PERCIBIDO POR TRANSMISIONES DE INMUEBLES SUJETAS A IVA CUARTO TRIMESTRE
. self::formatString('', 17, ' ', STR_PAD_LEFT) // NIF OPERADOR COMUNITARIO
. self::getNifOperadorComunitario($item) // NIF OPERADOR COMUNITARIO
. ' ' // OPERACIONES RÉGIMEN ESPECIAL CRITERIO DE CAJA IVA
. ' ' // OPERACIÓN CON INVERSIÓN DEL SUJETO PASIVO
. ' ' // OPERACIÓN CON BIENES VINCULADOS O DESTINADOS A VINCULARSE AL RÉGIMEN DE DEPÓSITO DISTINTO DEL ADUANERO
. self::formatString('', 16, ' ', STR_PAD_LEFT) // IMPORTE ANUAL DE LAS OPERACIONES DEVENGADAS CONFORME AL CRITERIO DE CAJA DEL IVA
. self::formatString('', 201, ' ', STR_PAD_LEFT); // BLANCOS
. self::formatAmount(0.00, 16, STR_PAD_LEFT) // IMPORTE ANUAL DE LAS OPERACIONES DEVENGADAS CONFORME AL CRITERIO DE CAJA DEL IVA
. self::formatString('000000', 6, '0', STR_PAD_LEFT) // NUMERO DE CONVOCATORIA BDNS
. self::formatString('', 195, ' ', STR_PAD_LEFT); // BLANCOS
}
return $txt;
}
Expand Down
Loading