2017-08-04 16:28:16 +02:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
2017-08-04 16:28:16 +02:00
include_once __DIR__ . '/../../core.php' ;
2023-06-20 11:44:41 +02:00
use Carbon\Carbon ;
2024-03-22 15:52:24 +01:00
use Models\Module ;
2018-12-29 14:41:32 +01:00
use Modules\Anagrafiche\Anagrafica ;
2019-07-23 18:04:01 +02:00
use Modules\Articoli\Articolo as ArticoloOriginale ;
2023-10-06 13:21:37 +02:00
use Modules\Iva\Aliquota ;
2018-12-29 14:41:32 +01:00
use Modules\Ordini\Components\Articolo ;
use Modules\Ordini\Components\Descrizione ;
use Modules\Ordini\Components\Riga ;
2019-04-04 17:12:32 +02:00
use Modules\Ordini\Components\Sconto ;
2018-12-29 14:41:32 +01:00
use Modules\Ordini\Ordine ;
use Modules\Ordini\Tipo ;
2021-05-11 11:50:44 +02:00
use Modules\Preventivi\Preventivo ;
2021-07-28 12:06:29 +02:00
use Plugins\ListinoClienti\DettaglioPrezzo ;
2018-12-29 14:41:32 +01:00
2024-03-05 16:01:45 +01:00
$module = Module :: find ( $id_module );
2017-08-04 16:28:16 +02:00
2024-04-18 17:44:05 +02:00
if ( $module -> getTranslation ( 'title' ) == 'Ordini cliente' ) {
2017-08-04 16:28:16 +02:00
$dir = 'entrata' ;
} else {
$dir = 'uscita' ;
}
switch ( post ( 'op' )) {
case 'add' :
$idanagrafica = post ( 'idanagrafica' );
2018-07-19 15:33:32 +02:00
$data = post ( 'data' );
2022-11-28 09:27:25 +01:00
$id_segment = post ( 'id_segment' );
2017-08-04 16:28:16 +02:00
2018-12-29 14:41:32 +01:00
$anagrafica = Anagrafica :: find ( $idanagrafica );
2019-02-14 17:49:58 +01:00
$tipo = Tipo :: where ( 'dir' , $dir ) -> first ();
2017-08-04 16:28:16 +02:00
2022-11-28 09:27:25 +01:00
$ordine = Ordine :: build ( $anagrafica , $tipo , $data , $id_segment );
2018-12-29 14:41:32 +01:00
$id_record = $ordine -> id ;
2017-08-04 16:28:16 +02:00
2018-12-29 14:41:32 +01:00
flash () -> info ( tr ( 'Aggiunto ordine numero _NUM_!' , [
2019-01-19 10:33:57 +01:00
'_NUM_' => $ordine -> numero ,
2018-12-29 14:41:32 +01:00
]));
2017-08-04 16:28:16 +02:00
break ;
case 'update' :
2024-04-12 16:59:19 +02:00
if ( ! empty ( $id_record )) {
2021-04-06 15:10:55 +02:00
$idstatoordine = post ( 'idstatoordine' );
$idpagamento = post ( 'idpagamento' );
$idsede = post ( 'idsede' );
2018-11-23 12:43:45 +01:00
2021-04-06 15:10:55 +02:00
$totale_imponibile = get_imponibile_ordine ( $id_record );
$totale_ordine = get_totale_ordine ( $id_record );
2018-05-11 15:56:08 +02:00
2021-04-06 15:10:55 +02:00
if ( $dir == 'uscita' ) {
$idrivalsainps = post ( 'id_rivalsa_inps' );
$idritenutaacconto = post ( 'id_ritenuta_acconto' );
$bollo = post ( 'bollo' );
} else {
$idrivalsainps = 0 ;
$idritenutaacconto = 0 ;
$bollo = 0 ;
}
2018-05-11 15:56:08 +02:00
2021-04-06 15:10:55 +02:00
// Leggo la descrizione del pagamento
2024-04-18 17:44:05 +02:00
$query = 'SELECT `title` AS descrizione FROM `co_pagamenti` LEFT JOIN `co_pagamenti_lang` ON (`co_pagamenti_lang`.`id_record` = `co_pagamenti`.`id` AND `co_pagamenti_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `co_pagamenti`.`id`=' . prepare ( $idpagamento );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
2021-04-06 15:10:55 +02:00
$pagamento = $rs [ 0 ][ 'descrizione' ];
$ordine -> idanagrafica = post ( 'idanagrafica' );
$ordine -> idreferente = post ( 'idreferente' );
2021-10-22 12:52:42 +02:00
$ordine -> data = post ( 'data' ) ? : null ;
2021-04-06 15:10:55 +02:00
$ordine -> numero = post ( 'numero' );
$ordine -> numero_esterno = post ( 'numero_esterno' );
$ordine -> note = post ( 'note' );
$ordine -> note_aggiuntive = post ( 'note_aggiuntive' );
$ordine -> idagente = post ( 'idagente' );
$ordine -> idstatoordine = $idstatoordine ;
$ordine -> idpagamento = $idpagamento ;
2024-11-08 16:30:19 +01:00
$ordine -> idspedizione = post ( 'idspedizione' );
$ordine -> idporto = post ( 'idporto' );
$ordine -> idvettore = post ( 'idvettore' );
2021-04-06 15:10:55 +02:00
$ordine -> idsede = $idsede ;
$ordine -> idconto = post ( 'idconto' );
$ordine -> idrivalsainps = $idrivalsainps ;
$ordine -> idritenutaacconto = $idritenutaacconto ;
$ordine -> bollo = 0 ;
$ordine -> rivalsainps = 0 ;
$ordine -> ritenutaacconto = 0 ;
$ordine -> numero_cliente = post ( 'numero_cliente' );
2021-10-22 12:52:42 +02:00
$ordine -> data_cliente = post ( 'data_cliente' ) ? : null ;
2021-04-06 15:10:55 +02:00
$ordine -> id_documento_fe = post ( 'numero_cliente' );
$ordine -> codice_commessa = post ( 'codice_commessa' );
$ordine -> codice_cup = post ( 'codice_cup' );
$ordine -> codice_cig = post ( 'codice_cig' );
$ordine -> num_item = post ( 'num_item' );
2022-10-27 15:08:33 +02:00
$ordine -> condizioni_fornitura = post ( 'condizioni_fornitura' );
2021-04-06 15:10:55 +02:00
2023-06-20 11:44:41 +02:00
// Verifica la presenza di ordini con lo stesso numero
2024-02-08 13:10:46 +01:00
$ordini = $dbo -> fetchArray ( 'SELECT * FROM `or_ordini` WHERE `numero_cliente`=' . prepare ( post ( 'numero_cliente' )) . " AND `numero_cliente` IS NOT NULL AND `numero_cliente` != '' AND `id`!= " . prepare ( $id_record ) . ' AND `idanagrafica`=' . prepare ( post ( 'idanagrafica' )) . " AND DATE_FORMAT(`or_ordini`.`data`, '%Y')= " . prepare ( Carbon :: parse ( post ( 'data' )) -> copy () -> format ( 'Y' )));
2023-06-20 11:44:41 +02:00
2023-08-04 14:54:28 +02:00
if ( ! empty ( $ordini )) {
2023-06-20 11:44:41 +02:00
$documento = '' ;
2023-08-04 14:54:28 +02:00
foreach ( $ordini as $rs ) {
2023-06-20 11:44:41 +02:00
$descrizione = tr ( 'Ordine cliente num. _NUM_ del _DATE_' , [
'_NUM_' => ! empty ( $rs [ 'numero_esterno' ]) ? $rs [ 'numero_esterno' ] : $rs [ 'numero' ],
'_DATE_' => Translator :: dateToLocale ( $rs [ 'data' ]),
]);
2023-08-04 14:54:28 +02:00
2023-06-20 11:44:41 +02:00
$documenti .= '<li>' . Modules :: link ( 'Ordini cliente' , $rs [ 'id' ], $descrizione ) . '</li>' ;
}
flash () -> error ( tr ( 'E\' già presente un ordine con numero _NUM_ <ul>_ORDINI_</ul>' , [
'_NUM_' => post ( 'numero_cliente' ),
'_ORDINI_' => $documenti ,
]));
2023-08-04 14:54:28 +02:00
2023-06-20 11:44:41 +02:00
$ordine -> numero_cliente = null ;
$ordine -> id_documento_fe = null ;
}
2021-04-06 15:10:55 +02:00
$ordine -> setScontoFinale ( post ( 'sconto_finale' ), post ( 'tipo_sconto_finale' ));
2017-08-04 16:28:16 +02:00
2021-04-06 15:10:55 +02:00
$ordine -> save ();
if ( $dbo -> query ( $query )) {
2024-04-18 17:44:05 +02:00
$query = 'SELECT `title` FROM `or_statiordine` LEFT JOIN `or_statiordine_lang` ON (`or_statiordine_lang`.`id_record` = `or_statiordine`.`id` AND `or_statiordine_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `or_statiordine`.`id`=' . prepare ( $idstatoordine );
2021-04-06 15:10:55 +02:00
$rs = $dbo -> fetchArray ( $query );
// Ricalcolo inps, ritenuta e bollo (se l'ordine non è stato evaso)
if ( $dir == 'entrata' ) {
2024-03-01 11:32:13 +01:00
if ( $rs [ 0 ][ 'name' ] != 'Evaso' ) {
2021-04-06 15:10:55 +02:00
ricalcola_costiagg_ordine ( $id_record );
}
} else {
2024-03-01 11:32:13 +01:00
if ( $rs [ 0 ][ 'name' ] != 'Evaso' ) {
2021-04-06 15:10:55 +02:00
ricalcola_costiagg_ordine ( $id_record , $idrivalsainps , $idritenutaacconto , $bollo );
}
2018-05-11 15:56:08 +02:00
}
2021-04-06 15:10:55 +02:00
flash () -> info ( tr ( 'Ordine modificato correttamente!' ));
}
2017-08-04 16:28:16 +02:00
}
2018-05-11 15:56:08 +02:00
2017-08-04 16:28:16 +02:00
break ;
2019-07-23 15:39:00 +02:00
case 'manage_articolo' :
if ( post ( 'idriga' ) != null ) {
$articolo = Articolo :: find ( post ( 'idriga' ));
} else {
$originale = ArticoloOriginale :: find ( post ( 'idarticolo' ));
$articolo = Articolo :: build ( $ordine , $originale );
2020-07-06 13:32:43 +02:00
$articolo -> id_dettaglio_fornitore = post ( 'id_dettaglio_fornitore' ) ? : null ;
2019-07-23 15:39:00 +02:00
}
2024-08-19 09:29:15 +02:00
$articolo -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$articolo -> note = post ( 'note' );
2019-07-23 15:39:00 +02:00
$articolo -> um = post ( 'um' ) ? : null ;
2020-02-14 18:31:07 +01:00
$articolo -> costo_unitario = post ( 'costo_unitario' ) ? : 0 ;
2020-08-06 11:44:41 +02:00
$articolo -> data_evasione = post ( 'data_evasione' ) ? : null ;
2021-04-08 12:18:38 +02:00
$articolo -> ora_evasione = post ( 'ora_evasione' ) ? : null ;
2020-10-06 12:25:22 +02:00
$articolo -> confermato = post ( 'confermato' ) ? : 0 ;
2020-02-17 19:11:40 +01:00
$articolo -> setPrezzoUnitario ( post ( 'prezzo_unitario' ), post ( 'idiva' ));
2020-02-14 18:31:07 +01:00
$articolo -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
2022-05-19 17:42:41 +02:00
if ( $dir == 'entrata' ) {
$articolo -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
}
2019-07-23 15:39:00 +02:00
try {
$articolo -> qta = post ( 'qta' );
2024-05-23 11:36:25 +02:00
} catch ( UnexpectedValueException ) {
2019-07-23 15:39:00 +02:00
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
}
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
$articolo -> save ();
2020-10-16 08:31:10 +02:00
2020-10-14 15:40:47 +02:00
// Impostare data evasione su tutte le righe
2020-10-16 08:31:10 +02:00
if ( post ( 'data_evasione_all' ) == 1 ) {
2021-04-12 15:51:27 +02:00
$righe = $ordine -> getRighe () -> where ( 'is_descrizione' , '=' , '0' );
2020-10-14 15:40:47 +02:00
2020-10-16 08:31:10 +02:00
foreach ( $righe as $riga ) {
2020-10-14 15:40:47 +02:00
$riga -> data_evasione = post ( 'data_evasione' ) ? : null ;
2021-04-08 12:18:38 +02:00
$riga -> ora_evasione = post ( 'ora_evasione' ) ? : null ;
2020-10-14 15:40:47 +02:00
$riga -> save ();
}
}
// Impostare confermato su tutte le righe
2020-10-16 08:31:10 +02:00
if ( post ( 'confermato_all' ) == 1 ) {
2021-04-12 15:51:27 +02:00
$righe = $ordine -> getRighe () -> where ( 'is_descrizione' , '=' , '0' );
2020-10-14 15:40:47 +02:00
2020-10-16 08:31:10 +02:00
foreach ( $righe as $riga ) {
2020-10-14 15:40:47 +02:00
$riga -> confermato = post ( 'confermato' ) ? : 0 ;
$riga -> save ();
}
}
2019-07-23 15:39:00 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Articolo modificato!' ));
} else {
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Articolo aggiunto!' ));
2017-08-04 16:28:16 +02:00
}
2019-03-29 12:46:17 +01:00
2019-07-23 15:39:00 +02:00
// Ricalcolo inps, ritenuta e bollo
2017-08-04 16:28:16 +02:00
ricalcola_costiagg_ordine ( $id_record );
2019-03-29 12:46:17 +01:00
2017-08-04 16:28:16 +02:00
break ;
2019-07-23 15:39:00 +02:00
case 'manage_sconto' :
if ( post ( 'idriga' ) != null ) {
$sconto = Sconto :: find ( post ( 'idriga' ));
} else {
$sconto = Sconto :: build ( $ordine );
}
2018-05-11 15:56:08 +02:00
2019-07-23 15:39:00 +02:00
$sconto -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$sconto -> note = post ( 'note' );
2020-09-29 15:27:00 +02:00
$sconto -> setScontoUnitario ( post ( 'sconto_unitario' ), post ( 'idiva' ));
2023-07-31 10:29:59 +02:00
$sconto -> confermato = ( $dir == 'entrata' ? setting ( 'Conferma automaticamente le quantità negli ordini cliente' ) : setting ( 'Conferma automaticamente le quantità negli ordini fornitore' ));
2019-07-23 15:39:00 +02:00
$sconto -> save ();
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Sconto/maggiorazione modificato!' ));
2018-05-11 15:56:08 +02:00
} else {
2019-07-23 15:39:00 +02:00
flash () -> info ( tr ( 'Sconto/maggiorazione aggiunto!' ));
2018-05-11 15:56:08 +02:00
}
2018-02-09 17:40:58 +01:00
2018-05-11 15:56:08 +02:00
// Ricalcolo inps, ritenuta e bollo
2019-03-29 12:46:17 +01:00
ricalcola_costiagg_ordine ( $id_record );
2018-05-11 15:56:08 +02:00
2018-01-18 19:03:06 +01:00
break ;
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
case 'manage_riga' :
if ( post ( 'idriga' ) != null ) {
$riga = Riga :: find ( post ( 'idriga' ));
} else {
$riga = Riga :: build ( $ordine );
}
$riga -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$riga -> note = post ( 'note' );
2019-07-23 15:39:00 +02:00
$riga -> um = post ( 'um' ) ? : null ;
2020-02-14 18:31:07 +01:00
$riga -> costo_unitario = post ( 'costo_unitario' ) ? : 0 ;
2020-08-06 11:44:41 +02:00
$riga -> data_evasione = post ( 'data_evasione' ) ? : null ;
2021-04-08 12:18:38 +02:00
$riga -> ora_evasione = post ( 'ora_evasione' ) ? : null ;
2020-10-30 16:31:30 +01:00
$riga -> confermato = post ( 'confermato' ) ? : 0 ;
2020-02-17 19:11:40 +01:00
$riga -> setPrezzoUnitario ( post ( 'prezzo_unitario' ), post ( 'idiva' ));
2020-02-14 18:31:07 +01:00
$riga -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
2022-05-19 17:42:41 +02:00
if ( $dir == 'entrata' ) {
$riga -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
}
2019-07-23 15:39:00 +02:00
$riga -> qta = post ( 'qta' );
$riga -> save ();
2021-04-08 12:18:38 +02:00
// Impostare data evasione su tutte le righe
if ( post ( 'data_evasione_all' ) == 1 ) {
$righe = $ordine -> getRighe () -> where ( 'is_descrizione' , '=' , '0' );
foreach ( $righe as $riga ) {
$riga -> data_evasione = post ( 'data_evasione' ) ? : null ;
$riga -> ora_evasione = post ( 'ora_evasione' ) ? : null ;
$riga -> save ();
}
}
// Impostare confermato su tutte le righe
if ( post ( 'confermato_all' ) == 1 ) {
$righe = $ordine -> getRighe () -> where ( 'is_descrizione' , '=' , '0' );
foreach ( $righe as $riga ) {
$riga -> confermato = post ( 'confermato' ) ? : 0 ;
$riga -> save ();
}
}
2019-07-23 15:39:00 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga modificata!' ));
} else {
flash () -> info ( tr ( 'Riga aggiunta!' ));
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_ordine ( $id_record );
break ;
case 'manage_descrizione' :
if ( post ( 'idriga' ) != null ) {
$riga = Descrizione :: find ( post ( 'idriga' ));
} else {
$riga = Descrizione :: build ( $ordine );
}
$riga -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$riga -> note = post ( 'note' );
2019-07-23 15:39:00 +02:00
$riga -> save ();
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga descrittiva modificata!' ));
} else {
flash () -> info ( tr ( 'Riga descrittiva aggiunta!' ));
}
break ;
2024-01-15 15:30:45 +01:00
// Scollegamento riga generica da ordine
2019-10-01 18:32:06 +02:00
case 'delete_riga' :
2023-08-04 14:54:28 +02:00
$id_righe = ( array ) post ( 'righe' );
2022-04-01 09:58:53 +02:00
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
$riga = $riga ? : Descrizione :: find ( $id_riga );
$riga = $riga ? : Sconto :: find ( $id_riga );
2017-08-04 16:28:16 +02:00
2019-10-01 18:32:06 +02:00
try {
$riga -> delete ();
2024-05-23 11:36:25 +02:00
} catch ( InvalidArgumentException ) {
2019-10-01 18:32:06 +02:00
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
2017-08-04 16:28:16 +02:00
}
2022-04-01 09:58:53 +02:00
$riga = null ;
2017-08-04 16:28:16 +02:00
}
2019-04-12 01:11:32 +02:00
2019-10-01 18:32:06 +02:00
ricalcola_costiagg_ordine ( $id_record );
2023-12-01 17:21:34 +01:00
if ( count ( $id_righe ) == 1 ) {
flash () -> info ( tr ( 'Riga eliminata!' ));
} else {
flash () -> info ( tr ( 'Righe eliminate!' ));
}
2022-04-01 09:58:53 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Duplicazione riga
2022-04-01 09:58:53 +02:00
case 'copy_riga' :
2023-08-04 14:54:28 +02:00
$id_righe = ( array ) post ( 'righe' );
2022-04-01 09:58:53 +02:00
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
$riga = $riga ? : Descrizione :: find ( $id_riga );
$riga = $riga ? : Sconto :: find ( $id_riga );
$new_riga = $riga -> replicate ();
$new_riga -> setDocument ( $ordine );
$new_riga -> qta_evasa = 0 ;
$new_riga -> save ();
$riga = null ;
}
flash () -> info ( tr ( 'Righe duplicate!' ));
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Eliminazione ordine
2017-08-04 16:28:16 +02:00
case 'delete' :
2019-10-01 18:32:06 +02:00
try {
$ordine -> delete ();
2017-08-04 16:28:16 +02:00
2019-10-01 18:32:06 +02:00
flash () -> info ( tr ( 'Ordine eliminato!' ));
2024-05-23 11:36:25 +02:00
} catch ( InvalidArgumentException ) {
2019-10-01 18:32:06 +02:00
flash () -> error ( tr ( 'Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!' ));
2017-08-04 16:28:16 +02:00
}
break ;
case 'add_serial' :
2020-08-10 09:54:01 +02:00
$articolo = Articolo :: find ( post ( 'idriga' ));
2017-08-04 16:28:16 +02:00
2018-07-19 15:33:32 +02:00
$serials = ( array ) post ( 'serial' );
2020-08-10 09:54:01 +02:00
$articolo -> serials = $serials ;
2017-09-05 17:31:58 +02:00
2017-08-04 16:28:16 +02:00
break ;
2020-08-06 11:44:41 +02:00
case 'update_position' :
$order = explode ( ',' , post ( 'order' , true ));
2017-08-04 16:28:16 +02:00
2020-08-06 11:44:41 +02:00
foreach ( $order as $i => $id_riga ) {
2021-02-23 11:40:27 +01:00
$dbo -> query ( 'UPDATE `or_righe_ordini` SET `order` = ' . prepare ( $i + 1 ) . ' WHERE id=' . prepare ( $id_riga ));
2020-08-06 11:44:41 +02:00
}
2018-10-30 10:27:44 +01:00
2020-08-06 11:44:41 +02:00
break ;
2018-06-22 17:04:37 +02:00
2024-01-15 15:30:45 +01:00
// Aggiunta di un documento in ordine
2019-02-14 17:49:58 +01:00
case 'add_preventivo' :
2020-07-02 15:27:18 +02:00
case 'add_documento' :
$class = post ( 'class' );
$id_documento = post ( 'id_documento' );
// Individuazione del documento originale
2024-01-15 15:30:45 +01:00
if ( ! is_subclass_of ( $class , Common\Document :: class )) {
2020-07-02 15:27:18 +02:00
return ;
}
$documento = $class :: find ( $id_documento );
2018-06-22 17:04:37 +02:00
2020-07-31 10:30:38 +02:00
// Individuazione sede
$id_sede = ( $documento -> direzione == 'entrata' ) ? $documento -> idsede_destinazione : $documento -> idsede_partenza ;
$id_sede = $id_sede ? : $documento -> idsede ;
$id_sede = $id_sede ? : 0 ;
2020-02-07 17:35:26 +01:00
// Creazione dell' ordine al volo
2019-02-14 17:49:58 +01:00
if ( post ( 'create_document' ) == 'on' ) {
2020-07-06 13:19:20 +02:00
$tipo = Tipo :: where ( 'dir' , $documento -> direzione ) -> first ();
2018-06-11 22:33:36 +02:00
2022-11-28 09:27:25 +01:00
$ordine = Ordine :: build ( $documento -> anagrafica , $tipo , post ( 'data' ), post ( 'id_segment' ));
2020-07-02 15:27:18 +02:00
$ordine -> idpagamento = $documento -> idpagamento ;
2020-07-31 10:30:38 +02:00
$ordine -> idsede = $id_sede ;
2019-07-22 16:13:38 +02:00
2020-07-02 15:27:18 +02:00
$ordine -> id_documento_fe = $documento -> id_documento_fe ;
2021-02-22 14:48:50 +01:00
$ordine -> numero_cliente = $documento -> id_documento_fe ;
2020-07-02 15:27:18 +02:00
$ordine -> codice_cup = $documento -> codice_cup ;
$ordine -> codice_cig = $documento -> codice_cig ;
$ordine -> num_item = $documento -> num_item ;
2021-04-20 17:12:04 +02:00
$ordine -> idreferente = $documento -> idreferente ;
2022-05-19 17:42:41 +02:00
$ordine -> idagente = $documento -> idagente ;
2019-07-22 16:13:38 +02:00
2019-02-14 17:49:58 +01:00
$ordine -> save ();
2018-06-11 22:33:36 +02:00
2019-02-14 17:49:58 +01:00
$id_record = $ordine -> id ;
}
2019-04-12 01:50:20 +02:00
2021-04-06 15:10:55 +02:00
if ( ! empty ( $documento -> sconto_finale )) {
$ordine -> sconto_finale = $documento -> sconto_finale ;
2021-04-12 15:51:27 +02:00
} elseif ( ! empty ( $documento -> sconto_finale_percentuale )) {
2021-04-06 15:10:55 +02:00
$ordine -> sconto_finale_percentuale = $documento -> sconto_finale_percentuale ;
}
$ordine -> save ();
2020-07-02 15:27:18 +02:00
$righe = $documento -> getRighe ();
2019-02-14 17:49:58 +01:00
foreach ( $righe as $riga ) {
2020-02-07 17:35:26 +01:00
if ( post ( 'evadere' )[ $riga -> id ] == 'on' and ! empty ( post ( 'qta_da_evadere' )[ $riga -> id ])) {
2019-02-14 17:49:58 +01:00
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
2018-06-11 22:33:36 +02:00
2019-02-14 17:49:58 +01:00
$copia = $riga -> copiaIn ( $ordine , $qta );
2019-02-26 21:20:05 +01:00
$copia -> save ();
2018-06-11 22:33:36 +02:00
}
}
2018-06-22 17:04:37 +02:00
2020-09-09 11:44:14 +02:00
// Modifica finale dello stato
if ( post ( 'create_document' ) == 'on' ) {
$ordine -> idstatoordine = post ( 'id_stato' );
$ordine -> save ();
}
2019-02-14 17:49:58 +01:00
ricalcola_costiagg_ordine ( $id_record );
2020-07-02 15:27:18 +02:00
// Messaggio informativo
$message = tr ( '_DOC_ aggiunto!' , [
'_DOC_' => $documento -> getReference (),
]);
flash () -> info ( $message );
2019-02-14 17:49:58 +01:00
2020-02-14 12:23:50 +01:00
break ;
2024-01-15 15:30:45 +01:00
// Aggiunta di un ordine fornitore da un ordine cliente
2020-02-14 12:23:50 +01:00
case 'add_ordine_cliente' :
$ordine_cliente = Ordine :: find ( post ( 'id_documento' ));
// Creazione dell' ordine al volo
if ( post ( 'create_document' ) == 'on' ) {
$anagrafica = Anagrafica :: find ( post ( 'idanagrafica' ));
$tipo = Tipo :: where ( 'dir' , $dir ) -> first ();
2022-11-28 09:27:25 +01:00
$ordine = Ordine :: build ( $anagrafica , $tipo , post ( 'data' ), post ( 'id_segment' ));
2020-02-14 12:23:50 +01:00
$ordine -> save ();
$id_record = $ordine -> id ;
}
$righe = $ordine_cliente -> getRighe ();
foreach ( $righe as $riga ) {
if ( post ( 'evadere' )[ $riga -> id ] == 'on' and ! empty ( post ( 'qta_da_evadere' )[ $riga -> id ])) {
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
$copia = $riga -> replicate ();
2020-09-22 20:28:37 +02:00
$copia -> setDocument ( $ordine );
2020-02-14 12:23:50 +01:00
2020-07-06 13:32:43 +02:00
// Ripristino dei valori di default per campi potenzialmente impostati
$copia -> original_id = null ;
$copia -> original_type = null ;
$copia -> qta = $qta ;
$copia -> qta_evasa = 0 ;
$copia -> costo_unitario = 0 ;
2021-07-07 07:57:10 +02:00
2020-07-06 13:32:43 +02:00
// Impostazione al prezzo di acquisto per Articoli
if ( $copia -> isArticolo ()) {
2021-06-11 17:15:05 +02:00
$copia -> setSconto ( 0 , 'PRC' );
2020-07-06 13:32:43 +02:00
$articolo = $copia -> articolo ;
2021-05-28 15:07:10 +02:00
$fornitore = DettaglioPrezzo :: dettagli ( $riga -> idarticolo , $anagrafica -> id , $dir , $qta ) -> first ();
2021-07-07 07:57:10 +02:00
if ( empty ( $fornitore )) {
$fornitore = DettaglioPrezzo :: dettaglioPredefinito ( $riga -> idarticolo , $anagrafica -> id , $dir ) -> first ();
2021-05-28 15:07:10 +02:00
}
2021-07-07 07:57:10 +02:00
$prezzo_unitario = $fornitore -> prezzo_unitario - ( $fornitore -> prezzo_unitario * $fornitore -> percentuale / 100 );
2021-05-28 15:07:10 +02:00
$copia -> setPrezzoUnitario ( $fornitore ? $prezzo_unitario : $articolo -> prezzo_acquisto , $copia -> aliquota -> id );
$copia -> setSconto ( $fornitore -> sconto_percentuale ? : 0 , 'PRC' );
2020-07-06 13:32:43 +02:00
}
2020-02-14 12:23:50 +01:00
$copia -> save ();
}
}
2021-05-11 11:50:44 +02:00
// Modifica finale dello stato
if ( post ( 'create_document' ) == 'on' ) {
$ordine -> idstatoordine = post ( 'id_stato' );
$ordine -> save ();
}
2021-07-07 07:57:10 +02:00
2021-05-11 11:50:44 +02:00
ricalcola_costiagg_ordine ( $id_record );
flash () -> info ( tr ( 'Ordine _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]));
break ;
2024-01-15 15:30:45 +01:00
// Aggiunta di un ordine fornitore da un preventivo
2021-05-11 11:50:44 +02:00
case 'add_ordine_fornitore' :
$preventivo = Preventivo :: find ( post ( 'id_documento' ));
// Creazione dell' ordine al volo
if ( post ( 'create_document' ) == 'on' ) {
$anagrafica = Anagrafica :: find ( post ( 'idanagrafica' ));
$tipo = Tipo :: where ( 'dir' , $dir ) -> first ();
2022-11-28 09:27:25 +01:00
$ordine = Ordine :: build ( $anagrafica , $tipo , post ( 'data' ), post ( 'id_segment' ));
2021-05-11 11:50:44 +02:00
$ordine -> save ();
$id_record = $ordine -> id ;
}
$righe = $preventivo -> getRighe ();
foreach ( $righe as $riga ) {
if ( post ( 'evadere' )[ $riga -> id ] == 'on' and ! empty ( post ( 'qta_da_evadere' )[ $riga -> id ])) {
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
$copia = $riga -> copiaIn ( $ordine , $qta , false );
$copia -> save ();
// Ripristino dei valori di default per campi potenzialmente impostati
$copia -> original_id = null ;
$copia -> original_type = null ;
$copia -> qta = $qta ;
$copia -> qta_evasa = 0 ;
$copia -> costo_unitario = 0 ;
2021-07-02 10:17:09 +02:00
$copia -> data_evasione = null ;
$copia -> ora_evasione = null ;
$copia -> confermato = setting ( 'Conferma automaticamente le quantità negli ordini fornitore' );
2021-05-11 11:50:44 +02:00
// Impostazione al prezzo di acquisto per Articoli
if ( $copia -> isArticolo ()) {
2021-06-11 17:15:05 +02:00
$copia -> setSconto ( 0 , 'PRC' );
2021-05-11 11:50:44 +02:00
$articolo = $copia -> articolo ;
2021-05-28 15:07:10 +02:00
$fornitore = DettaglioPrezzo :: dettagli ( $riga -> idarticolo , $anagrafica -> id , $dir , $qta ) -> first ();
2021-07-07 07:57:10 +02:00
if ( empty ( $fornitore )) {
$fornitore = DettaglioPrezzo :: dettaglioPredefinito ( $riga -> idarticolo , $anagrafica -> id , $dir ) -> first ();
2021-05-28 15:07:10 +02:00
}
2021-07-07 07:57:10 +02:00
$prezzo_unitario = $fornitore -> prezzo_unitario - ( $fornitore -> prezzo_unitario * $fornitore -> percentuale / 100 );
2021-05-28 15:07:10 +02:00
$copia -> setPrezzoUnitario ( $fornitore ? $prezzo_unitario : $articolo -> prezzo_acquisto , $copia -> aliquota -> id );
$copia -> setSconto ( $fornitore -> sconto_percentuale ? : 0 , 'PRC' );
2021-05-11 11:50:44 +02:00
}
$copia -> save ();
}
}
// Modifica finale dello stato
if ( post ( 'create_document' ) == 'on' ) {
$ordine -> idstatoordine = post ( 'id_stato' );
$ordine -> save ();
}
2020-02-14 12:23:50 +01:00
ricalcola_costiagg_ordine ( $id_record );
flash () -> info ( tr ( 'Ordine _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]));
2023-02-17 12:33:45 +01:00
break ;
case 'add_articolo' :
$id_articolo = post ( 'id_articolo' );
$barcode = post ( 'barcode' );
if ( ! empty ( $barcode )) {
2023-08-04 14:54:28 +02:00
$id_articolo = $dbo -> selectOne ( 'mg_articoli' , 'id' , [ 'deleted_at' => null , 'attivo' => 1 , 'barcode' => $barcode ])[ 'id' ];
2024-07-29 16:49:47 +02:00
if ( empty ( $id_articolo )) {
$id_articolo = $dbo -> selectOne ( 'mg_articoli' , 'id' , [ 'deleted_at' => null , 'attivo' => 1 , 'barcode' => '' , 'codice' => $barcode ])[ 'id' ];
}
2023-02-17 12:33:45 +01:00
}
if ( ! empty ( $id_articolo )) {
$permetti_movimenti_sotto_zero = setting ( 'Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita' );
$qta_articolo = $dbo -> selectOne ( 'mg_articoli' , 'qta' , [ 'id' => $id_articolo ])[ 'qta' ];
$originale = ArticoloOriginale :: find ( $id_articolo );
2023-08-04 14:54:28 +02:00
2023-05-05 09:47:43 +02:00
$articolo = Articolo :: build ( $ordine , $originale );
$qta = 1 ;
2023-02-17 12:33:45 +01:00
2023-05-05 09:47:43 +02:00
$articolo -> um = $originale -> um ;
$articolo -> qta = 1 ;
$articolo -> costo_unitario = $originale -> prezzo_acquisto ;
2023-07-31 10:29:59 +02:00
$articolo -> confermato = ( $dir == 'entrata' ? setting ( 'Conferma automaticamente le quantità negli ordini cliente' ) : setting ( 'Conferma automaticamente le quantità negli ordini fornitore' ));
2023-02-17 12:33:45 +01:00
2023-05-05 09:47:43 +02:00
if ( $dir == 'entrata' ) {
2023-10-06 13:21:37 +02:00
// L'aliquota dell'articolo ha precedenza solo se ha aliquota a 0, altrimenti anagrafica -> articolo -> impostazione
if ( $originale -> idiva_vendita ) {
$aliquota_articolo = floatval ( Aliquota :: find ( $originale -> idiva_vendita ) -> percentuale );
}
$id_iva = ( $ordine -> anagrafica -> idiva_vendite && ( ! $originale -> idiva_vendita || $aliquota_articolo != 0 ) ? $ordine -> anagrafica -> idiva_vendite : $originale -> idiva_vendita ) ? : setting ( 'Iva predefinita' );
2023-05-05 09:47:43 +02:00
} else {
2024-04-08 15:44:33 +02:00
$id_iva = ( $ordine -> anagrafica -> idiva_acquisti ? : ( $originale -> idiva_vendita ? : setting ( 'Iva predefinita' )));
2023-05-05 09:47:43 +02:00
}
$id_anagrafica = $ordine -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
2023-08-04 14:54:28 +02:00
2023-05-05 09:47:43 +02:00
// CALCOLO PREZZO UNITARIO
2023-12-29 16:15:38 +01:00
$prezzo_consigliato = getPrezzoConsigliato ( $id_anagrafica , $dir , $id_articolo );
2024-09-20 16:32:21 +02:00
if ( ! $prezzo_consigliato [ 'prezzo_unitario' ]) {
$prezzo_consigliato = getPrezzoConsigliato ( setting ( 'Azienda predefinita' ), $dir , $id_articolo );
}
2023-12-29 16:15:38 +01:00
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-05-11 13:07:57 +02:00
2023-05-05 09:47:43 +02:00
if ( $dir == 'entrata' ) {
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $originale -> prezzo_vendita_ivato : $originale -> prezzo_vendita );
} else {
$prezzo_unitario = $prezzo_unitario ? : $originale -> prezzo_acquisto ;
}
$provvigione = $dbo -> selectOne ( 'an_anagrafiche' , 'provvigione_default' , [ 'idanagrafica' => $ordine -> idagente ])[ 'provvigione_default' ];
2023-07-31 17:26:06 +02:00
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$join = ( $dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti' );
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.' . $join . '=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
}
2023-08-04 14:54:28 +02:00
2023-05-05 09:47:43 +02:00
$articolo -> setPrezzoUnitario ( $prezzo_unitario , $id_iva );
$articolo -> setSconto ( $sconto , 'PRC' );
$articolo -> setProvvigione ( $provvigione ? : 0 , 'PRC' );
$articolo -> save ();
flash () -> info ( tr ( 'Nuovo articolo aggiunto!' ));
2023-02-17 12:33:45 +01:00
} else {
$response [ 'error' ] = tr ( 'Nessun articolo corrispondente a magazzino' );
echo json_encode ( $response );
}
break ;
case 'update_inline' :
$id_riga = post ( 'riga_id' );
$riga = $riga ? : Riga :: find ( $id_riga );
$riga = $riga ? : Articolo :: find ( $id_riga );
2023-10-06 12:45:32 +02:00
$riga = $riga ? : Sconto :: find ( $id_riga );
2023-02-17 12:33:45 +01:00
if ( ! empty ( $riga )) {
2023-10-06 12:45:32 +02:00
if ( $riga -> isSconto ()) {
$riga -> setScontoUnitario ( post ( 'sconto' ), $riga -> idiva );
} else {
$riga -> qta = post ( 'qta' );
$riga -> setPrezzoUnitario ( post ( 'prezzo' ), $riga -> idiva );
$riga -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
$riga -> costo_unitario = post ( 'costo' ) ? : 0 ;
}
2023-02-17 12:33:45 +01:00
$riga -> save ();
2023-09-29 15:34:02 +02:00
flash () -> info ( tr ( 'Riga aggiornata!' ));
2023-02-17 12:33:45 +01:00
}
2023-04-27 14:35:02 +02:00
break ;
case 'edit-price' :
2023-09-25 16:53:28 +02:00
$righe = ( array ) post ( 'righe' );
2023-05-04 09:57:01 +02:00
$numero_totale = 0 ;
2023-08-04 14:54:28 +02:00
2023-04-27 14:35:02 +02:00
foreach ( $righe as $riga ) {
2024-01-15 15:30:45 +01:00
if ( $riga [ 'id' ] != null ) {
2023-04-28 14:44:35 +02:00
$articolo = Articolo :: find ( $riga [ 'id' ]);
}
2023-08-04 14:54:28 +02:00
2023-09-25 16:53:28 +02:00
if ( $articolo -> prezzo_unitario != $riga [ 'price' ]) {
2023-05-04 09:57:01 +02:00
$articolo -> setPrezzoUnitario ( $riga [ 'price' ], $articolo -> idiva );
$articolo -> save ();
++ $numero_totale ;
}
}
if ( $numero_totale > 1 ) {
flash () -> info ( tr ( '_NUM_ prezzi modificati!' , [
'_NUM_' => $numero_totale ,
]));
2023-08-04 14:54:28 +02:00
} elseif ( $numero_totale == 1 ) {
2023-05-04 09:57:01 +02:00
flash () -> info ( tr ( '_NUM_ prezzo modificato!' , [
'_NUM_' => $numero_totale ,
]));
} else {
flash () -> warning ( tr ( 'Nessun prezzo modificato!' ));
2023-04-28 14:44:35 +02:00
}
2023-05-04 09:07:34 +02:00
2023-06-06 10:18:51 +02:00
break ;
2023-09-25 16:53:28 +02:00
case 'update-price' :
$id_anagrafica = $ordine -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$numero_totale = 0 ;
$id_righe = ( array ) post ( 'righe' );
2023-06-06 10:18:51 +02:00
2023-09-25 16:53:28 +02:00
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
2023-06-06 10:18:51 +02:00
2023-09-25 16:53:28 +02:00
// CALCOLO PREZZO UNITARIO
$prezzo_unitario = 0 ;
$sconto = 0 ;
if ( $riga -> isArticolo ()) {
2023-12-29 16:15:38 +01:00
$id_articolo = $riga -> idarticolo ;
$prezzo_consigliato = getPrezzoConsigliato ( $id_anagrafica , $dir , $id_articolo );
2024-09-20 16:32:21 +02:00
if ( ! $prezzo_consigliato [ 'prezzo_unitario' ]) {
$prezzo_consigliato = getPrezzoConsigliato ( setting ( 'Azienda predefinita' ), $dir , $id_articolo );
}
2023-12-29 16:15:38 +01:00
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-09-25 16:53:28 +02:00
if ( $dir == 'entrata' ) {
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $riga -> articolo -> prezzo_vendita_ivato : $riga -> articolo -> prezzo_vendita );
$riga -> costo_unitario = $riga -> articolo -> prezzo_acquisto ;
} else {
$prezzo_unitario = $prezzo_unitario ? : $riga -> articolo -> prezzo_acquisto ;
}
$riga -> setPrezzoUnitario ( $prezzo_unitario , $riga -> idiva );
2023-06-06 10:18:51 +02:00
}
2023-09-25 16:53:28 +02:00
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$join = ( $dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti' );
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.' . $join . '=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
2023-06-06 10:18:51 +02:00
}
2023-09-25 16:53:28 +02:00
$riga -> setSconto ( $sconto , 'PRC' );
$riga -> save ();
++ $numero_totale ;
2023-06-06 10:18:51 +02:00
}
2023-09-25 16:53:28 +02:00
if ( $numero_totale > 1 ) {
flash () -> info ( tr ( '_NUM_ prezzi modificati!' , [
'_NUM_' => $numero_totale ,
]));
} elseif ( $numero_totale == 1 ) {
flash () -> info ( tr ( '_NUM_ prezzo modificato!' , [
'_NUM_' => $numero_totale ,
]));
} else {
flash () -> warning ( tr ( 'Nessun prezzo modificato!' ));
}
2023-06-06 10:18:51 +02:00
2023-11-08 17:23:13 +01:00
break ;
2023-11-09 14:56:03 +01:00
2024-01-15 15:30:45 +01:00
// Duplica ordine
2023-11-08 17:23:13 +01:00
case 'copy' :
$new = $ordine -> replicate ();
$new -> numero = Ordine :: getNextNumero ( post ( 'data' ), $ordine -> tipo -> dir , $ordine -> id_segment );
$new -> numero_esterno = Ordine :: getNextNumeroSecondario ( post ( 'data' ), $ordine -> tipo -> dir , $ordine -> id_segment );
$new -> idstatoordine = post ( 'idstatoordine' );
$new -> data = post ( 'data' );
$new -> save ();
$id_record = $new -> id ;
if ( ! empty ( post ( 'copia_righe' ))) {
$righe = $ordine -> getRighe ();
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
$new_riga -> setDocument ( $new );
$new_riga -> qta_evasa = 0 ;
$new_riga -> save ();
}
}
2024-01-15 15:30:45 +01:00
// copia allegati
2023-11-08 17:23:13 +01:00
if ( ! empty ( post ( 'copia_allegati' ))) {
$allegati = $ordine -> uploads ();
foreach ( $allegati as $allegato ) {
$allegato -> copia ([
'id_module' => $new -> getModule () -> id ,
'id_record' => $new -> id ,
]);
}
}
flash () -> info ( tr ( 'Aggiunto ordine numero _NUM_!' , [
'_NUM_' => $new -> numero ,
]));
2018-06-22 17:04:37 +02:00
break ;
2023-09-27 17:04:00 +02:00
}