fetchArray('SELECT idintervento, TIMESTAMPDIFF( MINUTE, orario_inizio, orario_fine ) / 60 AS tot_ore FROM in_interventi_tecnici WHERE idintervento = '.prepare($idintervento)); for ($i = 0; $i < count($rs); ++$i) { $totale_ore = $totale_ore + $rs[$i]['tot_ore']; } return $totale_ore; } /** * Funzione per collegare gli articoli, usati in un intervento, ai rispettivi impianti. * * @param [type] $idintervento * @param [type] $idimpianto * @param [type] $idarticolo * @param [type] $qta */ function link_componente_to_articolo($idintervento, $idimpianto, $idarticolo, $qta) { global $docroot; $dbo = Database::getConnection(); 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']).')'); } } } } function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto) { $dbo = Database::getConnection(); $rs = $dbo->fetchArray('SELECT idsede, idtipointervento FROM in_interventi WHERE id='.prepare($idintervento)); $idtipointervento = $rs[0]['idtipointervento']; $idsede = $rs[0]['idsede']; // Calcolo km in base a quelli impostati nell'anagrafica // Nessuna sede if ($idsede == '-1') { $km = 0; } // Sede legale elseif (empty($idsede)) { $rs2 = $dbo->fetchArray('SELECT km FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica)); $km = $rs2[0]['km']; } // Sede secondaria else { $rs2 = $dbo->fetchArray('SELECT km FROM an_sedi WHERE id='.prepare($idsede)); $km = $rs2[0]['km']; } $km = empty($km) ? 0 : $km; // Calcolo il totale delle ore lavorate $diff = date_diff(date_create($inizio), date_create($fine)); $ore = ($diff->h + ($diff->i / 60)); // Leggo i costi unitari dalle tariffe se almeno un valore è stato impostato $rsc = $dbo->fetchArray('SELECT * FROM in_tariffe WHERE idtecnico='.prepare($idtecnico).' AND idtipointervento='.prepare($idtipointervento)); if ($rsc[0]['costo_ore'] != 0 || $rsc[0]['costo_km'] != 0 || $rsc[0]['costo_dirittochiamata'] != 0 || $rsc[0]['costo_ore_tecnico'] != 0 || $rsc[0]['costo_km_tecnico'] != 0 || $rsc[0]['costo_dirittochiamata_tecnico'] != 0) { $costo_ore = $rsc[0]['costo_ore']; $costo_km = $rsc[0]['costo_km']; $costo_dirittochiamata = $rsc[0]['costo_dirittochiamata']; $costo_ore_tecnico = $rsc[0]['costo_ore_tecnico']; $costo_km_tecnico = $rsc[0]['costo_km_tecnico']; $costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico']; } // ...altrimenti se non c'è una tariffa per il tecnico leggo i costi globali else { $rsc = $dbo->fetchArray('SELECT * FROM in_tipiintervento WHERE idtipointervento='.prepare($idtipointervento)); $costo_ore = $rsc[0]['costo_orario']; $costo_km = $rsc[0]['costo_km']; $costo_dirittochiamata = $rsc[0]['costo_diritto_chiamata']; $costo_ore_tecnico = $rsc[0]['costo_orario_tecnico']; $costo_km_tecnico = $rsc[0]['costo_km_tecnico']; $costo_dirittochiamata_tecnico = $rsc[0]['costo_diritto_chiamata_tecnico']; } // Leggo i costi unitari da contratto se l'intervento è legato ad un contratto e c'è almeno un record... if (!empty($idcontratto)) { $rsc = $dbo->fetchArray('SELECT * FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($idcontratto).' AND idtipointervento='.prepare($idtipointervento)); if (count($rsc) == 1) { $costo_ore = $rsc[0]['costo_ore']; $costo_km = $rsc[0]['costo_km']; $costo_dirittochiamata = $rsc[0]['costo_dirittochiamata']; $costo_ore_tecnico = $rsc[0]['costo_ore_tecnico']; $costo_km_tecnico = $rsc[0]['costo_km_tecnico']; $costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico']; } } // Azzeramento forzato del diritto di chiamata nel caso questa non sia la prima sessione dell'intervento per il giorno di inizio [Luca] $rs = $dbo->fetchArray('SELECT id FROM in_interventi_tecnici WHERE (DATE(orario_inizio)=DATE('.prepare($inizio).') OR DATE(orario_fine)=DATE('.prepare($inizio).')) AND idintervento='.prepare($idintervento)); if (!empty($rs)) { $costo_dirittochiamata_tecnico = 0; $costo_dirittochiamata = 0; } // Inserisco le ore dei tecnici nella tabella "in_interventi_tecnici" $dbo->insert('in_interventi_tecnici', [ 'idintervento' => $idintervento, 'idtipointervento' => $idtipointervento, 'idtecnico' => $idtecnico, 'km' => $km, 'orario_inizio' => $inizio, 'orario_fine' => $fine, 'ore' => $ore, 'prezzo_ore_unitario' => $costo_ore, 'prezzo_km_unitario' => $costo_km, 'prezzo_ore_consuntivo' => $costo_ore * $ore + $costo_dirittochiamata, 'prezzo_km_consuntivo' => 0, 'prezzo_dirittochiamata' => $costo_dirittochiamata, 'prezzo_ore_unitario_tecnico' => $costo_ore_tecnico, 'prezzo_km_unitario_tecnico' => $costo_km_tecnico, 'prezzo_ore_consuntivo_tecnico' => $costo_ore_tecnico * $ore + $costo_dirittochiamata_tecnico, 'prezzo_km_consuntivo_tecnico' => 0, 'prezzo_dirittochiamata_tecnico' => $costo_dirittochiamata_tecnico, ]); } function get_costi_intervento($id_intervento) { $dbo = Database::getConnection(); $decimals = Settings::get('Cifre decimali per importi'); $tecnici = $dbo->fetchArray('SELECT COALESCE(SUM( ROUND(prezzo_ore_consuntivo_tecnico, '.$decimals.') ), 0) AS manodopera_costo, COALESCE(SUM( ROUND(prezzo_ore_consuntivo, '.$decimals.') ), 0) AS manodopera_addebito, COALESCE(SUM( ROUND(prezzo_ore_consuntivo, '.$decimals.') - ROUND(sconto, '.$decimals.') ), 0) AS manodopera_scontato, COALESCE(SUM( ROUND(prezzo_dirittochiamata_tecnico, '.$decimals.') ), 0) AS dirittochiamata_costo, COALESCE(SUM( ROUND(prezzo_dirittochiamata, '.$decimals.') ), 0) AS dirittochiamata_addebito, COALESCE(SUM( ROUND(prezzo_dirittochiamata, '.$decimals.') ), 0) AS dirittochiamata_scontato, COALESCE(SUM( ROUND(prezzo_km_consuntivo_tecnico, '.$decimals.') ), 0) AS viaggio_costo, COALESCE(SUM( ROUND(prezzo_km_consuntivo, '.$decimals.') ), 0) viaggio_addebito, COALESCE(SUM( ROUND(prezzo_km_consuntivo, '.$decimals.') - ROUND(scontokm, '.$decimals.') ), 0) AS viaggio_scontato FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento)); $articoli = $dbo->fetchArray('SELECT COALESCE(SUM( ROUND(prezzo_acquisto, '.$decimals.') * ROUND(qta, '.$decimals.') ), 0) AS ricambi_costo, COALESCE(SUM( ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') ), 0) AS ricambi_addebito, COALESCE(SUM( ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') - ROUND(sconto, '.$decimals.') ), 0) AS ricambi_scontato FROM mg_articoli_interventi WHERE idintervento='.prepare($id_intervento)); $altro = $dbo->fetchArray('SELECT COALESCE(SUM( ROUND(prezzo_acquisto, '.$decimals.') * ROUND(qta, '.$decimals.') ), 0) AS altro_costo, COALESCE(SUM( ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') ), 0) AS altro_addebito, COALESCE(SUM( ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') - ROUND(sconto, '.$decimals.') ), 0) AS altro_scontato FROM in_righe_interventi WHERE idintervento='.prepare($id_intervento)); $result = array_merge($tecnici[0], $articoli[0], $altro[0]); $result['totale_costo'] = sum([ $result['manodopera_costo'], $result['dirittochiamata_costo'], $result['viaggio_costo'], $result['ricambi_costo'], $result['altro_costo'], ]); $result['totale_addebito'] = sum([ $result['manodopera_addebito'], $result['dirittochiamata_addebito'], $result['viaggio_addebito'], $result['ricambi_addebito'], $result['altro_addebito'], ]); $result['totale_scontato'] = sum([ $result['manodopera_scontato'], $result['dirittochiamata_scontato'], $result['viaggio_scontato'], $result['ricambi_scontato'], $result['altro_scontato'], ]); // Calcolo dello sconto incondizionato $sconto = $dbo->fetchArray('SELECT sconto_globale, tipo_sconto_globale FROM in_interventi WHERE id='.prepare($id_intervento))[0]; $result['sconto_globale'] = ($sconto['tipo_sconto_globale'] == 'PRC') ? $result['totale_scontato'] * $sconto['sconto_globale'] / 100 : $sconto['sconto_globale']; $result['sconto_globale'] = round($result['sconto_globale'], $decimals); $result['totale'] = sum($result['totale_scontato'], -$result['sconto_globale']); return $result; }