. */ include_once __DIR__.'/../../../core.php'; use Modules\Interventi\Intervento; $tipologie = []; $tecnici = []; $stati_intervento = []; $materiali_art = []; $materiali_righe = []; // Tabella con riepilogo interventi $interventi = Intervento::where('id_contratto', $id_record)->get(); $totale_ore_completate = 0; if (!empty($interventi)) { echo ' '; // Tabella con i dati foreach ($interventi as $intervento) { $totale_ore_completate += !empty($intervento->stato->is_completato) ? $intervento->ore_totali : 0; // Riga per il singolo intervento echo ' '; // Riga con dettagli echo ' '; } $array_interventi = $interventi->toArray(); $totale_km = sum(array_column($array_interventi, 'km_totali')); $totale_costo = sum(array_column($array_interventi, 'spesa')); $totale_addebito = sum(array_column($array_interventi, 'imponibile')); $totale = sum(array_column($array_interventi, 'totale_imponibile')); $totale_ore = sum(array_column($array_interventi, 'ore_totali')); // Totali echo ' '; echo ' '; echo ' '; echo ' '; echo '
'.tr('Attività').' '.tr('Ore').' '.tr('Km').' '.tr('Costo').' '.tr('Tot. scontato').'
'.Modules::link('Interventi', $intervento->id, tr('Intervento num. _NUM_ del _DATE_', [ '_NUM_' => $intervento->codice, '_DATE_' => Translator::dateToLocale($intervento->inizio), ])).' '.($intervento->ore_totali <= 0 ? ' ' : '').numberFormat($intervento->ore_totali).' '.numberFormat($intervento->km_totali).' '.moneyFormat($intervento->spesa).' '.moneyFormat($intervento->totale_imponibile).'
'; // Lettura sessioni di lavoro $sessioni = $intervento->sessioni; if (!empty($sessioni)) { echo ' '; foreach ($sessioni as $sessione) { // Visualizzo lo sconto su ore o km se c'è $sconto_ore = !empty($sessione->sconto_totale_manodopera) ? '
'.moneyFormat(-$sessione->sconto_totale_manodopera).'' : ''; $sconto_km = !empty($sessione->sconto_totale_viaggio) ? '
'.moneyFormat(-$sessione->sconto_totale_viaggio).'' : ''; echo ' '; // Raggruppamento per tipologia descrizione $tipologie[$sessione->tipo->getTranslation('title')]['ore'] += $sessione->ore; $tipologie[$sessione->tipo->getTranslation('title')]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata; $tipologie[$sessione->tipo->getTranslation('title')]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata; // Raggruppamento per tecnico $tecnici[$sessione->anagrafica->ragione_sociale]['ore'] += $sessione->ore; $tecnici[$sessione->anagrafica->ragione_sociale]['km'] += $sessione->km; $tecnici[$sessione->anagrafica->ragione_sociale]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata; $tecnici[$sessione->anagrafica->ragione_sociale]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata; // Raggruppamento per stato intervento $stati_intervento[$intervento->stato->getTranslation('title')]['colore'] = $intervento->stato->colore; $stati_intervento[$intervento->stato->getTranslation('title')]['ore'] += $sessione->ore; $stati_intervento[$intervento->stato->getTranslation('title')]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata; $stati_intervento[$intervento->stato->getTranslation('title')]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata; } echo '
'.tr('Tecnico').' '.tr('Tipo attività').' '.tr('Ore').' '.tr('Km').' '.tr('Costo ore').' '.tr('Costo km').' '.tr('Diritto ch.').' '.tr('Prezzo ore').' '.tr('Prezzo km').' '.tr('Diritto ch.').'
'.$sessione->anagrafica->ragione_sociale.' '.$sessione->tipo->getTranslation('title').' '.numberFormat($sessione->ore).' '.numberFormat($sessione->km).' '.moneyFormat($sessione->costo_manodopera).' '.moneyFormat($sessione->costo_viaggio).' '.moneyFormat($sessione->costo_diritto_chiamata).' '.moneyFormat($sessione->prezzo_manodopera).$sconto_ore.' '.moneyFormat($sessione->prezzo_viaggio).$sconto_km.' '.moneyFormat($sessione->prezzo_diritto_chiamata).'
'; } // Lettura articoli utilizzati $articoli = $intervento->articoli; if (!$articoli->isEmpty()) { echo ' '; foreach ($articoli as $articolo) { $sconto = !empty($articolo->sconto) ? '
'.moneyFormat(-$articolo->sconto).'' : ''; echo ' '; // Raggruppamento per articolo con lo stesso prezzo $ricavo = (string) (($articolo->imponibile - $articolo->sconto) / ($articolo->qta > 0 ? $articolo->qta : 1)); $costo = (string) ($articolo->spesa / ($articolo->qta > 0 ? $articolo->qta : 1)); $descrizione = $articolo->articolo->codice.' - '.$articolo->descrizione; $materiali_art[$descrizione][$ricavo][$costo]['id'] = $articolo->id; $materiali_art[$descrizione][$ricavo][$costo]['qta'] += $articolo->qta; $materiali_art[$descrizione][$ricavo][$costo]['costo'] += $articolo->spesa; $materiali_art[$descrizione][$ricavo][$costo]['ricavo'] += $articolo->imponibile - $articolo->sconto; } echo '
'.tr('Materiale').' '.tr('Q.tà').' '.tr('Prezzo di acquisto').' '.tr('Prezzo di vendita').'
'.Modules::link('Articoli', $articolo->idarticolo, $articolo->descrizione).' '.numberFormat($articolo->qta, 'qta').' '.moneyFormat($articolo->spesa).' '.moneyFormat($articolo->imponibile).$sconto.'
'; } // Lettura spese aggiuntive $righe = $intervento->righe; if (!$righe->isEmpty()) { echo ' '; foreach ($righe as $riga) { $sconto = !empty($riga->sconto) ? '
'.moneyFormat(-$riga->sconto).'' : ''; echo ' '; // Raggruppamento per riga $materiali_righe[$riga->descrizione]['qta'] += $riga->qta; $materiali_righe[$riga->descrizione]['costo'] += $riga->spesa; $materiali_righe[$riga->descrizione]['ricavo'] += $riga->imponibile - $riga->sconto; } echo '
'.tr('Altre spese').' '.tr('Q.tà').' '.tr('Prezzo di acquisto').' '.tr('Prezzo di vendita').'
'.$riga->descrizione.' '.numberFormat($riga->qta, 'qta').' '.moneyFormat($riga->spesa).' '.moneyFormat($riga->imponibile).$sconto.'
'; } echo '
'.tr('Totale').' '.numberFormat($totale_ore).' '.numberFormat($totale_km).' '.moneyFormat($totale_costo).' '.moneyFormat($totale).'
'; } /* Bilancio del contratto */ $rs = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS budget FROM co_righe_contratti WHERE idcontratto='.prepare($id_record)); $budget = $rs[0]['budget']; $rs = $dbo->fetchArray("SELECT SUM(qta) AS totale_ore FROM `co_righe_contratti` WHERE um='ore' AND idcontratto=".prepare($id_record)); $totale_ore_contratto = $rs[0]['totale_ore']; $diff = sum($budget, -$totale) - $contratto->provvigione; if ($diff > 0) { $bilancio = ''.moneyFormat($diff).''; } elseif ($diff < 0) { $bilancio = ''.moneyFormat($diff).''; } else { $bilancio = ''.moneyFormat($diff).''; } echo '
'.tr('Rapporto budget/spesa').':
'.$bilancio.'


