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