@@ -161,30 +161,11 @@ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data
161161 $ model ->idpagamento = $ id_pagamento ;
162162
163163 // Banca predefinita per l'azienda, con ricerca della banca impostata per il pagamento
164- $ id_banca_azienda = $ anagrafica ->{'idbanca_ ' .$ conto };
165- if (empty ($ id_banca_azienda )) {
166- $ azienda = Anagrafica::find (setting ('Azienda predefinita ' ));
167- $ id_banca_azienda = $ database ->fetchOne ('SELECT `id` FROM `co_banche` WHERE `deleted_at` IS NULL AND `predefined`=1 AND `id_pianodeiconti3` = (SELECT idconto_ ' .$ conto .' FROM `co_pagamenti` WHERE `id` = :id_pagamento) AND `id_anagrafica` = :id_anagrafica ' , [
168- ':id_pagamento ' => $ id_pagamento ,
169- ':id_anagrafica ' => $ azienda ->id ,
170- ])['id ' ];
171- if (empty ($ id_banca_azienda )) {
172- $ id_banca_azienda = $ database ->fetchOne ('SELECT `id` FROM `co_banche` WHERE `deleted_at` IS NULL AND `id_pianodeiconti3` = (SELECT idconto_ ' .$ conto .' FROM `co_pagamenti` WHERE `id` = :id_pagamento) AND `id_anagrafica` = :id_anagrafica ' , [
173- ':id_pagamento ' => $ id_pagamento ,
174- ':id_anagrafica ' => $ azienda ->id ,
175- ])['id ' ];
176- }
177- if (empty ($ id_banca_azienda )) {
178- $ id_banca_azienda = $ azienda ->{'idbanca_ ' .$ conto };
179- }
180- // Fallback finale: banca predefinita dell'azienda
181- if (empty ($ id_banca_azienda )) {
182- $ banca_predefinita_azienda = Banca::where ('id_anagrafica ' , $ azienda ->id )
183- ->where ('predefined ' , 1 )
184- ->first ();
185- $ id_banca_azienda = $ banca_predefinita_azienda ?->id;
186- }
187- }
164+ $ id_banca_azienda = null ;
165+ $ azienda = Anagrafica::find (setting ('Azienda predefinita ' ));
166+
167+ // Logica unificata per la ricerca della banca dell'azienda
168+ $ id_banca_azienda = self ::getBancaAzienda ($ azienda , $ id_pagamento , $ conto , $ direzione , $ anagrafica );
188169
189170 $ model ->id_banca_azienda = $ id_banca_azienda ;
190171
@@ -871,6 +852,76 @@ public function getBanca()
871852
872853 // Metodi statici
873854
855+ /**
856+ * Determina la banca dell'azienda da utilizzare per il documento.
857+ *
858+ * @param Anagrafica $azienda
859+ * @param int $id_pagamento
860+ * @param string $conto
861+ * @param string $direzione
862+ * @param Anagrafica $anagrafica_controparte
863+ * @return int|null
864+ */
865+ private static function getBancaAzienda (Anagrafica $ azienda , int $ id_pagamento , string $ conto , string $ direzione , Anagrafica $ anagrafica_controparte ): ?int
866+ {
867+ $ database = database ();
868+
869+ // Per le fatture di vendita, priorità alla banca dell'azienda
870+ // Per le fatture di acquisto, priorità alla banca del fornitore
871+ $ anagrafica_principale = ($ direzione == 'entrata ' ) ? $ azienda : $ anagrafica_controparte ;
872+
873+ // 1. Banca predefinita dell'anagrafica principale per il tipo di operazione
874+ $ id_banca = $ anagrafica_principale ->{"idbanca_ {$ conto }" };
875+
876+ // 2. Banca dell'azienda con conto corrispondente al tipo di pagamento (predefinita)
877+ if (empty ($ id_banca )) {
878+ $ id_banca = self ::getBancaByPagamento ($ database , $ azienda ->id , $ id_pagamento , $ conto , true );
879+ }
880+
881+ // 3. Banca dell'azienda con conto corrispondente al tipo di pagamento (qualsiasi)
882+ if (empty ($ id_banca )) {
883+ $ id_banca = self ::getBancaByPagamento ($ database , $ azienda ->id , $ id_pagamento , $ conto , false );
884+ }
885+
886+ // 4. Fallback: banca predefinita dell'azienda
887+ if (empty ($ id_banca )) {
888+ $ banca_predefinita = Banca::where ('id_anagrafica ' , $ azienda ->id )
889+ ->where ('predefined ' , 1 )
890+ ->first ();
891+ $ id_banca = $ banca_predefinita ?->id;
892+ }
893+
894+ return $ id_banca ;
895+ }
896+
897+ /**
898+ * Cerca una banca dell'azienda associata al tipo di pagamento.
899+ *
900+ * @param object $database
901+ * @param int $id_anagrafica
902+ * @param int $id_pagamento
903+ * @param string $conto
904+ * @param bool $solo_predefinita
905+ * @return int|null
906+ */
907+ private static function getBancaByPagamento ($ database , int $ id_anagrafica , int $ id_pagamento , string $ conto , bool $ solo_predefinita ): ?int
908+ {
909+ $ where_predefined = $ solo_predefinita ? 'AND `predefined`=1 ' : '' ;
910+
911+ $ query = "SELECT `id` FROM `co_banche`
912+ WHERE `deleted_at` IS NULL
913+ {$ where_predefined }
914+ AND `id_pianodeiconti3` = (SELECT idconto_ {$ conto } FROM `co_pagamenti` WHERE `id` = :id_pagamento)
915+ AND `id_anagrafica` = :id_anagrafica " ;
916+
917+ $ result = $ database ->fetchOne ($ query , [
918+ ':id_pagamento ' => $ id_pagamento ,
919+ ':id_anagrafica ' => $ id_anagrafica ,
920+ ]);
921+
922+ return $ result ['id ' ] ?? null ;
923+ }
924+
874925 /**
875926 * Calcola il nuovo numero di fattura.
876927 *
0 commit comments