Skip to content

Commit 24d89c9

Browse files
committed
refactor: spostamento funzioni per impostazione banca accredito in preventivi
1 parent 6d371d0 commit 24d89c9

3 files changed

Lines changed: 155 additions & 55 deletions

File tree

lib/common.php

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
*/
2626
use Common\Components\Accounting;
2727
use Intervention\Image\ImageManager;
28+
use Modules\Anagrafiche\Anagrafica;
29+
use Modules\Banche\Banca;
2830
use Modules\Contratti\Contratto;
2931
use Modules\DDT\DDT;
3032
use Modules\Fatture\Fattura;
@@ -481,3 +483,139 @@ function getImageManager()
481483
{
482484
return extension_loaded('gd') ? ImageManager::gd() : ImageManager::imagick();
483485
}
486+
487+
/**
488+
* Determina la banca dell'azienda da utilizzare per il documento.
489+
*
490+
* @param \Modules\Anagrafiche\Anagrafica $azienda Anagrafica dell'azienda
491+
* @param int $id_pagamento ID del tipo di pagamento
492+
* @param string $conto Tipo di conto (vendite/acquisti)
493+
* @param string $direzione Direzione del documento (entrata/uscita)
494+
* @param \Modules\Anagrafiche\Anagrafica $anagrafica_controparte Anagrafica della controparte
495+
*
496+
* @return int|null ID della banca selezionata
497+
*/
498+
function getBancaAzienda($azienda, $id_pagamento, $conto, $direzione, $anagrafica_controparte)
499+
{
500+
$database = database();
501+
502+
// Per i documenti di vendita, priorità alla banca dell'azienda
503+
// Per i documenti di acquisto, priorità alla banca del fornitore
504+
$anagrafica_principale = ($direzione == 'entrata') ? $azienda : $anagrafica_controparte;
505+
506+
// Pulizia preventiva dei riferimenti a banche inesistenti nell'anagrafica
507+
cleanInvalidBankReferences($azienda);
508+
cleanInvalidBankReferences($anagrafica_controparte);
509+
510+
// Per i documenti di vendita, verifica prima la banca predefinita per accrediti del cliente
511+
if ($direzione == 'entrata' && !empty($anagrafica_controparte->idbanca_vendite)) {
512+
$id_banca = $anagrafica_controparte->idbanca_vendite;
513+
514+
// Verifica che la banca esista effettivamente
515+
$banca_esistente = Banca::find($id_banca);
516+
if (!$banca_esistente || $banca_esistente->deleted_at) {
517+
$id_banca = null;
518+
}
519+
520+
// Se la banca del cliente è valida, la restituisce
521+
if ($id_banca) {
522+
return $id_banca;
523+
}
524+
}
525+
526+
// 1. Banca predefinita dell'anagrafica principale per il tipo di operazione
527+
$id_banca = $anagrafica_principale->{"idbanca_{$conto}"};
528+
529+
// Verifica che la banca esista effettivamente
530+
if ($id_banca) {
531+
$banca_esistente = Banca::find($id_banca);
532+
if (!$banca_esistente || $banca_esistente->deleted_at) {
533+
$id_banca = null;
534+
}
535+
}
536+
537+
// 2. Banca dell'azienda con conto corrispondente al tipo di pagamento (predefinita)
538+
if (empty($id_banca)) {
539+
$id_banca = getBancaByPagamento($database, $azienda->id, $id_pagamento, $conto, true);
540+
}
541+
542+
// 3. Banca dell'azienda con conto corrispondente al tipo di pagamento (qualsiasi)
543+
if (empty($id_banca)) {
544+
$id_banca = getBancaByPagamento($database, $azienda->id, $id_pagamento, $conto, false);
545+
}
546+
547+
// 4. Fallback: banca predefinita dell'azienda
548+
if (empty($id_banca)) {
549+
$banca_predefinita = Banca::where('id_anagrafica', $azienda->id)
550+
->where('predefined', 1)
551+
->whereNull('deleted_at')
552+
->first();
553+
$id_banca = $banca_predefinita?->id;
554+
}
555+
556+
return $id_banca;
557+
}
558+
559+
/**
560+
* Cerca una banca dell'azienda associata al tipo di pagamento.
561+
*
562+
* @param object $database Database object
563+
* @param int $id_anagrafica ID dell'anagrafica
564+
* @param int $id_pagamento ID del tipo di pagamento
565+
* @param string $conto Tipo di conto (vendite/acquisti)
566+
* @param bool $solo_predefinita Se true, cerca solo banche predefinite
567+
*
568+
* @return int|null ID della banca trovata
569+
*/
570+
function getBancaByPagamento($database, $id_anagrafica, $id_pagamento, $conto, $solo_predefinita)
571+
{
572+
$where_predefined = $solo_predefinita ? 'AND `predefined`=1' : '';
573+
574+
$query = "SELECT `id` FROM `co_banche`
575+
WHERE `deleted_at` IS NULL
576+
{$where_predefined}
577+
AND `id_pianodeiconti3` = (SELECT idconto_{$conto} FROM `co_pagamenti` WHERE `id` = :id_pagamento)
578+
AND `id_anagrafica` = :id_anagrafica";
579+
580+
$result = $database->fetchOne($query, [
581+
':id_pagamento' => $id_pagamento,
582+
':id_anagrafica' => $id_anagrafica,
583+
]);
584+
585+
return $result['id'] ?? null;
586+
}
587+
588+
/**
589+
* Pulisce i riferimenti a banche inesistenti o eliminate dall'anagrafica.
590+
*
591+
* @param \Modules\Anagrafiche\Anagrafica $anagrafica Anagrafica da pulire
592+
*
593+
* @return void
594+
*/
595+
function cleanInvalidBankReferences($anagrafica)
596+
{
597+
$changed = false;
598+
599+
// Verifica idbanca_vendite
600+
if ($anagrafica->idbanca_vendite) {
601+
$banca = Banca::find($anagrafica->idbanca_vendite);
602+
if (!$banca || $banca->deleted_at) {
603+
$anagrafica->idbanca_vendite = null;
604+
$changed = true;
605+
}
606+
}
607+
608+
// Verifica idbanca_acquisti
609+
if ($anagrafica->idbanca_acquisti) {
610+
$banca = Banca::find($anagrafica->idbanca_acquisti);
611+
if (!$banca || $banca->deleted_at) {
612+
$anagrafica->idbanca_acquisti = null;
613+
$changed = true;
614+
}
615+
}
616+
617+
// Salva le modifiche se necessario
618+
if ($changed) {
619+
$anagrafica->save();
620+
}
621+
}

