diff --git a/include/common/descrizione.php b/include/common/descrizione.php index f51418cda..0dee7d76c 100755 --- a/include/common/descrizione.php +++ b/include/common/descrizione.php @@ -31,3 +31,12 @@ echo ' {[ "type": "textarea", "label": "'.tr('Note interne').'", "name": "note", "value": '.json_encode($result['note']).', "help": "'.tr('Queste note saranno utilizzate solo a scopo interno').'", "extra": "rows=\"2\"" ]} '; + +if ($module['name'] == 'Preventivi' && $options['op'] == 'manage_descrizione') { + echo ' +
+
+ {[ "type": "checkbox", "label": "'.tr('Utilizza come titolo del gruppo').'", "name": "is_titolo", "value": '.json_encode($result['is_titolo']).', "help": "'.tr('').'" ]} +
+
'; +} \ No newline at end of file diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 049fad0f2..0b447277f 100755 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -324,6 +324,7 @@ switch (post('op')) { $riga->descrizione = post('descrizione'); $riga->note = post('note'); + $riga->is_titolo = post('is_titolo'); $riga->save(); if (post('idriga') != null) { diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php index e2e9dceff..6509aef78 100755 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -55,11 +55,27 @@ echo ' $today = new Carbon\Carbon(); $today = $today->startOfDay(); $num = 0; -foreach ($righe as $riga) { +$has_gruppo = false; +$subtotale_gruppo = 0; +$iva_gruppo = 0; +$color_gruppo = '#BDDEE1;'; +foreach ($righe as $key => $riga) { + // Gestione gruppo + $style_titolo = ''; + $colspan_titolo = ''; + if ($riga->is_titolo) { + $subtotale_gruppo = 0; + $iva_gruppo = 0; + $has_gruppo = true; + $style_titolo = 'style="background-color:'.$color_gruppo.'"'; + $colspan_titolo = 'colspan="6"'; + } + $subtotale_gruppo += $riga->totale_imponibile; + $iva_gruppo += $riga->iva; ++$num; echo ' - + '; if (!$block_edit) { echo ' @@ -72,7 +88,7 @@ foreach ($righe as $riga) { '.$num.' - '; + '; // Aggiunta dei riferimenti ai documenti if ($riga->hasOriginalComponent()) { @@ -132,78 +148,82 @@ foreach ($righe as $riga) { $info_evasione = ' '.Translator::dateToLocale($riga->data_evasione).$ora_evasione.''; } - echo ' - - '.$info_evasione.' - '; + if (!$riga->is_titolo) { + if ($riga->isDescrizione()) { + echo ' + + + + + '; + } else { + // Info evasione + echo ' + + '.$info_evasione.' + '; - if ($riga->isDescrizione()) { - echo ' - - - - '; - } else { - // Quantità e unità di misura - echo ' - - {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'>confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'>", "icon-after": " numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' ", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.$block_edit.'" ]} -
'; - // Visualizzazione evasione righe per documento - $evasione_bar = []; - $evasione_bar['dt_righe_ddt'] = 'info'; - $evasione_bar['co_righe_documenti'] = 'primary'; - $evasione_bar['in_righe_interventi'] = 'warning'; - $evasione_bar['or_righe_ordini'] = 'success'; - foreach ($evasione_bar as $table => $color) { - $righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get(); - $perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta; - if ($perc_ev > 0) { - echo ' -
'; + // Quantità e unità di misura + echo ' + + {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'>confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'>", "icon-after": " numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' ", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.$block_edit.'" ]} +
'; + // Visualizzazione evasione righe per documento + $evasione_bar = []; + $evasione_bar['dt_righe_ddt'] = 'info'; + $evasione_bar['co_righe_documenti'] = 'primary'; + $evasione_bar['in_righe_interventi'] = 'warning'; + $evasione_bar['or_righe_ordini'] = 'success'; + foreach ($evasione_bar as $table => $color) { + $righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get(); + $perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta; + if ($perc_ev > 0) { + echo ' +
'; + } } - } - echo ' -
- '; + echo ' +
+ '; - // Prezzi unitari - echo ' - '; - // Provvigione riga - if (abs($riga->provvigione_unitaria) > 0) { - $text = provvigioneInfo($riga); - echo ''; - } - echo moneyFormat($riga->prezzo_unitario_corrente); + // Prezzi unitari + echo ' + '; + // Provvigione riga + if (abs($riga->provvigione_unitaria) > 0) { + $text = provvigioneInfo($riga); + echo ''; + } + echo moneyFormat($riga->prezzo_unitario_corrente); - if (abs($riga->sconto_unitario) > 0) { - $text = discountInfo($riga); + if (abs($riga->sconto_unitario) > 0) { + $text = discountInfo($riga); + + echo ' +
'.$text.''; + } echo ' -
'.$text.''; - } + '; - echo ' - '; + // Sconto unitario + if (!$block_edit) { + echo ' + + {[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]} + '; + } - // Sconto unitario - if (!$block_edit) { + // Importo echo ' - - {[ "type": "number", "name": "sconto_'.$riga->id.'", "value": "'.($riga->sconto_percentuale ?: $riga->sconto_unitario_corrente).'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "choice|untprc|'.$riga->tipo_sconto.'" ]} - '; + + '.moneyFormat($riga->importo); + + // Iva + echo ' +
'.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).' + '; } - - // Importo - echo ' - - '.moneyFormat($riga->importo); - - // Iva - echo ' -
'.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).' - '; } // Possibilità di rimuovere una riga solo se il preventivo non è stato pagato @@ -230,6 +250,40 @@ foreach ($righe as $riga) { echo ' '; + + $next = $righe->flatten()[$num]; + if ($has_gruppo && ($next->is_titolo || $next == null)) { + echo ' + + + '.tr('Subtotale', [], ['upper' => true]).': + + + '.moneyFormat($subtotale_gruppo, 2).' + + + + + + + '.tr('Iva', [], ['upper' => true]).': + + + '.moneyFormat($iva_gruppo, 2).' + + + + + + + '.tr('Subtotale ivato', [], ['upper' => true]).': + + + '.moneyFormat($subtotale_gruppo + $iva_gruppo, 2).' + + + '; + } } echo ' diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index 7e21e8204..d5f5c312f 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -171,8 +171,8 @@ echo " if ($options['pricing']) { echo " ".tr('Prezzo unitario', [], ['upper' => true])." - ".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true]))." - ".tr('IVA', [], ['upper' => true]).' (%)'; + ".tr('IVA', [], ['upper' => true])." (%) + ".($options['hide-total'] ? tr('Importo ivato', [], ['upper' => true]) : tr('Importo', [], ['upper' => true])).""; } echo ' @@ -182,10 +182,28 @@ echo ' '; $num = 0; -foreach ($righe as $riga) { +$has_gruppo = false; +$subtotale_gruppo = 0; +$iva_gruppo = 0; +foreach ($righe as $key => $riga) { ++$num; $r = $riga->toArray(); + // Gestione gruppo + $style_titolo = ''; + $colspan_titolo = ''; + if ($riga->is_titolo) { + $subtotale_gruppo = 0; + $iva_gruppo = 0; + $has_gruppo = true; + $colspan_titolo = $options['pricing'] ? 'colspan="5"' : 'colspan="2"'; + $descrizione = ''.nl2br($r['descrizione']).''; + } else { + $descrizione = nl2br($r['descrizione']); + } + $subtotale_gruppo += $riga->totale_imponibile; + $iva_gruppo += $riga->iva; + $autofill->count($r['descrizione']); echo ' @@ -209,8 +227,8 @@ foreach ($righe as $riga) { } echo ' - - '.nl2br($r['descrizione']); + + '.$descrizione; if ($riga->isArticolo()) { if ($options['hide-item-number']) { @@ -231,51 +249,53 @@ foreach ($righe as $riga) { echo ' '; - if (!$riga->isDescrizione()) { - echo ' - - '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].' - '; - - if ($options['pricing']) { - // Prezzo unitario + if (!$riga->is_titolo) { + if (!$riga->isDescrizione()) { echo ' - - '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); + + '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].' + '; - if ($riga->sconto > 0) { - $text = discountInfo($riga, false); + if ($options['pricing']) { + // Prezzo unitario + echo ' + + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); + + if ($riga->sconto > 0) { + $text = discountInfo($riga, false); + + echo ' +
'.$text.''; + + $autofill->count($text, true); + } echo ' -
'.$text.''; + '; - $autofill->count($text, true); + // Iva + echo ' + + '.Translator::numberToLocale($riga->aliquota->percentuale, 2).' + '; + + // Imponibile + echo ' + + '.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).' + '; } - + } else { echo ' - '; + '; - // Imponibile - echo ' - - '.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).' - '; - - // Iva - echo ' - - '.Translator::numberToLocale($riga->aliquota->percentuale, 2).' - '; - } - } else { - echo ' - '; - - if ($options['pricing']) { - echo ' - - - '; + if ($options['pricing']) { + echo ' + + + '; + } } } @@ -283,6 +303,41 @@ foreach ($righe as $riga) { '; $autofill->next(); + + $next = $righe->flatten()[$num]; + if ($has_gruppo && ($next->is_titolo || $next == null)) { + echo ' + + + '.tr('Subtotale', [], ['upper' => true]).': + + + '.moneyFormat($subtotale_gruppo, 2).' + + + + + + '.tr('Iva', [], ['upper' => true]).': + + + '.moneyFormat($iva_gruppo, 2).' + + + + + + '.tr('Subtotale ivato', [], ['upper' => true]).': + + + '.moneyFormat($subtotale_gruppo + $iva_gruppo, 2).' + + '; + + $autofill->next(); + $autofill->next(); + $autofill->next(); + } } echo ' diff --git a/update/2_4_49.sql b/update/2_4_49.sql index b8c349065..f830467cf 100644 --- a/update/2_4_49.sql +++ b/update/2_4_49.sql @@ -64,4 +64,7 @@ UPDATE `zz_widgets` SET `text` = 'Listini disattivati' WHERE `zz_widgets`.`name` INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `help`) VALUES (NULL, 'Preventivi da fatturare', 'stats', '1', 'controller_top', NULL, 'SELECT COUNT(id) AS dato FROM co_preventivi WHERE idstato IN (SELECT id FROM co_statipreventivi WHERE is_fatturabile=1) AND default_revision=1', '#44aae4', 'fa fa-file', '', './modules/preventivi/widgets/preventivi.fatturare.dashboard.php', 'popup', '', 'Preventivi da fatturare', 0, NULL); -INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0'); \ No newline at end of file +INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), '_bg_', 'IF(threshold_qta!=0, IF(mg_articoli.qta>threshold_qta, \'#CCFFCC\', \'#FFCCEB\'), \'\')', '14', '0', '0', '0', '0', '', '', '0', '0', '0'); + +-- Aggiunto titolo righe preventivi +ALTER TABLE `co_righe_preventivi` ADD `is_titolo` BOOLEAN NOT NULL AFTER `confermato`; \ No newline at end of file