2017-08-04 16:28:16 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
2019-08-27 15:42:13 +02:00
use Models\Mail ;
use Models\MailTemplate ;
2019-07-15 12:27:12 +02:00
use Modules\Anagrafiche\Anagrafica ;
2019-07-24 15:29:03 +02:00
use Modules\Fatture\Components\Descrizione ;
use Modules\Fatture\Components\Riga ;
2019-07-24 15:41:04 +02:00
use Modules\Fatture\Fattura ;
2019-07-15 12:27:12 +02:00
use Modules\Interventi\Components\Sessione ;
use Modules\Interventi\Intervento ;
2019-08-27 15:42:13 +02:00
use Notifications\EmailNotification ;
2019-07-15 12:27:12 +02:00
2017-08-04 16:28:16 +02:00
/**
* Recupera il totale delle ore spese per un intervento .
*
2019-07-24 15:29:03 +02:00
* @ param int $id_intervento
2017-08-04 16:28:16 +02:00
*/
2019-07-24 15:29:03 +02:00
function get_ore_intervento ( $id_intervento )
2019-07-24 15:41:04 +02:00
{
$intervento = Intervento :: find ( $id_intervento );
2017-08-04 16:28:16 +02:00
2019-07-24 15:41:04 +02:00
return $intervento -> ore_totali ;
2017-08-04 16:28:16 +02:00
}
/**
* Funzione per collegare gli articoli , usati in un intervento , ai rispettivi impianti .
*
2018-06-27 18:58:50 +02:00
* @ param int $idintervento
* @ param int $idimpianto
* @ param int $idarticolo
* @ param int $qta
2017-08-04 16:28:16 +02:00
*/
function link_componente_to_articolo ( $idintervento , $idimpianto , $idarticolo , $qta )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
if ( ! empty ( $idimpianto ) && ! empty ( $idintervento )) {
//Leggo la data dell'intervento
$rs = $dbo -> fetchArray ( " SELECT DATE_FORMAT(MIN(orario_inizio),'%Y-%m-%d') AS data FROM in_interventi_tecnici WHERE idintervento= " . prepare ( $idintervento ));
$data = $rs [ 0 ][ 'data' ];
$rs = $dbo -> fetchArray ( 'SELECT componente_filename, contenuto FROM mg_articoli WHERE id=' . prepare ( $idarticolo ));
//Se l'articolo aggiunto è collegato a un file .ini, aggiungo il componente all'impianto selezionato
if ( count ( $rs ) == 1 && $rs [ 0 ][ 'componente_filename' ] != '' ) {
//Inserisco il componente tante volte quante la quantità degli articoli inseriti
for ( $q = 0 ; $q < $qta ; ++ $q ) {
$dbo -> query ( 'INSERT INTO my_impianto_componenti(idimpianto, idintervento, nome, data, filename, contenuto) VALUES (' . prepare ( $idimpianto ) . ', ' . prepare ( $idintervento ) . ', ' . prepare ( \Util\Ini :: getValue ( $rs [ 0 ][ 'componente_filename' ], 'Nome' )) . ', ' . prepare ( $data ) . ', ' . prepare ( $rs [ 0 ][ 'componente_filename' ]) . ', ' . prepare ( $rs [ 0 ][ 'contenuto' ]) . ')' );
}
}
}
}
2018-08-28 15:39:51 +02:00
function add_tecnico ( $idintervento , $idtecnico , $inizio , $fine , $idcontratto = null )
2017-08-04 16:28:16 +02:00
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
2019-07-15 12:27:12 +02:00
$intervento = Intervento :: find ( $idintervento );
$anagrafica = Anagrafica :: find ( $idtecnico );
2017-09-14 16:20:11 +02:00
2019-07-15 12:27:12 +02:00
$sessione = Sessione :: build ( $intervento , $anagrafica , $inizio , $fine );
2018-08-31 17:33:33 +02:00
2018-09-20 11:39:03 +02:00
// Notifica nuovo intervento al tecnico
if ( ! empty ( $tecnico [ 'email' ])) {
2019-08-27 15:42:13 +02:00
$template = MailTemplate :: get ( 'Notifica intervento' );
2018-09-20 11:39:03 +02:00
2019-08-27 15:42:13 +02:00
$mail = Mail :: build ( auth () -> getUser (), $template , $idintervento );
$mail -> addReceiver ( $anagrafica [ 'email' ]);
$mail -> save ();
2018-09-20 11:39:03 +02:00
}
2018-08-31 17:33:33 +02:00
return true ;
2017-08-04 16:28:16 +02:00
}
2017-09-06 15:29:51 +02:00
2018-07-17 12:05:21 +02:00
/**
* Calcola le ore presenti tra due date .
*
* @ param string $orario_inizio
* @ param string $orario_fine
*
* @ return float
*/
function calcola_ore_intervento ( $orario_inizio , $orario_fine )
{
$inizio = new DateTime ( $orario_inizio );
$diff = $inizio -> diff ( new DateTime ( $orario_fine ));
2018-09-18 18:21:54 +02:00
$ore = $diff -> i / 60 + $diff -> h + ( $diff -> days * 24 );
2018-07-17 12:05:21 +02:00
return $ore ;
}
2018-09-03 16:01:05 +02:00
2018-09-26 16:28:02 +02:00
function aggiungi_intervento_in_fattura ( $id_intervento , $id_fattura , $descrizione , $id_iva , $id_conto , $id_rivalsa_inps = false , $id_ritenuta_acconto = false , $calcolo_ritenuta_acconto = false )
2018-08-31 12:33:48 +02:00
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-08-31 12:33:48 +02:00
2019-01-22 15:07:09 +01:00
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting ( 'Percentuale rivalsa' );
2018-09-26 16:28:02 +02:00
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting ( " Percentuale ritenuta d'acconto " );
2018-10-04 17:41:31 +02:00
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting ( " Metodologia calcolo ritenuta d'acconto predefinito " );
2018-09-04 17:59:12 +02:00
2019-07-24 15:29:03 +02:00
$fattura = Fattura :: find ( $id_fattura );
$intervento = Intervento :: find ( $id_intervento );
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
$data = $intervento -> inizio ;
$codice = $intervento -> codice ;
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
// Riga di descrizione
$riga = Descrizione :: build ( $fattura );
$riga -> descrizione = $descrizione ;
$riga -> idintervento = $id_intervento ;
$riga -> save ();
// Ore di lavoro raggruppate per costo orario
$sessioni = $intervento -> sessioni ;
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
if ( empty ( $sessioni )) {
flash () -> warning ( tr ( " L'intervento _NUM_ non ha sessioni di lavoro! " , [
'_NUM_' => $codice ,
]));
} else {
$ore_di_lavoro = $sessioni -> groupBy ( function ( $item , $key ) {
return $item [ 'prezzo_orario' ] . '|' . $item [ 'sconto_unitario' ] . '|' . $item [ 'tipo_sconto' ];
});
2019-07-24 15:41:04 +02:00
foreach ( $ore_di_lavoro as $gruppo ) {
2019-07-24 15:29:03 +02:00
$sessione = $gruppo -> first ();
$riga = Riga :: build ( $fattura );
$riga -> descrizione = tr ( " Ore di lavoro dell'intervento _NUM_ del _DATE_ " , [
'_NUM_' => $codice ,
'_DATE_' => dateFormat ( $data ),
]);
$riga -> idintervento = $id_intervento ;
$riga -> um = 'ore' ;
$riga -> id_iva = $id_iva ;
$riga -> idconto = $id_conto ;
$riga -> calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ;
$riga -> id_ritenuta_acconto = $id_ritenuta_acconto ;
$riga -> id_rivalsa_inps = $id_rivalsa_inps ;
$riga -> prezzo_unitario_vendita = $sessione -> prezzo_orario ;
$riga -> sconto_unitario = $sessione -> sconto_unitario ;
2019-07-24 15:41:04 +02:00
$riga -> tipo_sconto = $sessione -> tipo_sconto ;
2019-07-24 15:29:03 +02:00
$riga -> qta = $gruppo -> sum ( 'ore' );
$riga -> save ();
2018-08-31 12:33:48 +02:00
}
2019-07-24 15:29:03 +02:00
// Diritti di chiamata raggruppati per costo
2019-07-24 15:41:04 +02:00
$diritti_chiamata = $sessioni -> where ( 'prezzo_diritto_chiamata' , '>' , 0 ) -> groupBy ( function ( $item , $key ) {
2019-07-24 15:29:03 +02:00
return $item [ 'prezzo_diritto_chiamata' ];
});
2019-07-24 15:41:04 +02:00
foreach ( $diritti_chiamata as $gruppo ) {
2019-07-24 15:29:03 +02:00
$diritto_chiamata = $gruppo -> first ();
$riga = Riga :: build ( $fattura );
$riga -> descrizione = tr ( " Diritto di chiamata dell'intervento _NUM_ del _DATE_ " , [
'_NUM_' => $codice ,
'_DATE_' => dateFormat ( $data ),
]);
$riga -> idintervento = $id_intervento ;
$riga -> um = 'ore' ;
$riga -> id_iva = $id_iva ;
$riga -> idconto = $id_conto ;
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
$riga -> calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ;
$riga -> id_ritenuta_acconto = $id_ritenuta_acconto ;
$riga -> id_rivalsa_inps = $id_rivalsa_inps ;
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
$riga -> prezzo_unitario_vendita = $diritto_chiamata -> prezzo_diritto_chiamata ;
$riga -> qta = $gruppo -> count ();
$riga -> save ();
}
2018-08-31 12:33:48 +02:00
}
2019-07-24 15:29:03 +02:00
// Articoli, righe, sconti e descrizioni collegati all'intervento
$righe = $intervento -> getRighe ();
foreach ( $righe as $riga ) {
$qta = $riga -> qta ;
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
$copia = $riga -> copiaIn ( $fattura , $qta );
$copia -> id_conto = $id_conto ;
$copia -> calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ;
$copia -> id_ritenuta_acconto = $id_ritenuta_acconto ;
$copia -> id_rivalsa_inps = $id_rivalsa_inps ;
// Aggiornamento seriali dalla riga dell'ordine
if ( $copia -> isArticolo ()) {
$copia -> serials = $riga -> serials ;
2018-08-31 12:33:48 +02:00
}
2019-07-24 15:29:03 +02:00
$copia -> save ();
2018-08-31 12:33:48 +02:00
}
// Aggiunta km come "Trasferta" (se c'è)
2019-07-12 17:35:14 +02:00
if ( $intervento -> prezzo_viaggio > 0 ) {
2019-07-24 15:29:03 +02:00
$riga = Riga :: build ( $fattura );
2018-08-31 12:33:48 +02:00
2019-07-24 15:29:03 +02:00
$riga -> descrizione = tr ( " Trasferta dell'intervento _NUM_ del _DATE_ " , [
'_NUM_' => $codice ,
'_DATE_' => dateFormat ( $data ),
]);
$riga -> idintervento = $id_intervento ;
$riga -> id_iva = $id_iva ;
$riga -> idconto = $id_conto ;
$riga -> calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ;
$riga -> id_ritenuta_acconto = $id_ritenuta_acconto ;
$riga -> id_rivalsa_inps = $id_rivalsa_inps ;
$riga -> prezzo_unitario_vendita = $intervento -> prezzo_viaggio ;
$riga -> sconto_unitario = $intervento -> sconto_totale_viaggio ;
2019-07-24 15:41:04 +02:00
$riga -> tipo_sconto = 'UNT' ;
2019-07-24 15:29:03 +02:00
$riga -> qta = 1 ;
$riga -> save ();
2018-08-31 12:33:48 +02:00
}
// Ricalcolo inps, ritenuta e bollo
2019-07-24 15:29:03 +02:00
ricalcola_costiagg_fattura ( $id_fattura );
2018-08-31 12:33:48 +02:00
// Metto l'intervento in stato "Fatturato"
$dbo -> query ( " UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id= " . prepare ( $id_intervento ));
}