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' ;
2021-01-14 11:03:09 +01:00
use Carbon\Carbon ;
2024-03-22 15:52:24 +01:00
use Models\Plugin ;
2019-01-19 10:33:57 +01:00
use Modules\Anagrafiche\Anagrafica ;
2019-05-04 06:19:08 +02:00
use Modules\Articoli\Articolo as ArticoloOriginale ;
2019-01-19 10:33:57 +01:00
use Modules\Contratti\Components\Articolo ;
2019-05-04 06:19:08 +02:00
use Modules\Contratti\Components\Descrizione ;
2019-01-19 10:33:57 +01:00
use Modules\Contratti\Components\Riga ;
2019-04-04 17:12:32 +02:00
use Modules\Contratti\Components\Sconto ;
2019-01-19 10:33:57 +01:00
use Modules\Contratti\Contratto ;
2021-09-21 09:49:05 +02:00
use Modules\Contratti\Stato ;
2023-10-06 13:21:37 +02:00
use Modules\Iva\Aliquota ;
2020-03-04 18:44:07 +01:00
use Plugins\PianificazioneInterventi\Promemoria ;
2019-01-19 10:33:57 +01:00
2017-08-04 16:28:16 +02:00
switch ( post ( 'op' )) {
case 'add' :
$idanagrafica = post ( 'idanagrafica' );
2019-01-19 10:33:57 +01:00
$anagrafica = Anagrafica :: find ( $idanagrafica );
2022-11-28 09:27:25 +01:00
$id_segment = post ( 'id_segment' );
2017-08-04 16:28:16 +02:00
2021-09-01 10:52:22 +02:00
// Generazione Contratto
2022-11-28 09:27:25 +01:00
$contratto = Contratto :: build ( $anagrafica , post ( 'nome' ), $id_segment );
2021-09-01 10:52:22 +02:00
// Salvataggio informazioni sul rinnovo
2022-02-16 17:47:19 +01:00
$contratto -> idstato = post ( 'idstato' );
$contratto -> validita = post ( 'validita' );
$contratto -> tipo_validita = post ( 'tipo_validita' );
$contratto -> data_accettazione = post ( 'data_accettazione' ) ? : null ;
$contratto -> data_conclusione = post ( 'data_conclusione' ) ? : null ;
2021-09-01 10:52:22 +02:00
$contratto -> rinnovabile = post ( 'rinnovabile' );
$contratto -> rinnovo_automatico = post ( 'rinnovo_automatico' );
$contratto -> giorni_preavviso_rinnovo = post ( 'giorni_preavviso_rinnovo' );
$contratto -> ore_preavviso_rinnovo = post ( 'ore_preavviso_rinnovo' );
$contratto -> save ();
2019-01-19 10:33:57 +01:00
$id_record = $contratto -> id ;
2017-08-04 16:28:16 +02:00
2022-02-16 17:47:19 +01:00
if ( isAjaxRequest ()) {
echo json_encode ([ 'id' => $id_record , 'text' => 'Contratto ' . $contratto -> numero . ' del ' . dateFormat ( $contratto -> data_bozza ) . ' - ' . $contratto -> nome ]);
}
2019-01-19 10:33:57 +01:00
flash () -> info ( tr ( 'Aggiunto contratto numero _NUM_!' , [
'_NUM_' => $contratto [ 'numero' ],
]));
2017-08-04 16:28:16 +02:00
break ;
case 'update' :
2018-07-19 15:33:32 +02:00
if ( post ( 'id_record' ) !== null ) {
2017-08-04 16:28:16 +02:00
// Se non specifico un budget me lo vado a ricalcolare
if ( $budget != '' ) {
$budget = post ( 'budget' );
} else {
2018-06-29 17:30:41 +02:00
$q = " SELECT (SELECT SUM(subtotale) FROM co_righe_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id) AS 'budget' FROM co_contratti WHERE id= " . prepare ( $id_record );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $q );
$budget = $rs [ 0 ][ 'budget' ];
}
2019-07-08 12:24:59 +02:00
$contratto -> idanagrafica = post ( 'idanagrafica' );
$contratto -> idsede = post ( 'idsede' );
$contratto -> idstato = post ( 'idstato' );
$contratto -> nome = post ( 'nome' );
$contratto -> idagente = post ( 'idagente' );
$contratto -> idpagamento = post ( 'idpagamento' );
$contratto -> numero = post ( 'numero' );
$contratto -> budget = $budget ;
$contratto -> idreferente = post ( 'idreferente' );
2021-12-21 10:58:20 +01:00
$contratto -> condizioni_fornitura = post ( 'condizioni_fornitura' );
2021-12-13 10:45:11 +01:00
$contratto -> informazioniaggiuntive = post ( 'informazioniaggiuntive' );
2020-07-07 17:32:03 +02:00
// Informazioni sulle date del documento
2021-04-02 09:58:11 +02:00
$contratto -> data_bozza = post ( 'data_bozza' ) ? : null ;
$contratto -> data_rifiuto = post ( 'data_rifiuto' ) ? : null ;
2020-07-07 17:32:03 +02:00
// Dati relativi alla validità del documento
$contratto -> validita = post ( 'validita' );
$contratto -> tipo_validita = post ( 'tipo_validita' );
2021-04-02 09:58:11 +02:00
$contratto -> data_accettazione = post ( 'data_accettazione' ) ? : null ;
$contratto -> data_conclusione = post ( 'data_conclusione' ) ? : null ;
2020-07-07 17:32:03 +02:00
2019-07-08 12:24:59 +02:00
$contratto -> esclusioni = post ( 'esclusioni' );
$contratto -> descrizione = post ( 'descrizione' );
$contratto -> id_documento_fe = post ( 'id_documento_fe' );
$contratto -> num_item = post ( 'num_item' );
$contratto -> codice_cig = post ( 'codice_cig' );
2019-07-08 12:25:51 +02:00
$contratto -> codice_cup = post ( 'codice_cup' );
2019-07-08 12:24:59 +02:00
2021-04-06 15:10:55 +02:00
$contratto -> setScontoFinale ( post ( 'sconto_finale' ), post ( 'tipo_sconto_finale' ));
2019-07-08 12:24:59 +02:00
$contratto -> save ();
2017-08-04 16:28:16 +02:00
2017-09-11 11:28:39 +02:00
$dbo -> query ( 'DELETE FROM my_impianti_contratti WHERE idcontratto=' . prepare ( $id_record ));
2024-04-11 12:21:13 +02:00
$matricola = post ( 'matricolaimpianto' );
if ( $matricola ) {
2024-04-12 09:53:02 +02:00
foreach ([ $matricola ] as $matricolaimpianto ) {
2024-04-11 12:21:13 +02:00
$dbo -> query ( 'INSERT INTO my_impianti_contratti(idcontratto,idimpianto) VALUES(' . prepare ( $id_record ) . ', ' . prepare ( $matricolaimpianto ) . ')' );
}
2017-08-04 16:28:16 +02:00
}
// Salvataggio costi attività unitari del contratto
2019-05-04 06:19:08 +02:00
foreach ( post ( 'costo_ore' ) as $id_tipo => $valore ) {
2019-09-09 10:47:25 +02:00
$dbo -> update ( 'co_contratti_tipiintervento' , [
'costo_ore' => post ( 'costo_ore' )[ $id_tipo ],
'costo_km' => post ( 'costo_km' )[ $id_tipo ],
'costo_dirittochiamata' => post ( 'costo_dirittochiamata' )[ $id_tipo ],
], [
'idcontratto' => $id_record ,
'idtipointervento' => $id_tipo ,
]);
2017-08-04 16:28:16 +02:00
}
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Contratto modificato correttamente!' ));
2017-08-04 16:28:16 +02:00
}
break ;
2019-04-12 01:11:32 +02:00
2021-02-18 09:57:35 +01:00
case 'update_rinnovo' :
$contratto -> rinnovabile = post ( 'rinnovabile' );
$contratto -> rinnovo_automatico = post ( 'rinnovo_automatico' );
$contratto -> giorni_preavviso_rinnovo = post ( 'giorni_preavviso_rinnovo' );
$contratto -> ore_preavviso_rinnovo = post ( 'ore_preavviso_rinnovo' );
$contratto -> save ();
flash () -> info ( tr ( 'Contratto modificato correttamente!' ));
break ;
2024-01-15 15:30:45 +01:00
// Duplica contratto
2019-04-08 18:50:28 +02:00
case 'copy' :
2023-07-28 12:27:48 +02:00
$new = $contratto -> replicate ([ 'idcontratto_prev' ]);
2022-11-28 09:27:25 +01:00
$new -> numero = Contratto :: getNextNumero ( $contratto -> data_bozza , $contratto -> id_segment );
2021-09-21 09:49:05 +02:00
2024-04-18 17:44:05 +02:00
$stato = ( new Stato ()) -> getByField ( 'title' , 'Bozza' , Models\Locale :: getPredefined () -> id );
2021-09-21 09:49:05 +02:00
$new -> stato () -> associate ( $stato );
2019-04-19 20:52:02 +02:00
$new -> save ();
$id_record = $new -> id ;
2019-06-27 16:09:41 +02:00
$righe = $contratto -> getRighe ();
2019-04-19 20:52:02 +02:00
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
2020-09-22 20:28:37 +02:00
$new_riga -> setDocument ( $new );
2019-04-19 20:52:02 +02:00
$new_riga -> qta_evasa = 0 ;
$new_riga -> save ();
}
2019-04-08 18:50:28 +02:00
2019-04-12 01:11:32 +02:00
flash () -> info ( tr ( 'Contratto duplicato correttamente!' ));
2019-04-08 18:50:28 +02:00
2019-04-12 01:11:32 +02:00
break ;
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
case 'manage_articolo' :
if ( post ( 'idriga' ) != null ) {
$articolo = Articolo :: find ( post ( 'idriga' ));
} else {
$originale = ArticoloOriginale :: find ( post ( 'idarticolo' ));
$articolo = Articolo :: build ( $contratto , $originale );
2020-07-06 13:32:43 +02:00
$articolo -> id_dettaglio_fornitore = post ( 'id_dettaglio_fornitore' ) ? : null ;
2019-05-04 06:19:08 +02:00
}
$qta = post ( 'qta' );
2024-04-18 17:44:05 +02:00
$articolo -> setTranslation ( 'title' , post ( 'descrizione' ));
2022-07-20 17:41:14 +02:00
$articolo -> note = post ( 'note' );
2019-05-04 06:19:08 +02:00
$articolo -> um = post ( 'um' ) ? : null ;
2020-02-14 18:31:07 +01:00
$articolo -> costo_unitario = post ( 'costo_unitario' ) ? : 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
$articolo -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
2019-05-04 06:19:08 +02:00
try {
$articolo -> qta = $qta ;
2024-05-23 11:36:25 +02:00
} catch ( UnexpectedValueException ) {
2019-05-04 06:19:08 +02:00
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
}
$articolo -> save ();
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Articolo modificato!' ));
} else {
flash () -> info ( tr ( 'Articolo aggiunto!' ));
}
break ;
2019-03-29 12:46:17 +01:00
case 'manage_sconto' :
if ( post ( 'idriga' ) != null ) {
2019-04-04 17:12:32 +02:00
$sconto = Sconto :: find ( post ( 'idriga' ));
2019-03-29 12:46:17 +01:00
} else {
2019-04-04 17:12:32 +02:00
$sconto = Sconto :: build ( $contratto );
2019-03-29 12:46:17 +01: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' ));
2019-03-29 12:46:17 +01:00
$sconto -> save ();
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Sconto/maggiorazione modificato!' ));
} else {
2019-07-11 17:20:58 +02:00
flash () -> info ( tr ( 'Sconto/maggiorazione aggiunto!' ));
2019-03-29 12:46:17 +01:00
}
break ;
2019-05-04 06:19:08 +02:00
case 'manage_riga' :
if ( post ( 'idriga' ) != null ) {
$riga = Riga :: find ( post ( 'idriga' ));
} else {
$riga = Riga :: build ( $contratto );
}
2017-08-04 16:28:16 +02:00
2018-07-19 15:33:32 +02:00
$qta = post ( 'qta' );
2017-09-11 11:28:39 +02:00
2019-05-04 06:19:08 +02:00
$riga -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$riga -> note = post ( 'note' );
2019-05-04 06:19:08 +02:00
$riga -> um = post ( 'um' ) ? : null ;
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
$riga -> id_iva = post ( 'idiva' );
2017-08-04 16:28:16 +02:00
2020-02-14 18:31:07 +01:00
$riga -> costo_unitario = post ( 'costo_unitario' ) ? : 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
$riga -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
$riga -> qta = $qta ;
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
$riga -> save ();
2018-02-19 10:52:42 +01:00
2019-05-04 06:19:08 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga modificata!' ));
2018-02-19 17:48:04 +01:00
} else {
2019-05-04 06:19:08 +02:00
flash () -> info ( tr ( 'Riga aggiunta!' ));
2018-01-18 19:03:06 +01:00
}
2018-02-19 10:52:42 +01:00
2018-01-18 19:03:06 +01:00
break ;
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
case 'manage_descrizione' :
if ( post ( 'idriga' ) != null ) {
$riga = Descrizione :: find ( post ( 'idriga' ));
} else {
$riga = Descrizione :: build ( $contratto );
}
2018-02-04 09:41:46 +01:00
2019-05-04 06:19:08 +02:00
$riga -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$riga -> note = post ( 'note' );
2019-05-04 06:19:08 +02:00
$riga -> save ();
2017-08-04 16:28:16 +02:00
2019-05-04 06:19:08 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga descrittiva modificata!' ));
2018-02-04 09:41:46 +01:00
} else {
2019-05-04 06:19:08 +02:00
flash () -> info ( tr ( 'Riga descrittiva aggiunta!' ));
2018-01-18 19:03:06 +01:00
}
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Eliminazione riga
2019-05-04 06:19:08 +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 );
2019-05-04 06:19:08 +02:00
$riga -> delete ();
2017-08-04 16:28:16 +02:00
2022-04-01 09:58:53 +02:00
$riga = null ;
}
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 ( $contratto );
$new_riga -> qta_evasa = 0 ;
$new_riga -> save ();
$riga = null ;
2017-08-04 16:28:16 +02:00
}
2022-04-01 09:58:53 +02:00
flash () -> info ( tr ( 'Righe duplicate!' ));
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Scollegamento intervento da contratto
2017-08-04 16:28:16 +02:00
case 'unlink' :
2024-04-12 09:12:45 +02:00
if ( ! empty ( get ( 'idcontratto' )) && ! empty ( get ( 'idintervento' ))) {
2018-07-19 15:33:32 +02:00
$idcontratto = get ( 'idcontratto' );
$idintervento = get ( 'idintervento' );
2017-08-04 16:28:16 +02:00
2018-08-31 11:39:38 +02:00
$query = 'DELETE FROM `co_promemoria` WHERE idcontratto=' . prepare ( $idcontratto ) . ' AND idintervento=' . prepare ( $idintervento );
2017-08-04 16:28:16 +02:00
$dbo -> query ( $query );
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Intervento _NUM_ rimosso!' , [
2017-09-10 14:35:41 +02:00
'_NUM_' => $idintervento ,
2018-07-07 13:56:22 +02:00
]));
2017-08-04 16:28:16 +02:00
}
break ;
2019-05-04 06:19:08 +02:00
case 'update_position' :
2020-08-06 11:34:32 +02:00
$order = explode ( ',' , post ( 'order' , true ));
2017-09-11 13:08:50 +02:00
2020-08-06 11:34:32 +02:00
foreach ( $order as $i => $id_riga ) {
2021-02-23 11:40:27 +01:00
$dbo -> query ( 'UPDATE `co_righe_contratti` SET `order` = ' . prepare ( $i + 1 ) . ' WHERE id=' . prepare ( $id_riga ));
2019-05-04 06:19:08 +02:00
}
2018-10-30 10:27:44 +01:00
2019-05-04 06:19:08 +02:00
break ;
2017-09-11 13:08:50 +02:00
2024-01-15 15:30:45 +01:00
// eliminazione contratto
2017-08-04 16:28:16 +02:00
case 'delete' :
2019-11-14 18:37:42 +01:00
// Fatture o interventi collegati a questo contratto
2024-02-26 15:53:39 +01:00
$elementi = $dbo -> fetchArray ( ' SELECT
0 AS `codice` ,
`co_documenti` . `id` AS `id` ,
`co_documenti` . `numero` AS `numero` ,
`co_documenti` . `numero_esterno` AS `numero_esterno` ,
`co_documenti` . `data` ,
2024-04-18 17:44:05 +02:00
`co_tipidocumento_lang` . `title` AS `tipo_documento` ,
2024-02-26 15:53:39 +01:00
`co_tipidocumento` . `dir` AS `dir`
FROM
`co_documenti`
INNER JOIN `co_tipidocumento` ON `co_tipidocumento` . `id` = `co_documenti` . `idtipodocumento`
2024-04-02 12:32:38 +02:00
LEFT JOIN `co_tipidocumento_lang` ON ( `co_tipidocumento_lang` . `id_record` = `co_tipidocumento` . `id` AND `co_tipidocumento_lang` . `id_lang` = '.prepare(Models\Locale::getDefault()->id).' )
2024-02-26 15:53:39 +01:00
INNER JOIN co_righe_documenti ON `co_righe_documenti` . `iddocumento` = `co_documenti` . `id`
WHERE
2024-04-02 16:12:14 +02:00
`co_righe_documenti` . `idcontratto` = '.prepare($id_record).'
2019-11-14 18:37:42 +01:00
UNION
2024-02-26 15:53:39 +01:00
SELECT
`in_interventi` . `codice` AS `codice` ,
`in_interventi` . `id` AS `id` ,
0 AS `numero` ,
0 AS `numero_esterno` ,
`in_interventi` . `data_richiesta` AS `data` ,
0 AS `tipo_documento` ,
0 AS `dir`
FROM
`in_interventi`
WHERE
`in_interventi` . `id_contratto` = '.prepare($id_record).'
ORDER BY
`data` ' );
2019-11-14 18:37:42 +01:00
if ( empty ( $elementi )) {
try {
$contratto -> delete ();
$dbo -> query ( 'DELETE FROM co_promemoria WHERE idcontratto=' . prepare ( $id_record ));
$dbo -> query ( 'DELETE FROM co_contratti_tipiintervento WHERE idcontratto=' . prepare ( $id_record ));
$dbo -> query ( 'DELETE FROM my_impianti_contratti WHERE idcontratto=' . prepare ( $id_record ));
flash () -> info ( tr ( 'Contratto eliminato!' ));
2024-05-23 11:36:25 +02:00
} catch ( InvalidArgumentException ) {
2019-11-14 18:37:42 +01:00
flash () -> error ( tr ( 'Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!' ));
}
2019-10-01 18:32:06 +02:00
}
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Rinnovo contratto
2017-08-04 16:28:16 +02:00
case 'renew' :
2019-11-29 16:02:32 +01:00
$diff = $contratto -> data_conclusione -> diffAsCarbonInterval ( $contratto -> data_accettazione );
2017-08-04 16:28:16 +02:00
2019-11-12 16:48:06 +01:00
$new_contratto = $contratto -> replicate ();
2021-09-21 09:49:05 +02:00
2019-11-12 16:48:06 +01:00
$new_contratto -> idcontratto_prev = $contratto -> id ;
2019-11-29 16:02:32 +01:00
$new_contratto -> data_accettazione = $contratto -> data_conclusione -> copy () -> addDays ( 1 );
$new_contratto -> data_conclusione = $new_contratto -> data_accettazione -> copy () -> add ( $diff );
2021-01-14 11:03:09 +01:00
$new_contratto -> data_bozza = Carbon :: now ();
2022-11-28 09:27:25 +01:00
$new_contratto -> numero = Contratto :: getNextNumero ( $new_contratto -> data_bozza , $new_contratto -> id_segment );
2021-09-21 09:49:05 +02:00
2024-04-18 17:44:05 +02:00
$stato = ( new Stato ()) -> getByField ( 'title' , 'Bozza' , Models\Locale :: getPredefined () -> id );
2021-09-21 09:49:05 +02:00
$new_contratto -> stato () -> associate ( $stato );
2019-11-12 16:48:06 +01:00
$new_contratto -> save ();
$new_idcontratto = $new_contratto -> id ;
// Correzioni dei prezzi per gli interventi
$dbo -> query ( 'DELETE FROM co_contratti_tipiintervento WHERE idcontratto=' . prepare ( $new_idcontratto ));
$dbo -> query ( 'INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) SELECT ' . prepare ( $new_idcontratto ) . ', idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico FROM co_contratti_tipiintervento AS z WHERE idcontratto=' . prepare ( $id_record ));
$new_contratto -> save ();
// Replico le righe del contratto
$righe = $contratto -> getRighe ();
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
$new_riga -> qta_evasa = 0 ;
$new_riga -> idcontratto = $new_contratto -> id ;
$new_riga -> save ();
2017-08-04 16:28:16 +02:00
}
2019-11-12 16:48:06 +01:00
// Replicazione degli impianti
$impianti = $dbo -> fetchArray ( 'SELECT idimpianto FROM my_impianti_contratti WHERE idcontratto=' . prepare ( $id_record ));
$dbo -> sync ( 'my_impianti_contratti' , [ 'idcontratto' => $new_idcontratto ], [ 'idimpianto' => array_column ( $impianti , 'idimpianto' )]);
// Replicazione dei promemoria
$promemoria = $dbo -> fetchArray ( 'SELECT * FROM co_promemoria WHERE idcontratto=' . prepare ( $id_record ));
2019-11-29 16:02:32 +01:00
$giorni = $contratto -> data_conclusione -> diffInDays ( $contratto -> data_accettazione );
2019-11-12 16:48:06 +01:00
foreach ( $promemoria as $p ) {
$dbo -> insert ( 'co_promemoria' , [
'idcontratto' => $new_idcontratto ,
'data_richiesta' => date ( 'Y-m-d' , strtotime ( $p [ 'data_richiesta' ] . ' +' . $giorni . ' day' )),
'idtipointervento' => $p [ 'idtipointervento' ],
'richiesta' => $p [ 'richiesta' ],
'idimpianti' => $p [ 'idimpianti' ],
]);
$id_promemoria = $dbo -> lastInsertedID ();
2020-03-04 18:44:07 +01:00
$promemoria = Promemoria :: find ( $p [ 'id' ]);
$righe = $promemoria -> getRighe ();
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
$new_riga -> id_promemoria = $id_promemoria ;
$new_riga -> save ();
}
2019-11-12 16:48:06 +01:00
// Copia degli allegati
2021-03-08 11:20:04 +01:00
$allegati = $promemoria -> uploads ();
foreach ( $allegati as $allegato ) {
$allegato -> copia ([
'id_module' => $id_module ,
2024-04-18 17:44:05 +02:00
'id_plugin' => ( new Plugin ()) -> getByField ( 'title' , 'Pianificazione interventi' , Models\Locale :: getPredefined () -> id ),
2021-03-08 11:20:04 +01:00
'id_record' => $id_promemoria ,
]);
}
2019-11-12 16:48:06 +01:00
}
// Cambio stato precedente contratto in concluso (non più pianificabile)
2024-04-18 17:44:05 +02:00
$dbo -> query ( 'UPDATE `co_contratti` SET `rinnovabile`= 0, `idstato`= (SELECT `co_staticontratti`.`id` FROM `co_staticontratti` LEFT JOIN `co_staticontratti_lang` ON (`co_staticontratti`.`id`=`co_staticontratti_lang`.`id_record` AND `co_staticontratti_lang`.`id_lang`= ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `title` = \'Concluso\') WHERE `co_staticontratti`.`id` = ' . prepare ( $id_record ));
2019-11-12 16:48:06 +01:00
flash () -> info ( tr ( 'Contratto rinnovato!' ));
$id_record = $new_idcontratto ;
2019-06-14 15:39:40 +02:00
break ;
2021-09-20 17:49:30 +02:00
case 'import' :
2019-06-14 15:39:40 +02:00
$rs = $dbo -> fetchArray ( 'SELECT * FROM co_contratti_tipiintervento WHERE idcontratto = ' . prepare ( post ( 'idcontratto' )) . ' AND idtipointervento=' . prepare ( post ( 'idtipointervento' )));
2019-06-29 11:01:26 +02:00
2019-06-14 15:39:40 +02:00
// Se la riga in_tipiintervento esiste, la aggiorno...
if ( ! empty ( $rs )) {
2024-02-28 16:28:53 +01:00
$result = $dbo -> query ( 'UPDATE `co_contratti_tipiintervento` SET '
. ' `costo_ore`=(SELECT `costo_orario` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), '
. ' `costo_km`=(SELECT `costo_km` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), '
. ' `costo_dirittochiamata`=(SELECT `costo_diritto_chiamata` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), '
. ' `costo_ore_tecnico`=(SELECT `costo_orario_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), '
. ' `costo_km_tecnico`=(SELECT `costo_km_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), '
. ' `costo_dirittochiamata_tecnico`=(SELECT `costo_diritto_chiamata_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . ') '
. ' WHERE `idcontratto`=' . prepare ( post ( 'idcontratto' )) . ' AND `id`=' . prepare ( post ( 'idtipointervento' )));
2019-06-14 15:39:40 +02:00
if ( $result ) {
flash () -> info ( tr ( 'Informazioni tariffe salvate correttamente!' ));
} else {
flash () -> error ( tr ( " Errore durante l'importazione tariffe! " ));
}
}
// ...altrimenti la creo
else {
2024-02-28 16:28:53 +01:00
if ( $dbo -> query ( 'INSERT INTO `co_contratti_tipiintervento`(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico ) VALUES( ' . prepare ( post ( 'idcontratto' )) . ', ' . prepare ( post ( 'idtipointervento' )) . ', (SELECT `costo_orario` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), (SELECT `costo_km` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), (SELECT `costo_diritto_chiamata` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), (SELECT `costo_orario_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), (SELECT `costo_km_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . '), (SELECT `costo_diritto_chiamata_tecnico` FROM `in_tipiintervento` WHERE `id`=' . prepare ( post ( 'idtipointervento' )) . ') )' )) {
2019-06-14 15:39:40 +02:00
flash () -> info ( tr ( 'Informazioni tariffe salvate correttamente!' ));
} else {
flash () -> error ( tr ( " Errore durante l'importazione tariffe! " ));
}
}
2020-05-26 15:24:25 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Aggiunta di un documento in contratto
2020-05-26 15:24:25 +02:00
case 'add_preventivo' :
2020-07-02 15:27:18 +02:00
case 'add_documento' :
$class = post ( 'class' );
$id_documento = post ( 'id_documento' );
2020-05-26 15:24:25 +02:00
2020-07-02 15:27:18 +02:00
// 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 );
2020-05-26 15:24:25 +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-05-26 15:24:25 +02:00
// Creazione del contratto al volo
if ( post ( 'create_document' ) == 'on' ) {
2022-11-28 09:27:25 +01:00
$contratto = Contratto :: build ( $documento -> anagrafica , $documento -> nome , post ( 'id_segment' ));
2020-05-26 15:24:25 +02:00
2020-07-02 15:27:18 +02:00
$contratto -> idpagamento = $documento -> idpagamento ;
2020-07-31 10:30:38 +02:00
$contratto -> idsede = $id_sede ;
2024-03-08 17:20:47 +01:00
$contratto -> rinnovabile = setting ( 'Crea contratto rinnovabile di default' );
$contratto -> giorni_preavviso_rinnovo = setting ( 'Giorni di preavviso di default' );
2020-07-02 15:27:18 +02:00
$contratto -> id_documento_fe = $documento -> id_documento_fe ;
$contratto -> codice_cup = $documento -> codice_cup ;
$contratto -> codice_cig = $documento -> codice_cig ;
$contratto -> num_item = $documento -> num_item ;
2020-05-26 15:24:25 +02:00
2020-07-02 15:27:18 +02:00
$contratto -> descrizione = $documento -> descrizione ;
$contratto -> esclusioni = $documento -> esclusioni ;
2021-04-20 17:12:04 +02:00
$contratto -> idreferente = $documento -> idreferente ;
2022-05-19 17:42:41 +02:00
$contratto -> idagente = $documento -> idagente ;
2020-05-26 15:24:25 +02:00
$contratto -> save ();
$id_record = $contratto -> id ;
}
2021-04-06 15:10:55 +02:00
if ( ! empty ( $documento -> sconto_finale )) {
$contratto -> 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
$contratto -> sconto_finale_percentuale = $documento -> sconto_finale_percentuale ;
}
$contratto -> save ();
2020-07-02 15:27:18 +02:00
$righe = $documento -> getRighe ();
2020-05-26 15:24:25 +02:00
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 ( $contratto , $qta );
2023-11-13 15:38:27 +01:00
// Aggiornamento seriali dalla riga dell'ordine
if ( $copia -> isArticolo ()) {
$serials = is_array ( post ( 'serial' )[ $riga -> id ]) ? post ( 'serial' )[ $riga -> id ] : [];
$copia -> serials = $serials ;
}
2020-05-26 15:24:25 +02:00
$copia -> save ();
}
}
2020-09-09 11:44:14 +02:00
// Modifica finale dello stato
if ( post ( 'create_document' ) == 'on' ) {
$contratto -> idstato = post ( 'id_stato' );
$contratto -> save ();
}
2020-05-26 15:24:25 +02: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 );
2020-05-26 15:24:25 +02:00
2023-02-17 12:33:45 +01:00
break ;
case 'add_articolo' :
$id_articolo = post ( 'id_articolo' );
$barcode = post ( 'barcode' );
2023-04-27 12:17:36 +02:00
$dir = 'entrata' ;
2023-02-17 12:33:45 +01:00
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' ];
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-03-16 09:51:14 +01:00
$articolo = Articolo :: build ( $contratto , $originale );
$qta = 1 ;
2023-02-17 12:33:45 +01:00
2023-03-16 09:51:14 +01:00
$articolo -> um = $originale -> um ;
$articolo -> qta = 1 ;
$articolo -> costo_unitario = $originale -> prezzo_acquisto ;
2023-02-17 12:33:45 +01:00
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 = ( $contratto -> anagrafica -> idiva_vendite && ( ! $originale -> idiva_vendita || $aliquota_articolo != 0 ) ? $contratto -> anagrafica -> idiva_vendite : $originale -> idiva_vendita ) ? : setting ( 'Iva predefinita' );
2023-03-16 09:51:14 +01:00
$id_anagrafica = $contratto -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
2023-08-04 14:54:28 +02:00
2023-03-16 09:51:14 +01:00
// CALCOLO PREZZO UNITARIO
2023-12-29 16:15:38 +01:00
$prezzo_consigliato = getPrezzoConsigliato ( $id_anagrafica , $dir , $id_articolo );
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-03-16 09:51:14 +01:00
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $originale -> prezzo_vendita_ivato : $originale -> prezzo_vendita );
$provvigione = $dbo -> selectOne ( 'an_anagrafiche' , 'provvigione_default' , [ 'idanagrafica' => $contratto -> idagente ])[ 'provvigione_default' ];
2023-02-17 12:33:45 +01:00
2023-07-31 17:26:06 +02:00
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.id_piano_sconto_vendite=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
}
2023-03-16 09:51:14 +01:00
$articolo -> setPrezzoUnitario ( $prezzo_unitario , $id_iva );
$articolo -> setSconto ( $sconto , 'PRC' );
$articolo -> setProvvigione ( $provvigione ? : 0 , 'PRC' );
$articolo -> save ();
2023-02-17 12:33:45 +01:00
2023-03-16 09:51:14 +01:00
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-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-09-25 16:53:28 +02:00
break ;
case 'update-price' :
$dir = 'entrata' ;
$id_anagrafica = $contratto -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$numero_totale = 0 ;
$id_righe = ( array ) post ( 'righe' );
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
// 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 );
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-09-25 16:53:28 +02:00
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $riga -> articolo -> prezzo_vendita_ivato : $riga -> articolo -> prezzo_vendita );
$riga -> setPrezzoUnitario ( $prezzo_unitario , $riga -> idiva );
if ( $dir == 'entrata' ) {
$riga -> costo_unitario = $riga -> articolo -> prezzo_acquisto ;
}
}
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.id_piano_sconto_vendite=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
}
$riga -> setSconto ( $sconto , 'PRC' );
$riga -> save ();
++ $numero_totale ;
}
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-11-13 15:38:27 +01:00
break ;
case 'add_serial' :
$articolo = Articolo :: find ( post ( 'idriga' ));
$serials = ( array ) post ( 'serial' );
$articolo -> serials = $serials ;
2017-08-04 16:28:16 +02:00
break ;
2023-08-04 14:54:28 +02:00
}