From da016ef50faba87e82842c5d2e7d591d99cb9659 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 25 Feb 2021 14:47:10 +0100 Subject: [PATCH] Miglioramento generazione conti per Clienti e Fornitori Aggiunto controllo su conto pre-esistente per ripristino collegamento. --- modules/anagrafiche/src/Anagrafica.php | 75 +++++++++++++++++++------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/modules/anagrafiche/src/Anagrafica.php b/modules/anagrafiche/src/Anagrafica.php index bb659d058..71022a16b 100755 --- a/modules/anagrafiche/src/Anagrafica.php +++ b/modules/anagrafiche/src/Anagrafica.php @@ -99,40 +99,24 @@ class Anagrafica extends Model public static function fixCliente(Anagrafica $anagrafica) { - $database = database(); - // Creo il relativo conto nel partitario se non esiste if (empty($anagrafica->idconto_cliente)) { - // Calcolo prossimo numero cliente - $rs = $database->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Crediti clienti e crediti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - $database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2) VALUES('.prepare($new_numero).', '.prepare($anagrafica->ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'))"); - $idconto = $database->lastInsertedID(); + $id_conto = self::creaConto($anagrafica, 'idconto_cliente'); // Collegamento conto - $anagrafica->idconto_cliente = $idconto; + $anagrafica->idconto_cliente = $id_conto; $anagrafica->save(); } } public static function fixFornitore(Anagrafica $anagrafica) { - $database = database(); - // Creo il relativo conto nel partitario se non esiste if (empty($anagrafica->idconto_fornitore)) { - // Calcolo prossimo numero cliente - $rs = $database->fetchArray("SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Debiti fornitori e debiti diversi'"); - $new_numero = $rs[0]['max_numero'] + 1; - $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); - - $database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2) VALUES('.prepare($new_numero).', '.prepare($anagrafica->ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'))"); - $idconto = $database->lastInsertedID(); + $id_conto = self::creaConto($anagrafica, 'idconto_fornitore'); // Collegamento conto - $anagrafica->idconto_fornitore = $idconto; + $anagrafica->idconto_fornitore = $id_conto; $anagrafica->save(); } } @@ -364,6 +348,57 @@ class Anagrafica extends Model return $codice; } + protected static function creaConto(Anagrafica $anagrafica, $campo) + { + if ($campo == 'idconto_cliente') { + $type = 'Crediti clienti e crediti diversi'; + } else { + $type = 'Debiti fornitori e debiti diversi'; + } + + $database = database(); + + // Individuazione della categoria + $categoria_conto = $database->table('co_pianodeiconti2') + ->where('descrizione', '=', $type) + ->first(); + + // Query di base + $table = $database->table('co_pianodeiconti3') + ->where('idpianodeiconti2', '=', $categoria_conto->id); + + // Verifica su un possibile conto esistente ma non collegato + $conto = (clone $table) + ->where('descrizione', 'like', '%'.$anagrafica->ragione_sociale.'%') + ->first(); + if (!empty($conto)) { + $anagrafiche_collegate = Anagrafica::where($campo, '=', $conto->id)->count(); + $conto = $anagrafiche_collegate == 0 ? $conto : null; + } + + // Collegamento a conto esistente + if (!empty($conto)) { + return $conto->id; + } + + // Calcolo prossimo numero cliente + $numero = (clone $table) + ->selectRaw('MAX(CAST(numero AS UNSIGNED)) AS max_numero') + ->first(); + $new_numero = $numero->max_numero + 1; + $new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT); + + // Creazione del conto + $id_conto = $database->table('co_pianodeiconti3') + ->insertGetId([ + 'numero' => $new_numero, + 'descrizione' => $anagrafica->ragione_sociale, + 'idpianodeiconti2' => $categoria_conto->id, + ]); + + return $id_conto; + } + protected function fixRagioneSociale() { if (!empty($this->cognome) || !empty($this->nome)) {