510 lines
14 KiB
PHP
Executable File
510 lines
14 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
|
* Copyright (C) DevCode s.r.l.
|
|
*
|
|
* 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/>.
|
|
*/
|
|
|
|
use Carbon\Carbon;
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
$d_qta = (integer)setting('Cifre decimali per quantità in stampa');
|
|
$d_importi = (integer)setting('Cifre decimali per importi in stampa');
|
|
|
|
/*
|
|
Dati intervento
|
|
*/
|
|
echo '
|
|
<table class="table table-bordered">
|
|
<tr>
|
|
<th colspan="4" style="font-size:13pt;" class="text-center">'.tr('Rapporto attività e interventi', [], ['upper' => true]).'</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="text-left" style="width:30%">'.tr('Intervento n.').': <b>'.$documento['codice'].'</b></td>
|
|
<td class="text-left" colspan="'.(empty($preventivo) && empty($contratto) ? '3' : '1').'" style="width:30%">'.tr('Data richiesta').': <b>'.Translator::dateToLocale($documento['data_richiesta']).'</b></td>';
|
|
if (!empty($preventivo)) {
|
|
echo '
|
|
<td class="text-left" colspan="2" style="width:20%">'.tr('Preventivo n.').': <b>'.(!empty($preventivo) ? $preventivo['numero'].' del '.Translator::dateToLocale($preventivo['data_bozza']) : '').'</b></td>';
|
|
} elseif (!empty($contratto)) {
|
|
echo '
|
|
<td class="text-left" colspan="2" style="width:20%">'.tr('Contratto n.').': <b>'.(!empty($contratto) ? $contratto['numero'].' del '.Translator::dateToLocale($contratto['data_bozza']) : '').'</b></td>';
|
|
}
|
|
echo '
|
|
</tr>';
|
|
|
|
// Dati cliente
|
|
echo '
|
|
<tr>
|
|
<td colspan=2>
|
|
'.tr('Cliente').': <b>'.$c_ragionesociale.'</b>
|
|
</td>';
|
|
|
|
// Codice fiscale o P.Iva
|
|
|
|
if (!empty($c_piva)) {
|
|
echo '
|
|
<td colspan=2>
|
|
'.tr('P.Iva').': <b>'.strtoupper($c_piva).'</b>
|
|
</td>';
|
|
} else {
|
|
echo '
|
|
<td colspan=2>
|
|
'.tr('C.F.').': <b>'.strtoupper($c_codicefiscale).'</b>
|
|
</td>';
|
|
}
|
|
|
|
echo '</tr>';
|
|
|
|
// Indirizzo
|
|
if (!empty($s_indirizzo) or !empty($s_cap) or !empty($s_citta) or !empty($s_provincia)) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="4">
|
|
'.((!empty($s_indirizzo)) ? tr('Via').': <b>'.$s_indirizzo.'</b>' : '').'
|
|
'.((!empty($s_cap)) ? tr('CAP').': <b>'.$s_cap.'</b>' : '').'
|
|
'.((!empty($s_citta)) ? tr('Città').': <b>'.$s_citta.'</b>' : '').'
|
|
'.((!empty($s_provincia)) ? tr('Provincia').': <b>'.strtoupper($s_provincia).'</b>' : '').'
|
|
</td>
|
|
</tr>';
|
|
} elseif (!empty($c_indirizzo) or !empty($c_cap) or !empty($c_citta) or !empty($c_provincia)) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="4">
|
|
'.((!empty($c_indirizzo)) ? tr('Via').': <b>'.$c_indirizzo.'</b>' : '').'
|
|
'.((!empty($c_cap)) ? tr('CAP').': <b>'.$c_cap.'</b>' : '').'
|
|
'.((!empty($c_citta)) ? tr('Città').': <b>'.$c_citta.'</b>' : '').'
|
|
'.((!empty($c_provincia)) ? tr('Provincia').': <b>'.strtoupper($c_provincia).'</b>' : '').'
|
|
</td>
|
|
</tr>';
|
|
}
|
|
|
|
echo '
|
|
<tr>
|
|
<td colspan="4">
|
|
'.tr('Telefono').': <b>'.$c_telefono.'</b>';
|
|
if (!empty($c_cellulare)) {
|
|
echo ' - '.tr('Cellulare').': <b>'.$c_cellulare.'</b>';
|
|
}
|
|
echo '
|
|
</td>
|
|
</tr>';
|
|
|
|
// riga 3
|
|
// Elenco impianti su cui è stato fatto l'intervento
|
|
$rs2 = $dbo->fetchArray('SELECT *, (SELECT nome FROM my_impianti WHERE id=my_impianti_interventi.idimpianto) AS nome, (SELECT matricola FROM my_impianti WHERE id=my_impianti_interventi.idimpianto) AS matricola FROM my_impianti_interventi WHERE idintervento='.prepare($id_record));
|
|
$impianti = [];
|
|
for ($j = 0; $j < count($rs2); ++$j) {
|
|
$impianti[] = '<b>'.$rs2[$j]['nome']."</b> <small style='color:#777;'>(".$rs2[$j]['matricola'].')</small>';
|
|
}
|
|
echo '
|
|
<tr>
|
|
<td colspan="4">
|
|
'.tr('Impianti').': '.implode(', ', $impianti).'
|
|
</td>
|
|
</tr>';
|
|
|
|
// Tipo intervento
|
|
echo '
|
|
<tr>
|
|
<td colspan="4">
|
|
<b>'.tr('Tipo intervento').':</b> '.$documento->tipo->descrizione.'
|
|
</td>
|
|
</tr>';
|
|
|
|
// Richiesta
|
|
// Rimosso nl2br, non necessario con ckeditor
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" style="height:20mm;">
|
|
<b>'.tr('Richiesta').':</b>
|
|
<p>'.($documento['richiesta']).'</p>
|
|
</td>
|
|
</tr>';
|
|
|
|
// Descrizione
|
|
// Rimosso nl2br, non necessario con ckeditor
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" style="height:20mm;">
|
|
<b>'.tr('Descrizione').':</b>
|
|
<p>'.($documento['descrizione']).'</p>
|
|
</td>
|
|
</tr>';
|
|
|
|
echo '
|
|
</table>';
|
|
|
|
$righe = $documento->getRighe();
|
|
|
|
if (!$righe->isEmpty()) {
|
|
echo '
|
|
<table class="table table-bordered">
|
|
<thead>
|
|
<tr>
|
|
<th colspan="4" class="text-center">
|
|
<b>'.tr('Materiale utilizzato e spese aggiuntive', [], ['upper' => true]).'</b>
|
|
</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<th style="font-size:8pt;width:50%" class="text-center">
|
|
<b>'.tr('Descrizione').'</b>
|
|
</th>
|
|
|
|
<th style="font-size:8pt;width:15%" class="text-center">
|
|
<b>'.tr('Q.tà').'</b>
|
|
</th>
|
|
|
|
<th style="font-size:8pt;width:15%" class="text-center">
|
|
<b>'.tr('Prezzo unitario').'</b>
|
|
</th>
|
|
|
|
<th style="font-size:8pt;width:20%" class="text-center">
|
|
<b>'.tr('Importo').'</b>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>';
|
|
|
|
foreach ($righe as $riga) {
|
|
if (setting('Formato ore in stampa') == 'Sessantesimi') {
|
|
if ($riga->um == 'ore') {
|
|
$qta = Translator::numberToHours($riga->qta);
|
|
} else {
|
|
$qta = Translator::numberToLocale($riga->qta, $d_qta);
|
|
}
|
|
} else {
|
|
$qta = Translator::numberToLocale($riga->qta, $d_qta);
|
|
}
|
|
// Articolo
|
|
echo '
|
|
<tr>
|
|
<td>
|
|
'.nl2br(strip_tags($riga->descrizione));
|
|
|
|
if ($riga->isArticolo()) {
|
|
// Codice articolo
|
|
$text = tr('COD. _COD_', [
|
|
'_COD_' => $riga->codice,
|
|
]);
|
|
echo '
|
|
<br><small>'.$text.'</small>';
|
|
|
|
// Seriali
|
|
$seriali = $riga->serials;
|
|
if (!empty($seriali)) {
|
|
$text = tr('SN').': '.implode(', ', $seriali);
|
|
echo '
|
|
<br><small>'.$text.'</small>';
|
|
}
|
|
}
|
|
|
|
echo '
|
|
</td>';
|
|
|
|
// Quantità
|
|
echo '
|
|
<td class="text-center">
|
|
'.$qta.' '.$riga->um.'
|
|
</td>';
|
|
|
|
// Prezzo unitario
|
|
echo '
|
|
<td class="text-center">
|
|
'.($options['pricing'] ? moneyFormat($riga->prezzo_unitario_corrente, $d_importi) : '-');
|
|
|
|
if ($options['pricing'] && $riga->sconto > 0) {
|
|
$text = discountInfo($riga, false);
|
|
|
|
echo '
|
|
<br><small class="text-muted">'.$text.'</small>';
|
|
}
|
|
|
|
echo '
|
|
</td>';
|
|
|
|
// Prezzo totale
|
|
echo '
|
|
<td class="text-center">
|
|
'.($options['pricing'] ? Translator::numberToLocale($riga->importo, $d_importi) : '-').'
|
|
</td>
|
|
</tr>';
|
|
}
|
|
|
|
echo '
|
|
</tbody>';
|
|
|
|
if ($options['pricing']) {
|
|
// Totale spese aggiuntive
|
|
echo '
|
|
<tr>
|
|
<td colspan="3" class="text-right">
|
|
<b>'.tr('Totale', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<th class="text-center">
|
|
<b>'.moneyFormat($righe->sum('importo'), $d_importi).'</b>
|
|
</th>
|
|
</tr>';
|
|
}
|
|
|
|
echo '
|
|
</table>';
|
|
}
|
|
|
|
// INTESTAZIONE ELENCO TECNICI
|
|
echo '
|
|
<table class="table table-bordered vertical-middle">
|
|
<thead>
|
|
<tr>
|
|
<th class="text-center" colspan="5" style="font-size:11pt;">
|
|
<b>'.tr('Ore tecnici', [], ['upper' => true]).'</b>
|
|
</th>
|
|
</tr>
|
|
<tr>
|
|
<th class="text-center" style="font-size:8pt;width:30%">
|
|
<b>'.tr('Tecnico').'</b>
|
|
</th>
|
|
|
|
<th class="text-center" colspan="3" style="font-size:8pt;width:35%">
|
|
<b>'.tr('Orario').'</b>
|
|
</th>
|
|
|
|
<td class="text-center" style="font-size:6pt;width:35%">
|
|
'.tr('I dati del ricevente verrano trattati in base alla normativa europea UE 2016/679 del 27 aprile 2016 (GDPR)').'
|
|
</td>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>';
|
|
|
|
// Sessioni di lavoro dei tecnici
|
|
$sessioni = $documento->sessioni->sortBy('orario_inizio');
|
|
foreach ($sessioni as $i => $sessione) {
|
|
echo '
|
|
<tr>';
|
|
// Nome tecnico
|
|
echo '
|
|
<td>
|
|
'.$sessione->anagrafica->ragione_sociale.'
|
|
('.$sessione->tipo->descrizione.')
|
|
</td>';
|
|
|
|
$inizio = new Carbon($sessione['orario_inizio']);
|
|
$fine = new Carbon($sessione['orario_fine']);
|
|
if ($inizio->isSameDay($fine)) {
|
|
$orario = timestampFormat($inizio).' - '.timeFormat($fine);
|
|
} else {
|
|
$orario = timestampFormat($inizio).' - '.timestampFormat($fine);
|
|
}
|
|
|
|
// Orario
|
|
echo '
|
|
<td class="text-center" colspan="3">
|
|
'.$orario.'
|
|
</td>';
|
|
|
|
// Spazio aggiuntivo
|
|
if ($i == 0) {
|
|
echo '
|
|
<td class="text-center" style="font-size:6pt;">
|
|
'.tr('Si dichiara che i lavori sono stati eseguiti ed i materiali installati nel rispetto delle vigenti normative tecniche').'
|
|
</td>';
|
|
} else {
|
|
echo '
|
|
<td class="text-center" style="border-bottom:0px;border-top:0px;"></td>';
|
|
}
|
|
|
|
echo '
|
|
</tr>';
|
|
}
|
|
|
|
// Ore lavorate
|
|
if (setting('Formato ore in stampa') == 'Sessantesimi') {
|
|
$ore_totali = Translator::numberToHours($documento->ore_totali);
|
|
} else {
|
|
$ore_totali = Translator::numberToLocale($documento->ore_totali, $d_importi);
|
|
}
|
|
|
|
echo '
|
|
<tr>
|
|
<td class="text-center">
|
|
<small>'.tr('Ore lavorate').':</small><br/><b>'.$ore_totali.'</b>
|
|
</td>';
|
|
|
|
// Costo totale manodopera
|
|
if ($options['pricing']) {
|
|
echo '
|
|
<td colspan="3" class="text-center">
|
|
<small>'.tr('Totale manodopera').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_manodopera'), 2).'</b>
|
|
</td>';
|
|
} else {
|
|
echo '
|
|
<td colspan="3" class="text-center">-</td>';
|
|
}
|
|
|
|
// Timbro e firma
|
|
$firma = !empty($documento['firma_file']) ? '<img src="'.base_dir().'/files/interventi/'.$documento['firma_file'].'" style="width:70mm;">' : '';
|
|
|
|
echo '
|
|
<td rowspan="2" class="text-center" style="font-size:8pt;height:30mm;vertical-align:bottom">
|
|
'.$firma.'<br>';
|
|
|
|
if (empty($documento['firma_file'])) {
|
|
echo ' <i>('.tr('Timbro e firma leggibile').')</i>';
|
|
} else {
|
|
echo ' <i>'.$documento['firma_nome'].'</i>';
|
|
}
|
|
|
|
echo '
|
|
</td>
|
|
</tr>';
|
|
|
|
// Totale km
|
|
echo '
|
|
<tr>
|
|
<td class="text-center">
|
|
<small>'.tr('Km percorsi').':</small><br/><b>'.Translator::numberToLocale($documento->km_totali, $d_qta).'</b>
|
|
</td>';
|
|
|
|
// Costo trasferta
|
|
if ($options['pricing']) {
|
|
echo '
|
|
<td class="text-center">
|
|
<small>'.tr('Costi di trasferta').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_viaggio'), $d_importi).'</b>
|
|
</td>';
|
|
} else {
|
|
echo '
|
|
<td class="text-center">-</td>';
|
|
}
|
|
|
|
// Diritto di chiamata
|
|
if ($options['pricing']) {
|
|
echo '
|
|
<td class="text-center" colspan="2" width="120px" >
|
|
<small>'.tr('Diritto di chiamata').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_diritto_chiamata'), $d_importi).'</b>
|
|
</td>';
|
|
} else {
|
|
echo '
|
|
<td class="text-center" colspan="2">-</td>';
|
|
}
|
|
|
|
// Calcoli
|
|
$imponibile = abs($documento->imponibile);
|
|
$sconto = $documento->sconto;
|
|
$totale_imponibile = abs($documento->totale_imponibile);
|
|
$totale_iva = abs($documento->iva);
|
|
$totale = abs($documento->totale);
|
|
$netto_a_pagare = abs($documento->netto);
|
|
|
|
$show_sconto = $sconto > 0;
|
|
|
|
// TOTALE COSTI FINALI
|
|
if ($options['pricing']) {
|
|
// Totale imponibile
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" class="text-right">
|
|
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<th class="text-center">
|
|
'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_importi).'
|
|
</th>
|
|
</tr>';
|
|
|
|
// Eventuale sconto totale
|
|
if ($show_sconto) {
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" class="text-right">
|
|
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<th class="text-center">
|
|
<b>'.moneyFormat($sconto, $d_importi).'</b>
|
|
</th>
|
|
</tr>';
|
|
|
|
// Totale imponibile
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" class="text-right">
|
|
<b>'.tr('Totale imponibile', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<th class="text-center">
|
|
<b>'.moneyFormat($totale_imponibile, $d_importi).'</b>
|
|
</th>
|
|
</tr>';
|
|
}
|
|
|
|
// IVA
|
|
// Totale intervento
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" class="text-right">
|
|
<b>'.tr('Iva', [], ['upper' => true]).':</b>
|
|
</td>
|
|
|
|
<th class="text-center">
|
|
<b>'.moneyFormat($totale_iva, $d_importi).'</b>
|
|
</th>
|
|
</tr>';
|
|
|
|
// TOTALE INTERVENTO
|
|
echo '
|
|
<tr>
|
|
<td colspan="4" class="text-right">
|
|
<b>'.tr('Totale intervento', [], ['upper' => true]).':</b>
|
|
</td>
|
|
<th class="text-center">
|
|
<b>'.moneyFormat($totale, $d_importi).'</b>
|
|
</th>
|
|
</tr>';
|
|
}
|
|
|
|
echo '
|
|
</table>';
|
|
|
|
if ($options['checklist']) {
|
|
$structure = Modules::get('Interventi');
|
|
$checks = $structure->mainChecks($id_record);
|
|
|
|
if (!empty($checks)) {
|
|
echo '
|
|
<pagebreak class="page-break-after" />
|
|
<table class="table table-bordered vertical-middle">
|
|
<tr>
|
|
<th class="text-center" colspan="2" style="font-size:11pt;">
|
|
<b>CHECKLIST</b>
|
|
</th>
|
|
</tr>';
|
|
|
|
$structure = Modules::get('Interventi');
|
|
$checks = $structure->mainChecks($id_record);
|
|
|
|
foreach ($checks as $check) {
|
|
echo renderChecklistHtml($check);
|
|
}
|
|
|
|
echo '
|
|
</table>';
|
|
}
|
|
}
|