. */ 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_preventivo', $id_record)->get(); if (!empty($interventi)) { echo ' '; // Tabella con i dati foreach ($interventi as $intervento) { // 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 preventivo $budget = $preventivo->totale_imponibile; $diff = sum($budget, -$totale) - $preventivo->provvigione; echo '

'.tr('Budget rimanente').':
'; if ($diff > 0) { echo ' +'.moneyFormat($diff).''; } elseif ($diff < 0) { echo ' '.moneyFormat($diff).''; } else { echo ' '.moneyFormat($diff).''; } echo '


'; ksort($tipologie); foreach ($tipologie as $key => $tipologia) { $margine = $tipologia['ricavo'] - $tipologia['costo']; $margine_prc = ($tipologia['ricavo'] && $tipologia['costo']) ? (int) (1 - ($tipologia['costo'] / ($tipologia['ricavo'] > 0 ? $tipologia['ricavo'] : 1))) * 100 : 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']; $margine_prc = ($tecnico['ricavo'] && $tecnico['costo']) ? (int) (1 - ($tecnico['costo'] / ($tecnico['ricavo'] > 0 ? $tecnico['ricavo'] : 1))) * 100 : 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.' '.Translator::numberToLocale($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']; $margine_prc = ($stato['ricavo'] && $stato['costo']) ? (int) (1 - ($stato['costo'] / ($stato['ricavo'] > 0 ? $stato['ricavo'] : 1))) * 100 : 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 = ($materiale['ricavo'] && $materiale['costo']) ? (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] > 0 ? $materiale['ricavo'] : 1))) * 100 : 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 = ($materiale['ricavo']) ? (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] > 0 ? $materiale['ricavo'] : 1))) * 100 : 0; $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 preventivo', $id_record, 'btn-primary', tr('Stampa consuntivo')).'
'; // Aggiunta interventi se il preventivo é aperto o in attesa o pagato (non si possono inserire interventi collegati ad altri preventivi) $query = 'SELECT id, CONCAT(\'Intervento \', codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta), \'%d/%m/%Y\')) AS descrizione FROM in_interventi WHERE id_preventivo IS NULL AND id_contratto IS NULL AND id_ordine IS NULL AND id NOT IN( SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN( SELECT idintervento FROM co_promemoria WHERE idintervento IS NOT NULL) AND idanagrafica='.prepare($record['idanagrafica']); $count = $dbo->fetchNum($query); echo '
{[ "type": "select", "label": "'.tr('Aggiungi un intervento a questo preventivo').' ('.$count.')", "name": "idintervento", "values": "query='.$query.'", "required":"1" ]}

 

';