This commit is contained in:
Beppe 2021-12-21 10:38:45 +01:00
commit 322656fce5
10 changed files with 510 additions and 186 deletions

View File

@ -86,9 +86,10 @@ $disabled = empty($result['idarticolo']);
echo '
<div class="row '.(!empty($options['nascondi_prezzi']) ? 'hidden' : '').'" id="prezzi_articolo">
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezziacquisto\').toggleClass(\'hide\'); $(\'#prezziacquisto\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezziacquisto\').toggleClass(\'hide\'); $(\'#prezziacquisto\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&limit=5".'\');">
<i class="fa fa-shopping-cart"></i> '.tr('Ultimi prezzi di acquisto').'
</button>
<br>
<div id="prezziacquisto" class="hide"></div>
</div>
@ -100,9 +101,10 @@ echo '
</div>
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzivendita\').toggleClass(\'hide\'); $(\'#prezzivendita\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzivendita\').toggleClass(\'hide\'); $(\'#prezzivendita\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&limit=5".'\');">
<i class="fa fa-money"></i> '.tr('Ultimi prezzi di vendita').'
</button>
<br>
<div id="prezzivendita" class="hide"></div>
</div>
</div>

View File

@ -20,6 +20,7 @@
include_once __DIR__.'/../../../core.php';
$idarticolo = get('idarticolo');
$limit = get('limit');
switch ($resource) {
// Legge gli ultimi prezzi di vendita di un determinato cliente e un determinato articolo e li visualizza per suggerire il prezzo di vendita
@ -61,10 +62,10 @@ switch ($resource) {
// Ultime 5 vendite totali
$documenti = $dbo->fetchArray('SELECT iddocumento AS id, "Fattura" AS tipo, "Fatture di vendita" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM co_documenti WHERE id=iddocumento) AS n_documento, (SELECT numero_esterno FROM co_documenti WHERE id=iddocumento) AS n2_documento, (SELECT data FROM co_documenti WHERE id=iddocumento) AS data_documento FROM co_righe_documenti WHERE idarticolo='.prepare($idarticolo).' AND iddocumento IN(SELECT id FROM co_documenti WHERE idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir="entrata"))
UNION
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di vendita" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="entrata")) LIMIT 0,5');
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di vendita" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="entrata")) LIMIT 0,'.$limit.'');
if (sizeof($documenti) > 0) {
echo "<br/><table class='table table-striped table-bordered table-extra-condensed' >\n";
echo "<table class='table table-striped table-bordered table-extra-condensed' >\n";
echo "<tr><th width='180'>Documento</th>\n";
echo "<th width='100' class='text-right' >Totale</th></tr>\n";
@ -78,7 +79,7 @@ switch ($resource) {
}
echo "</table>\n";
} else {
echo '<br/>'.tr('Nessuna vendita trovata di questo articolo')."...<br/>\n";
echo ''.tr('Nessuna vendita trovata di questo articolo')."...<br/>\n";
}
break;
@ -89,10 +90,10 @@ switch ($resource) {
// Ultimi 5 acquisti totali
$documenti = $dbo->fetchArray('SELECT iddocumento AS id, "Fattura" AS tipo, "Fatture di acquisto" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM co_documenti WHERE id=iddocumento) AS n_documento, (SELECT numero_esterno FROM co_documenti WHERE id=iddocumento) AS n2_documento, (SELECT data FROM co_documenti WHERE id=iddocumento) AS data_documento FROM co_righe_documenti WHERE idarticolo='.prepare($idarticolo).' AND iddocumento IN(SELECT id FROM co_documenti WHERE idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir="uscita"))
UNION
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di acquisto" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="uscita")) LIMIT 0,5');
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di acquisto" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="uscita")) LIMIT 0,'.$limit.'');
if (sizeof($documenti) > 0) {
echo "<br/><table class='table table-striped table-bordered table-extra-condensed' >\n";
echo "<table class='table table-striped table-bordered table-extra-condensed' >\n";
echo "<tr><th width='180'>Documento</th>\n";
echo "<th width='100' class='text-right' >Totale</th></tr>\n";
@ -106,7 +107,7 @@ switch ($resource) {
}
echo "</table>\n";
} else {
echo '<br/>'.tr('Nessun acquisto trovato di questo articolo')."...<br/>\n";
echo ''.tr('Nessun acquisto trovato di questo articolo')."...<br/>\n";
}
break;

View File

@ -261,6 +261,44 @@ echo '
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
<?php echo tr('Ultimi 20 prezzi di acquisto'); ?>
</h3>
</div>
<div class="panel-body">
<div class="clearfix"></div>
<div class="row">
<div class="col-md-12" id="prezziacquisto"></div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
<?php echo tr('Ultimi 20 prezzi di vendita'); ?>
</h3>
</div>
<div class="panel-body">
<div class="clearfix"></div>
<div class="row">
<div class="col-md-12" id="prezzivendita"></div>
</div>
</div>
</div>
</div>
</div>
</form>
@ -379,5 +417,9 @@ $(document).ready(function(){
if(input('id_fornitore').get()){
input('prezzo_acquisto').disable();
}
$("#prezziacquisto").load("<?php echo base_path(); ?>/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo="+ <?php echo $id_record; ?> + "&limit=20");
$("#prezzivendita").load("<?php echo base_path(); ?>/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo="+ <?php echo $id_record; ?> + "&limit=20");
});
</script>

View File

@ -67,6 +67,16 @@ switch (filter('op')) {
break;
case 'remove-variante':
$id_articolo = filter('id_articolo');
$database->delete('mg_articolo_attributo', ['id_articolo' => $id_articolo]);
$database->update('mg_articoli', ['id_combinazione' => null], ['id' => $id_articolo]);
flash()->info(tr('Variante rimossa correttamente!'));
break;
case 'genera-varianti':
$combinazione->generaTutto();

View File

@ -67,7 +67,7 @@ echo '
<th width="10%">'.tr('Foto').'</th>
<th>'.tr('Variante').'</th>
<th>'.tr('Articolo').'</th>
<th class="text-center">'.tr('#').'</th>
<th class="text-center" width="13%"></th>
</tr>
</thead>
@ -82,7 +82,10 @@ foreach ($articoli as $articolo) {
<td>'.Modules::link('Articoli', $articolo->id, $articolo->codice.' - '.$articolo->descrizione).'</td>
<td class="text-center">
<button type="button" class="btn btn-warning btn-xs" onclick="modificaVariante('.$articolo->id.')">
<i class="fa fa-edit"></i>
<i class="fa fa-edit"></i> '.tr('Modifica').'
</button>
<button type="button" class="btn btn-danger btn-xs" onclick="rimuoviVariante('.$articolo->id.')">
<i class="fa fa-remove"></i> '.tr('Rimuovi').'
</button>
</td>
</tr>';
@ -109,6 +112,12 @@ function modificaVariante(id) {
openModal("'.tr('Modifica variante').'", "'.$module->fileurl('edit-variante.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&id_articolo=" + id);
}
function rimuoviVariante(id) {
if( confirm(\'Rimuovere la variante dalla combinazione?\') ){
$.post( \''.base_path().'/modules/combinazioni_articoli/actions.php\', { op: \'remove-variante\', id_articolo: + id }, function(data){ location.href=\''.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'\'; } );
}
}
function generaVarianti(button) {
// Redirect
redirect(globals.rootdir + "/editor.php", {

View File

@ -29,11 +29,10 @@ if (!empty($interventi)) {
<table class="table table-bordered table-condensed">
<tr>
<th>'.tr('Attività').'</th>
<th width="100">'.tr('Ore').'</th>
<th width="100">'.tr('Km').'</th>
<th width="120">'.tr('Costo').'</th>
<th width="120">'.tr('Addebito').'</th>
<th width="120">'.tr('Tot. scontato').'</th>
<th width="125">'.tr('Ore').'</th>
<th width="125">'.tr('Km').'</th>
<th width="145">'.tr('Costo').'</th>
<th width="145">'.tr('Tot. scontato').'</th>
</tr>';
// Tabella con i dati
@ -63,10 +62,6 @@ if (!empty($interventi)) {
'.moneyFormat($intervento->spesa).'
</td>
<td class="text-right">
'.moneyFormat($intervento->imponibile).'
</td>
<td class="text-right">
'.moneyFormat($intervento->totale_imponibile).'
</td>
@ -75,7 +70,7 @@ if (!empty($interventi)) {
// Riga con dettagli
echo '
<tr class="hide" id="dettagli_'.$intervento->id.'">
<td colspan="6">';
<td colspan="5">';
// Lettura sessioni di lavoro
$sessioni = $intervento->sessioni;
@ -84,15 +79,15 @@ if (!empty($interventi)) {
<table class="table table-striped table-condensed table-bordered">
<tr>
<th>'.tr('Tecnico').'</th>
<th width="230">'.tr('Tipo attività').'</th>
<th width="120">'.tr('Ore').'</th>
<th width="120">'.tr('Km').'</th>
<th width="120">'.tr('Costo ore').'</th>
<th width="120">'.tr('Costo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="120">'.tr('Prezzo ore').'</th>
<th width="120">'.tr('Prezzo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="210">'.tr('Tipo attività').'</th>
<th width="110">'.tr('Ore').'</th>
<th width="110">'.tr('Km').'</th>
<th width="110">'.tr('Costo ore').'</th>
<th width="110">'.tr('Costo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
<th width="110">'.tr('Prezzo ore').'</th>
<th width="110">'.tr('Prezzo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
</tr>';
foreach ($sessioni as $sessione) {
@ -113,6 +108,23 @@ if (!empty($interventi)) {
<td class="text-right success">'.moneyFormat($sessione->prezzo_viaggio).$sconto_km.'</td>
<td class="text-right success">'.moneyFormat($sessione->prezzo_diritto_chiamata).'</td>
</tr>';
// Raggruppamento per tipologia descrizione
$tipologie[$sessione->tipo->descrizione]['ore'] += $sessione->ore;
$tipologie[$sessione->tipo->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$tipologie[$sessione->tipo->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
// 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 - $sessione->sconto_totale_viaggio;
// Raggruppamento per stato intervento
$stati_intervento[$intervento->stato->descrizione]['colore'] = $intervento->stato->colore;
$stati_intervento[$intervento->stato->descrizione]['ore'] += $sessione->ore;
$stati_intervento[$intervento->stato->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$stati_intervento[$intervento->stato->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
}
echo '
@ -143,6 +155,10 @@ if (!empty($interventi)) {
<td class="text-right danger">'.moneyFormat($articolo->spesa).'</td>
<td class="text-right success">'.moneyFormat($articolo->imponibile).$sconto.'</td>
</tr>';
// Raggruppamento per categoria articolo
$materiali[$articolo->articolo->categoria->nome]['costo'] += $articolo->spesa;
$materiali[$articolo->articolo->categoria->nome]['ricavo'] += $articolo->imponibile - $articolo->sconto;
}
echo '
@ -213,47 +229,11 @@ if (!empty($interventi)) {
<big><b>'.moneyFormat($totale_costo).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale_addebito).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale).'</b></big>
</td>
</tr>';
$stati = $interventi->groupBy('idstatointervento');
if (count($stati) > 0) {
// Totali per stato
echo '
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
echo '
<tr>
<td colspan="3"></td>
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
}
}
echo '
</tr>
</table>';
}
@ -330,8 +310,114 @@ if (empty($totale_ore_contratto)) {
<p>'.tr('Per monitorare il consumo ore, inserisci almeno una riga con unità di misura "ore"').'.</p>
</div>';
}
echo '
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tipologia').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tipologie);
foreach ($tipologie as $key => $tipologia){
$margine = $tipologia['ricavo'] - $tipologia['costo'];
$margine_prc = ($tipologia['ricavo'] && $tipologia['costo']) ? (int)((($tipologia['ricavo'] / $tipologia['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
echo '
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tecnici').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="7%">'.tr('km').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tecnici);
foreach ($tecnici as $key => $tecnico){
$margine = $tecnico['ricavo'] - $tecnico['costo'];
$margine_prc = ($tecnico['ricavo'] && $tecnico['costo']) ? (int)((($tecnico['ricavo'] / $tecnico['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ore']).'</td>
<td class="text-right">'.(int)$tecnico['km'].'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Stato').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($stati_intervento);
foreach ($stati_intervento as $key => $stato){
$margine = $stato['ricavo'] - $stato['costo'];
$margine_prc = ($stato['ricavo'] && $stato['costo']) ? (int)((($stato['ricavo'] / $stato['costo']) - 1) * 100) : 100;
echo '
<tr>
<td><div class="img-circle" style="width:18px; height:18px; position:relative; bottom:-2px; background:'.$stato['colore'].'; float:left;"></div> '.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($stato['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($stato['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($stato['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Materiale').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($materiali);
foreach ($materiali as $key => $materiale){
$margine = $materiale['ricavo'] - $materiale['costo'];
$margine_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int)((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($materiale['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($materiale['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
</div>';
/*

View File

@ -31,7 +31,7 @@ $numero_previsto = verifica_numero_intervento($intervento);
if (!empty($numero_previsto) && intval((setting('Verifica numero intervento')))) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.tr("E' assente una attività di numero _NUM_ in data precedente o corrispondente a _DATE_: potrebbero esserci un errore di continuità con la numerazione corrente delle attività", [
<i class="fa fa-warning"></i> '.tr("E' assente una attività di numero _NUM_ in data precedente o corrispondente a _DATE_: potrebbero esserci alcuni errori di continuità con la numerazione delle attività", [
'_DATE_' => dateFormat($intervento->data_richiesta),
'_NUM_' => '"'.$numero_previsto.'"',
]).'.</b>

View File

@ -21,8 +21,6 @@ include_once __DIR__.'/../../../core.php';
use Modules\Interventi\Intervento;
// CONSUNTIVO
// Tabella con riepilogo interventi
$interventi = Intervento::where('id_ordine', $id_record)->get();
if (!empty($interventi)) {
@ -30,11 +28,10 @@ if (!empty($interventi)) {
<table class="table table-bordered table-condensed">
<tr>
<th>'.tr('Attività').'</th>
<th width="100">'.tr('Ore').'</th>
<th width="100">'.tr('Km').'</th>
<th width="120">'.tr('Costo').'</th>
<th width="120">'.tr('Addebito').'</th>
<th width="120">'.tr('Tot. scontato').'</th>
<th width="125">'.tr('Ore').'</th>
<th width="125">'.tr('Km').'</th>
<th width="145">'.tr('Costo').'</th>
<th width="145">'.tr('Tot. scontato').'</th>
</tr>';
// Tabella con i dati
@ -62,10 +59,6 @@ if (!empty($interventi)) {
'.moneyFormat($intervento->spesa).'
</td>
<td class="text-right">
'.moneyFormat($intervento->imponibile).'
</td>
<td class="text-right">
'.moneyFormat($intervento->totale_imponibile).'
</td>
@ -74,7 +67,7 @@ if (!empty($interventi)) {
// Riga con dettagli
echo '
<tr class="hide" id="dettagli_'.$intervento->id.'">
<td colspan="6">';
<td colspan="5">';
// Lettura sessioni di lavoro
$sessioni = $intervento->sessioni;
@ -83,15 +76,15 @@ if (!empty($interventi)) {
<table class="table table-striped table-condensed table-bordered">
<tr>
<th>'.tr('Tecnico').'</th>
<th width="230">'.tr('Tipo attività').'</th>
<th width="120">'.tr('Ore').'</th>
<th width="120">'.tr('Km').'</th>
<th width="120">'.tr('Costo ore').'</th>
<th width="120">'.tr('Costo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="120">'.tr('Prezzo ore').'</th>
<th width="120">'.tr('Prezzo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="210">'.tr('Tipo attività').'</th>
<th width="110">'.tr('Ore').'</th>
<th width="110">'.tr('Km').'</th>
<th width="110">'.tr('Costo ore').'</th>
<th width="110">'.tr('Costo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
<th width="110">'.tr('Prezzo ore').'</th>
<th width="110">'.tr('Prezzo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
</tr>';
foreach ($sessioni as $sessione) {
@ -112,6 +105,23 @@ if (!empty($interventi)) {
<td class="text-right success">'.moneyFormat($sessione->prezzo_viaggio).$sconto_km.'</td>
<td class="text-right success">'.moneyFormat($sessione->prezzo_diritto_chiamata).'</td>
</tr>';
// Raggruppamento per tipologia descrizione
$tipologie[$sessione->tipo->descrizione]['ore'] += $sessione->ore;
$tipologie[$sessione->tipo->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$tipologie[$sessione->tipo->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
// 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 - $sessione->sconto_totale_viaggio;
// Raggruppamento per stato intervento
$stati_intervento[$intervento->stato->descrizione]['colore'] = $intervento->stato->colore;
$stati_intervento[$intervento->stato->descrizione]['ore'] += $sessione->ore;
$stati_intervento[$intervento->stato->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$stati_intervento[$intervento->stato->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
}
echo '
@ -142,6 +152,10 @@ if (!empty($interventi)) {
<td class="text-right danger">'.moneyFormat($articolo->spesa).'</td>
<td class="text-right success">'.moneyFormat($articolo->imponibile).$sconto.'</td>
</tr>';
// Raggruppamento per categoria articolo
$materiali[$articolo->articolo->categoria->nome]['costo'] += $articolo->spesa;
$materiali[$articolo->articolo->categoria->nome]['ricavo'] += $articolo->imponibile - $articolo->sconto;
}
echo '
@ -184,11 +198,11 @@ if (!empty($interventi)) {
}
$array_interventi = $interventi->toArray();
$totale_ore = sum(array_column($array_interventi, 'ore_totali'));
$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 '
@ -212,47 +226,11 @@ if (!empty($interventi)) {
<big><b>'.moneyFormat($totale_costo).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale_addebito).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale).'</b></big>
</td>
</tr>';
$stati = $interventi->groupBy('idstatointervento');
if (count($stati) > 0) {
// Totali per stato
echo '
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
echo '
<tr>
<td colspan="3"></td>
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
}
}
echo '
</tr>
</table>';
}
@ -277,6 +255,114 @@ if ($diff > 0) {
echo '
</b></big></span>
<br><br>
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tipologia').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tipologie);
foreach ($tipologie as $key => $tipologia){
$margine = $tipologia['ricavo'] - $tipologia['costo'];
$margine_prc = ($tipologia['ricavo'] && $tipologia['costo']) ? (int)((($tipologia['ricavo'] / $tipologia['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tecnici').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="7%">'.tr('km').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tecnici);
foreach ($tecnici as $key => $tecnico){
$margine = $tecnico['ricavo'] - $tecnico['costo'];
$margine_prc = ($tecnico['ricavo'] && $tecnico['costo']) ? (int)((($tecnico['ricavo'] / $tecnico['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ore']).'</td>
<td class="text-right">'.(int)$tecnico['km'].'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Stato').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($stati_intervento);
foreach ($stati_intervento as $key => $stato){
$margine = $stato['ricavo'] - $stato['costo'];
$margine_prc = ($stato['ricavo'] && $stato['costo']) ? (int)((($stato['ricavo'] / $stato['costo']) - 1) * 100) : 100;
echo '
<tr>
<td><div class="img-circle" style="width:18px; height:18px; position:relative; bottom:-2px; background:'.$stato['colore'].'; float:left;"></div> '.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($stato['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($stato['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($stato['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Materiale').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($materiali);
foreach ($materiali as $key => $materiale){
$margine = $materiale['ricavo'] - $materiale['costo'];
$margine_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int)((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($materiale['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($materiale['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
</div>';
/*

View File

@ -21,8 +21,6 @@ include_once __DIR__.'/../../../core.php';
use Modules\Interventi\Intervento;
// CONSUNTIVO
// Tabella con riepilogo interventi
$interventi = Intervento::where('id_preventivo', $id_record)->get();
if (!empty($interventi)) {
@ -30,11 +28,10 @@ if (!empty($interventi)) {
<table class="table table-bordered table-condensed">
<tr>
<th>'.tr('Attività').'</th>
<th width="100">'.tr('Ore').'</th>
<th width="100">'.tr('Km').'</th>
<th width="120">'.tr('Costo').'</th>
<th width="120">'.tr('Addebito').'</th>
<th width="120">'.tr('Tot. scontato').'</th>
<th width="125">'.tr('Ore').'</th>
<th width="125">'.tr('Km').'</th>
<th width="145">'.tr('Costo').'</th>
<th width="145">'.tr('Tot. scontato').'</th>
</tr>';
// Tabella con i dati
@ -62,10 +59,6 @@ if (!empty($interventi)) {
'.moneyFormat($intervento->spesa).'
</td>
<td class="text-right">
'.moneyFormat($intervento->imponibile).'
</td>
<td class="text-right">
'.moneyFormat($intervento->totale_imponibile).'
</td>
@ -74,7 +67,7 @@ if (!empty($interventi)) {
// Riga con dettagli
echo '
<tr class="hide" id="dettagli_'.$intervento->id.'">
<td colspan="6">';
<td colspan="5">';
// Lettura sessioni di lavoro
$sessioni = $intervento->sessioni;
@ -83,15 +76,15 @@ if (!empty($interventi)) {
<table class="table table-striped table-condensed table-bordered">
<tr>
<th>'.tr('Tecnico').'</th>
<th width="230">'.tr('Tipo attività').'</th>
<th width="120">'.tr('Ore').'</th>
<th width="120">'.tr('Km').'</th>
<th width="120">'.tr('Costo ore').'</th>
<th width="120">'.tr('Costo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="120">'.tr('Prezzo ore').'</th>
<th width="120">'.tr('Prezzo km').'</th>
<th width="120">'.tr('Diritto ch.').'</th>
<th width="210">'.tr('Tipo attività').'</th>
<th width="110">'.tr('Ore').'</th>
<th width="110">'.tr('Km').'</th>
<th width="110">'.tr('Costo ore').'</th>
<th width="110">'.tr('Costo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
<th width="110">'.tr('Prezzo ore').'</th>
<th width="110">'.tr('Prezzo km').'</th>
<th width="110">'.tr('Diritto ch.').'</th>
</tr>';
foreach ($sessioni as $sessione) {
@ -112,6 +105,23 @@ if (!empty($interventi)) {
<td class="text-right success">'.moneyFormat($sessione->prezzo_viaggio).$sconto_km.'</td>
<td class="text-right success">'.moneyFormat($sessione->prezzo_diritto_chiamata).'</td>
</tr>';
// Raggruppamento per tipologia descrizione
$tipologie[$sessione->tipo->descrizione]['ore'] += $sessione->ore;
$tipologie[$sessione->tipo->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$tipologie[$sessione->tipo->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
// 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 - $sessione->sconto_totale_viaggio;
// Raggruppamento per stato intervento
$stati_intervento[$intervento->stato->descrizione]['colore'] = $intervento->stato->colore;
$stati_intervento[$intervento->stato->descrizione]['ore'] += $sessione->ore;
$stati_intervento[$intervento->stato->descrizione]['costo'] += $sessione->costo_manodopera + $sessione->costo_viaggio + $sessione->costo_diritto_chiamata;
$stati_intervento[$intervento->stato->descrizione]['ricavo'] += $sessione->prezzo_manodopera - $sessione->sconto_totale_manodopera + $sessione->prezzo_viaggio - $sessione->sconto_totale_viaggio + $sessione->prezzo_diritto_chiamata - $sessione->sconto_totale_viaggio;
}
echo '
@ -142,6 +152,10 @@ if (!empty($interventi)) {
<td class="text-right danger">'.moneyFormat($articolo->spesa).'</td>
<td class="text-right success">'.moneyFormat($articolo->imponibile).$sconto.'</td>
</tr>';
// Raggruppamento per categoria articolo
$materiali[$articolo->articolo->categoria->nome]['costo'] += $articolo->spesa;
$materiali[$articolo->articolo->categoria->nome]['ricavo'] += $articolo->imponibile - $articolo->sconto;
}
echo '
@ -184,11 +198,11 @@ if (!empty($interventi)) {
}
$array_interventi = $interventi->toArray();
$totale_ore = sum(array_column($array_interventi, 'ore_totali'));
$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 '
@ -212,47 +226,11 @@ if (!empty($interventi)) {
<big><b>'.moneyFormat($totale_costo).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale_addebito).'</b></big>
</td>';
echo '
<td class="text-right">
<big><b>'.moneyFormat($totale).'</b></big>
</td>
</tr>';
$stati = $interventi->groupBy('idstatointervento');
if (count($stati) > 0) {
// Totali per stato
echo '
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
echo '
<tr>
<td colspan="3"></td>
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
}
}
echo '
</tr>
</table>';
}
@ -277,6 +255,114 @@ if ($diff > 0) {
echo '
</b></big></span>
<br><br>
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tipologia').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tipologie);
foreach ($tipologie as $key => $tipologia){
$margine = $tipologia['ricavo'] - $tipologia['costo'];
$margine_prc = ($tipologia['ricavo'] && $tipologia['costo']) ? (int)((($tipologia['ricavo'] / $tipologia['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($tipologia['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tipologia['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Tecnici').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="7%">'.tr('km').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($tecnici);
foreach ($tecnici as $key => $tecnico){
$margine = $tecnico['ricavo'] - $tecnico['costo'];
$margine_prc = ($tecnico['ricavo'] && $tecnico['costo']) ? (int)((($tecnico['ricavo'] / $tecnico['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ore']).'</td>
<td class="text-right">'.(int)$tecnico['km'].'</td>
<td class="text-right">'.Translator::numberToLocale($tecnico['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($tecnico['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
<div class="row">
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Stato').'</th>
<th width="10%">'.tr('Ore').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($stati_intervento);
foreach ($stati_intervento as $key => $stato){
$margine = $stato['ricavo'] - $stato['costo'];
$margine_prc = ($stato['ricavo'] && $stato['costo']) ? (int)((($stato['ricavo'] / $stato['costo']) - 1) * 100) : 100;
echo '
<tr>
<td><div class="img-circle" style="width:18px; height:18px; position:relative; bottom:-2px; background:'.$stato['colore'].'; float:left;"></div> '.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($stato['ore']).'</td>
<td class="text-right">'.Translator::numberToLocale($stato['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($stato['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
<div class="col-md-6">
<table class="table text-left table-striped table-bordered">
<tr>
<th>'.tr('Materiale').'</th>
<th width="16%">'.tr('Costo').'</th>
<th width="16%">'.tr('Ricavo').'</th>
<th width="23%">'.tr('Margine').'</th>
</tr>';
ksort($materiali);
foreach ($materiali as $key => $materiale){
$margine = $materiale['ricavo'] - $materiale['costo'];
$margine_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int)((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
echo '
<tr>
<td>'.$key.'</td>
<td class="text-right">'.Translator::numberToLocale($materiale['costo']).' </td>
<td class="text-right">'.Translator::numberToLocale($materiale['ricavo']).' </td>
<td class="text-right '.($margine>0 ? 'bg-success' : 'bg-danger').'">'.Translator::numberToLocale($margine).' ('.$margine_prc.'%)</td>
</tr>';
}
echo '
</table>
</div>
</div>
</div>';
/*

View File

@ -4,6 +4,7 @@ return [
'an_anagrafiche',
'an_anagrafiche_agenti',
'an_nazioni',
'an_mansioni',
'an_referenti',
'an_relazioni',
'an_sedi',
@ -54,6 +55,7 @@ return [
'em_accounts',
'em_templates',
'em_newsletters',
'em_mansioni_template',
'em_lists',
'em_list_receiver',
'em_emails',