'; echo '
'; if (!empty($totale_ore_contratto)) { echo ' '; } echo ' '; if (!empty($totale_ore_contratto)) { echo ' '; } echo ' '; if (!empty($totale_ore_contratto)) { echo ' '; } echo '
'.tr('Ore a contratto').': '.Translator::numberToLocale($totale_ore_contratto).'
'.tr('Ore erogate totali').': '.Translator::numberToLocale($totale_ore).'
'.tr('Ore residue totali').': '.Translator::numberToLocale(floatval($totale_ore_contratto) - floatval($totale_ore)).'
'.tr('Ore erogate concluse').': '.Translator::numberToLocale($totale_ore_completate).'
'.tr('Ore residue concluse').': '.Translator::numberToLocale(floatval($totale_ore_contratto) - floatval($totale_ore_completate)).'
'; if (empty($totale_ore_contratto)) { echo '

'.tr('Per monitorare il consumo ore, inserisci almeno una riga con unità di misura "ore"').'.

'; } echo '
'; ksort($tipologie); foreach ($tipologie as $key => $tipologia) { $margine = $tipologia['ricavo'] - $tipologia['costo']; if ($tipologia['ricavo']) { $margine_prc = (int) (1 - ($tipologia['costo'] / ($tipologia['ricavo'] > 0 ? $tipologia['ricavo'] : 1))) * 100; $ricarico_prc = ($tipologia['ricavo'] && $tipologia['costo']) ? (int) ((($tipologia['ricavo'] / ($tipologia['costo'] > 0 ? $tipologia['costo'] : 1)) - 1) * 100) : 100; } echo ' '; } echo '
'.tr('Tipologia').' '.tr('Ore').' '.tr('Costo').' '.tr('Ricavo').' '.tr('Margine').' '.tr('Ricarico').'
'.$key.' '.Translator::numberToLocale($tipologia['ore']).' '.Translator::numberToLocale($tipologia['costo']).' € '.Translator::numberToLocale($tipologia['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%) '.Translator::numberToLocale($margine).' € ('.$ricarico_prc.'%)
'; ksort($tecnici); foreach ($tecnici as $key => $tecnico) { $margine = $tecnico['ricavo'] - $tecnico['costo']; if ($tecnico['ricavo']) { $margine_prc = (int) (1 - ($tecnico['costo'] / ($tecnico['ricavo'] > 0 ? $tecnico['ricavo'] : 1))) * 100; $ricarico_prc = ($tecnico['ricavo'] && $tecnico['costo']) ? (int) ((($tecnico['ricavo'] / ($tecnico['costo'] > 0 ? $tecnico['costo'] : 1)) - 1) * 100) : 100; } echo ' '; } echo '
'.tr('Tecnici').' '.tr('km').' '.tr('Ore').' '.tr('Costo').' '.tr('Ricavo').' '.tr('Margine').' '.tr('Ricarico').'
'.$key.' '.(int) $tecnico['km'].' '.Translator::numberToLocale($tecnico['ore']).' '.Translator::numberToLocale($tecnico['costo']).' € '.Translator::numberToLocale($tecnico['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%) '.Translator::numberToLocale($margine).' € ('.$ricarico_prc.'%)
'; ksort($stati_intervento); foreach ($stati_intervento as $key => $stato) { $margine = $stato['ricavo'] - $stato['costo']; if ($stato['ricavo']) { $margine_prc = (int) (1 - ($stato['costo'] / ($stato['ricavo'] > 0 ? $stato['ricavo'] : 1))) * 100; $ricarico_prc = ($stato['ricavo'] && $stato['costo']) ? (int) ((($stato['ricavo'] / ($stato['costo'] > 0 ? $stato['costo'] : 1)) - 1) * 100) : 100; } echo ' '; } echo '
'.tr('Stato').' '.tr('Ore').' '.tr('Costo').' '.tr('Ricavo').' '.tr('Margine').' '.tr('Ricarico').'
'.$key.'
'.Translator::numberToLocale($stato['ore']).' '.Translator::numberToLocale($stato['costo']).' € '.Translator::numberToLocale($stato['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%) '.Translator::numberToLocale($margine).' € ('.$ricarico_prc.'%)
'; ksort($materiali_art); foreach ($materiali_art as $key => $materiali_array1) { foreach ($materiali_array1 as $materiali_array2) { foreach ($materiali_array2 as $materiale) { $margine = $materiale['ricavo'] - $materiale['costo']; $margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] > 0 ? $materiale['ricavo'] : 1))) * 100; $ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] > 0 ? $materiale['costo'] : 1)) - 1) * 100) : 100; echo ' '; } } } ksort($materiali_righe); foreach ($materiali_righe as $key => $materiale) { $margine = $materiale['ricavo'] - $materiale['costo']; $margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] > 0 ? $materiale['ricavo'] : 1))) * 100; $ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] > 0 ? $materiale['costo'] : 1)) - 1) * 100) : 100; echo ' '; } echo '
'.tr('Materiale').' '.tr('Qtà').' '.tr('Costo').' '.tr('Ricavo').' '.tr('Margine').' '.tr('Ricarico').'
'.Modules::link('Articoli', $materiale['id'], $key).' '.$materiale['qta'].' '.Translator::numberToLocale($materiale['costo']).' € '.Translator::numberToLocale($materiale['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%) '.Translator::numberToLocale($margine).' € ('.$ricarico_prc.'%)
'.$key.' '.$materiale['qta'].' '.Translator::numberToLocale($materiale['costo']).' € '.Translator::numberToLocale($materiale['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%) '.Translator::numberToLocale($margine).' € ('.$ricarico_prc.'%)
'; /* Stampa consuntivo */ echo '
'.Prints::getLink('Consuntivo contratto', $id_record, 'btn-primary', tr('Stampa consuntivo')).'
';