2828use Modules \Anagrafiche \Sede ;
2929use Modules \Anagrafiche \Tipo ;
3030use Modules \Articoli \Articolo ;
31+ use Modules \Articoli \Barcode ;
3132use Modules \Articoli \Categoria ;
3233use Modules \Articoli \Marca ;
3334use Modules \Iva \Aliquota ;
@@ -336,7 +337,21 @@ public function init()
336337 }
337338
338339 if (!empty ($ record ['prezzo_listino ' ])) {
339- $ database ->query ('DELETE FROM mg_prezzi_articoli WHERE id_articolo = ' .prepare ($ articolo ->id ).' AND id_anagrafica = ' .prepare ($ anagrafica ->id ));
340+ // Determina la direzione del listino
341+ $ direzione = strtolower ((string ) ($ record ['dir ' ] ?? '' ));
342+ $ direzione = match ($ direzione ) {
343+ 'fornitore ' => 'uscita ' ,
344+ 'cliente ' => 'entrata ' ,
345+ default => null ,
346+ };
347+
348+ if ($ direzione ) {
349+ // Elimina solo i prezzi nella direzione specificata
350+ $ database ->query ('DELETE FROM mg_prezzi_articoli WHERE id_articolo = ' .prepare ($ articolo ->id ).' AND id_anagrafica = ' .prepare ($ anagrafica ->id ).' AND dir = ' .prepare ($ direzione ));
351+ } else {
352+ // Se la direzione non è specificata, elimina tutti i prezzi per questa combinazione
353+ $ database ->query ('DELETE FROM mg_prezzi_articoli WHERE id_articolo = ' .prepare ($ articolo ->id ).' AND id_anagrafica = ' .prepare ($ anagrafica ->id ));
354+ }
340355 }
341356
342357 if (!empty ($ record ['codice_fornitore ' ]) && !empty ($ record ['descrizione_fornitore ' ])) {
@@ -518,12 +533,15 @@ public function import($record, $update_record = true, $add_record = true)
518533 $ this ->aggiornaDettaglioPrezzi ($ articolo , $ dettagli );
519534 }
520535
536+ // Gestione barcode separata
537+ $ barcode_value = $ record ['barcode ' ] ?? '' ;
538+
521539 unset($ record ['anagrafica_listino ' ], $ record ['p_iva ' ], $ record ['qta_minima ' ],
522540 $ record ['qta_massima ' ], $ record ['prezzo_listino ' ], $ record ['sconto_listino ' ],
523541 $ record ['dir ' ], $ record ['codice_fornitore ' ], $ record ['barcode_fornitore ' ],
524542 $ record ['descrizione_fornitore ' ], $ record ['id_fornitore ' ],
525543 $ record ['categoria ' ], $ record ['sottocategoria ' ], $ record ['marca ' ], $ record ['modello ' ],
526- $ record ['codice_iva_vendita ' ], $ record ['data_qta ' ], $ record ['nome_sede ' ]);
544+ $ record ['codice_iva_vendita ' ], $ record ['data_qta ' ], $ record ['nome_sede ' ], $ record [ ' barcode ' ] );
527545
528546 $ this ->processaImmagine ($ articolo , $ url , $ record );
529547 unset($ record ['import_immagine ' ]);
@@ -551,6 +569,11 @@ public function import($record, $update_record = true, $add_record = true)
551569
552570 $ articolo ->save ();
553571
572+ // Gestione barcode dopo il salvataggio dell'articolo
573+ if (!empty ($ barcode_value )) {
574+ $ this ->processaBarcode ($ articolo , $ barcode_value );
575+ }
576+
554577 $ this ->aggiornaGiacenza ($ articolo , $ nuova_qta , $ nome_sede , $ record );
555578
556579 return true ;
@@ -803,6 +826,16 @@ protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
803826 };
804827
805828 if (!empty ($ anagrafica ) && !empty ($ dettagli ['dir ' ]) && $ dettagli ['prezzo_listino ' ]) {
829+ // Elimina i prezzi esistenti per questo articolo e anagrafica nella direzione specificata
830+ $ deleted_count = DettaglioPrezzo::where ('id_articolo ' , $ articolo ->id )
831+ ->where ('id_anagrafica ' , $ anagrafica ->id )
832+ ->where ('dir ' , $ dettagli ['dir ' ])
833+ ->delete ();
834+
835+ if ($ deleted_count > 0 ) {
836+ error_log ("Eliminati {$ deleted_count } prezzi esistenti per articolo {$ articolo ->codice } e anagrafica {$ anagrafica ->ragione_sociale } (direzione: {$ dettagli ['dir ' ]}) " );
837+ }
838+
806839 $ dettaglio_predefinito = DettaglioPrezzo::build ($ articolo , $ anagrafica , $ dettagli ['dir ' ]);
807840 $ dettaglio_predefinito ->sconto_percentuale = $ dettagli ['sconto_listino ' ];
808841 $ dettaglio_predefinito ->setPrezzoUnitario ($ dettagli ['prezzo_listino ' ]);
@@ -813,14 +846,25 @@ protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
813846 }
814847
815848 $ dettaglio_predefinito ->save ();
849+ error_log ("Creato nuovo prezzo per articolo {$ articolo ->codice } e anagrafica {$ anagrafica ->ragione_sociale }: {$ dettagli ['prezzo_listino ' ]}" );
816850 }
817851
818852 if (!empty ($ anagrafica ) && $ dettagli ['dir ' ] == 'uscita ' && !empty ($ dettagli ['codice_fornitore ' ]) && !empty ($ dettagli ['descrizione_fornitore ' ])) {
853+ // Elimina i dettagli fornitore esistenti per questo articolo e fornitore
854+ $ deleted_count = DettaglioFornitore::where ('id_articolo ' , $ articolo ->id )
855+ ->where ('id_fornitore ' , $ anagrafica ->id )
856+ ->delete ();
857+
858+ if ($ deleted_count > 0 ) {
859+ error_log ("Eliminati {$ deleted_count } dettagli fornitore esistenti per articolo {$ articolo ->codice } e fornitore {$ anagrafica ->ragione_sociale }" );
860+ }
861+
819862 $ fornitore = DettaglioFornitore::build ($ anagrafica , $ articolo );
820863 $ fornitore ->codice_fornitore = $ dettagli ['codice_fornitore ' ];
821864 $ fornitore ->barcode_fornitore = $ dettagli ['barcode_fornitore ' ];
822865 $ fornitore ->descrizione = $ dettagli ['descrizione_fornitore ' ];
823866 $ fornitore ->save ();
867+ error_log ("Creato nuovo dettaglio fornitore per articolo {$ articolo ->codice } e fornitore {$ anagrafica ->ragione_sociale }: {$ dettagli ['codice_fornitore ' ]}" );
824868 }
825869
826870 $ dettagli ['id_fornitore ' ] = $ anagrafica ->id ;
@@ -942,4 +986,56 @@ protected function processaModello($record, $marca = null)
942986 throw new \Exception ('Errore nella creazione/ricerca modello " ' . $ record ['modello ' ] . '": ' . $ e ->getMessage ());
943987 }
944988 }
989+
990+ /**
991+ * Gestisce l'importazione dei barcode per un articolo.
992+ *
993+ * @param Articolo $articolo
994+ * @param string $barcode_value
995+ *
996+ * @throws \Exception
997+ */
998+ protected function processaBarcode (Articolo $ articolo , $ barcode_value )
999+ {
1000+ if (empty ($ barcode_value )) {
1001+ return ;
1002+ }
1003+
1004+ try {
1005+ $ database = database ();
1006+
1007+ // Supporta barcode multipli separati da virgola
1008+ $ barcodes = array_map ('trim ' , explode (', ' , $ barcode_value ));
1009+
1010+ foreach ($ barcodes as $ barcode ) {
1011+ if (empty ($ barcode )) {
1012+ continue ;
1013+ }
1014+
1015+ // Verifica che il barcode non sia già presente nella tabella mg_articoli (barcode principali)
1016+ $ esistente_articoli = Articolo::where ('barcode ' , $ barcode )->count () > 0 ;
1017+
1018+ // Verifica che il barcode non sia già presente nella tabella mg_articoli_barcode (barcode aggiuntivi)
1019+ $ esistente_barcode = $ database ->table ('mg_articoli_barcode ' )
1020+ ->where ('barcode ' , $ barcode )
1021+ ->count () > 0 ;
1022+
1023+ // Verifica che il barcode non coincida con un codice articolo esistente
1024+ $ coincide_codice = Articolo::where ([
1025+ ['codice ' , $ barcode ],
1026+ ['barcode ' , '= ' , '' ],
1027+ ])->count () > 0 ;
1028+
1029+ // Se il barcode è unico, procede con l'inserimento
1030+ if (!$ esistente_articoli && !$ esistente_barcode && !$ coincide_codice ) {
1031+ Barcode::build ($ articolo ->id , $ barcode );
1032+ error_log ("Barcode aggiunto per articolo {$ articolo ->codice }: {$ barcode }" );
1033+ } else {
1034+ error_log ("Barcode già esistente o in conflitto per articolo {$ articolo ->codice }: {$ barcode }" );
1035+ }
1036+ }
1037+ } catch (\Exception $ e ) {
1038+ throw new \Exception ('Errore durante l \'importazione del barcode " ' .$ barcode_value .'": ' .$ e ->getMessage ());
1039+ }
1040+ }
9451041}
0 commit comments