modules/fatture/src/Fattura.php

Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data
165165
$azienda = Anagrafica::find(setting('Azienda predefinita'));
166166

167167
// Logica unificata per la ricerca della banca dell'azienda
168-
$id_banca_azienda = self::getBancaAzienda($azienda, $id_pagamento, $conto, $direzione, $anagrafica);
168+
$id_banca_azienda = getBancaAzienda($azienda, $id_pagamento, $conto, $direzione, $anagrafica);
169169

170170
$model->id_banca_azienda = $id_banca_azienda;
171171

@@ -1050,58 +1050,4 @@ private static function getBancaAzienda(Anagrafica $azienda, int $id_pagamento,
10501050

10511051
return $id_banca;
10521052
}
1053-
1054-
/**
1055-
* Cerca una banca dell'azienda associata al tipo di pagamento.
1056-
*
1057-
* @param object $database
1058-
*/
1059-
private static function getBancaByPagamento($database, int $id_anagrafica, int $id_pagamento, string $conto, bool $solo_predefinita): ?int
1060-
{
1061-
$where_predefined = $solo_predefinita ? 'AND `predefined`=1' : '';
1062-
1063-
$query = "SELECT `id` FROM `co_banche`
1064-
WHERE `deleted_at` IS NULL
1065-
{$where_predefined}
1066-
AND `id_pianodeiconti3` = (SELECT idconto_{$conto} FROM `co_pagamenti` WHERE `id` = :id_pagamento)
1067-
AND `id_anagrafica` = :id_anagrafica";
1068-
1069-
$result = $database->fetchOne($query, [
1070-
':id_pagamento' => $id_pagamento,
1071-
':id_anagrafica' => $id_anagrafica,
1072-
]);
1073-
1074-
return $result['id'] ?? null;
1075-
}
1076-
1077-
/**
1078-
* Pulisce i riferimenti a banche inesistenti o eliminate dall'anagrafica.
1079-
*/
1080-
private static function cleanInvalidBankReferences(Anagrafica $anagrafica): void
1081-
{
1082-
$changed = false;
1083-
1084-
// Verifica idbanca_vendite
1085-
if ($anagrafica->idbanca_vendite) {
1086-
$banca = Banca::find($anagrafica->idbanca_vendite);
1087-
if (!$banca || $banca->deleted_at) {
1088-
$anagrafica->idbanca_vendite = null;
1089-
$changed = true;
1090-
}
1091-
}
1092-
1093-
// Verifica idbanca_acquisti
1094-
if ($anagrafica->idbanca_acquisti) {
1095-
$banca = Banca::find($anagrafica->idbanca_acquisti);
1096-
if (!$banca || $banca->deleted_at) {
1097-
$anagrafica->idbanca_acquisti = null;
1098-
$changed = true;
1099-
}
1100-
}
1101-
1102-
// Salva le modifiche se necessario
1103-
if ($changed) {
1104-
$anagrafica->save();
1105-
}
1106-
}
11071053
}

modules/preventivi/src/Preventivo.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Common\Components\Component;
2626
use Common\Document;
2727
use Modules\Anagrafiche\Anagrafica;
28+
use Modules\Banche\Banca;
2829
use Modules\Fatture\Fattura;
2930
use Modules\Interventi\Intervento;
3031
use Modules\TipiIntervento\Tipo as TipoSessione;
@@ -109,6 +110,21 @@ public static function build(Anagrafica $anagrafica, TipoSessione $tipo_sessione
109110
$model->idagente = $id_agente;
110111
}
111112

113+
// Banca predefinita per l'anagrafica controparte (cliente)
114+
$banca_controparte = Banca::where('id_anagrafica', $anagrafica->id)
115+
->where('predefined', 1)
116+
->first();
117+
118+
$model->id_banca_controparte = $banca_controparte?->id;
119+
120+
// Banca predefinita per l'azienda, con ricerca della banca impostata per il pagamento
121+
$azienda = Anagrafica::find(setting('Azienda predefinita'));
122+
123+
// Logica unificata per la ricerca della banca dell'azienda
124+
$id_banca_azienda = getBancaAzienda($azienda, $id_pagamento, 'vendite', 'entrata', $anagrafica);
125+
126+
$model->id_banca_azienda = $id_banca_azienda;
127+
112128
$model->condizioni_fornitura = setting('Condizioni generali di fornitura preventivi');
113129
$model->id_segment = $id_segment;
114130

0 commit comments

Comments
 (0)