- {[ "type": "image", "label": "", "name": "immagine", "class": "img-thumbnail", "value": "" ]}
+ {[ "type": "image", "label": "", "name": "immagine", "class": "img-thumbnail", "value": "image; ?>" ]}
diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php
index 1a0dda8fa..a27be7641 100644
--- a/modules/articoli/src/Articolo.php
+++ b/modules/articoli/src/Articolo.php
@@ -3,7 +3,9 @@
namespace Modules\Articoli;
use Common\Model;
+use Modules;
use Modules\Interventi\Components\Articolo as ArticoloIntervento;
+use Uploads;
class Articolo extends Model
{
@@ -65,8 +67,36 @@ class Articolo extends Model
return true;
}
- public function articolo()
+ public function articoli()
{
return $this->hasMany(ArticoloIntervento::class, 'idarticolo');
}
+
+ public function getImageAttribute()
+ {
+ if (empty($this->immagine)) {
+ return null;
+ }
+
+ $module = Modules::get($this->module);
+ $fileinfo = Uploads::fileInfo($this->immagine);
+
+ $directory = '/'.$module->upload_directory.'/';
+ $image = $directory.$this->immagine;
+ $image_thumbnail = $directory.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'];
+
+ $url = file_exists(DOCROOT.$image_thumbnail) ? ROOTDIR.$image_thumbnail : ROOTDIR.$image;
+
+ return $url;
+ }
+
+ /**
+ * Restituisce il nome del modulo a cui l'oggetto è collegato.
+ *
+ * @return string
+ */
+ public function getModuleAttribute()
+ {
+ return 'Articoli';
+ }
}
diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php
index 4afaf79dc..47b008cf9 100644
--- a/modules/contratti/row-list.php
+++ b/modules/contratti/row-list.php
@@ -164,7 +164,7 @@ if (abs($sconto) > 0) {
echo '
- '.tr('Sconto/maggiorazione', [], ['upper' => true]).':<
+ '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
|
'.moneyFormat($sconto, 2).'
diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php
index 572c265eb..b56e8614e 100644
--- a/modules/ddt/row-list.php
+++ b/modules/ddt/row-list.php
@@ -231,7 +231,7 @@ if (abs($sconto) > 0) {
echo '
|
- '.tr('Sconto/maggiorazione', [], ['upper' => true]).':<
+ '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
|
diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php
index c5433a5a9..016356bdd 100644
--- a/modules/fatture/row-list.php
+++ b/modules/fatture/row-list.php
@@ -308,7 +308,7 @@ if (!empty($sconto)) {
echo '
|
- '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
+ '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
|
'.moneyFormat($sconto, 2).'
diff --git a/modules/ordini/row-list.php b/modules/ordini/row-list.php
index 2e1467fb0..2ebb2d740 100644
--- a/modules/ordini/row-list.php
+++ b/modules/ordini/row-list.php
@@ -224,7 +224,7 @@ if (abs($sconto) > 0) {
echo '
|
- '.tr('Sconto/maggiorazione', [], ['upper' => true]).':<
+ '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
|
'.moneyFormat($sconto, 2).'
diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php
index dc22763d6..24a3eebd7 100644
--- a/modules/preventivi/row-list.php
+++ b/modules/preventivi/row-list.php
@@ -167,7 +167,7 @@ if (abs($sconto) > 0) {
echo '
|
- '.tr('Sconto/maggiorazione', [], ['upper' => true]).':<
+ '.tr('Sconto/maggiorazione', [], ['upper' => true]).':
|
'.moneyFormat($sconto, 2).'
diff --git a/src/Prints.php b/src/Prints.php
index 07f6f333f..cf87f5d9e 100644
--- a/src/Prints.php
+++ b/src/Prints.php
@@ -454,19 +454,7 @@ class Prints
$report = ob_get_clean();
if (!empty($autofill)) {
- $result = '';
-
- // max($autofill['additional']) = $autofill['rows'] - 1
- for ($i = (floor($autofill['count']) % $autofill['rows']); $i < $autofill['additional']; ++$i) {
- $result .= '
- |
';
- for ($c = 0; $c < $autofill['columns']; ++$c) {
- $result .= '
- | ';
- }
- $result .= '
-
';
- }
+ $result = $autofill->generate();
$report = str_replace('|autofill|', $result, $report);
}
diff --git a/src/Util/Autofill.php b/src/Util/Autofill.php
new file mode 100644
index 000000000..d4625a62d
--- /dev/null
+++ b/src/Util/Autofill.php
@@ -0,0 +1,100 @@
+column_number = $column_number;
+ $this->char_number = $char_number;
+ }
+
+ public function setRows($rows, $additional = null, $first_page = null)
+ {
+ $this->max_rows = $rows;
+
+ $this->max_additional = isset($additional) ? $additional : floor($this->max_rows - $this->max_rows / 4);
+ $this->max_rows_first_page = isset($first_page) ? $first_page : $rows;
+ }
+
+ public function count($text, $small = false)
+ {
+ $count = ceil(strlen($text) / $this->char_number);
+ $count += substr_count($text, PHP_EOL);
+ $count += substr_count($text, '
');
+
+ if ($small) {
+ $count = $count / 3;
+ }
+
+ $this->set($count);
+ }
+
+ public function set($count)
+ {
+ if ($count > $this->current) {
+ $this->current = $count;
+ }
+ }
+
+ public function next()
+ {
+ $this->space += $this->current;
+ $this->current = 0;
+ }
+
+ public function getAdditionalNumber()
+ {
+ $page = ceil($this->space / $this->max_rows_first_page);
+ if ($page > 1) {
+ $rows = floor($this->space) % $this->max_rows;
+ } else {
+ $rows = floor($this->space) % $this->max_rows_first_page;
+ }
+
+ $number = $this->max_additional - $rows;
+
+ return $number > 0 ? $number : 0;
+ }
+
+ public function generate()
+ {
+ $this->next();
+
+ $result = '';
+
+ $number = $this->getAdditionalNumber();
+ //dd($this->space, $number);exit();
+
+ for ($i = 0; $i < $number; ++$i) {
+ $result .= '
+
';
+
+ for ($c = 0; $c < $this->column_number; ++$c) {
+ $result .= '
+ | ';
+ }
+
+ $result .= '
+
';
+ }
+
+ return $result;
+ }
+}
diff --git a/templates/contratti/body.php b/templates/contratti/body.php
index de103d689..8870d3ef2 100644
--- a/templates/contratti/body.php
+++ b/templates/contratti/body.php
@@ -2,28 +2,23 @@
include_once __DIR__.'/../../core.php';
-$autofill = [
- 'count' => 0, // Conteggio delle righe
- 'words' => 70, // Numero di parolo dopo cui contare una riga nuova
- 'rows' => 20, // Numero di righe massimo presente nella pagina
- 'additional' => 10, // Numero di righe massimo da aggiungere
- 'columns' => 4, // Numero di colonne della tabella
-];
+// Creazione righe fantasma
+$autofill = new \Util\Autofill($options['pricing'] ? 4 : 2);
+$autofill->setRows(20, 10);
echo '
'.tr('Contratto num. _NUM_ del _DATE_', [
- '_NUM_' => $records[0]['numero'],
- '_DATE_' => Translator::dateToLocale($records[0]['data_bozza']),
+ '_NUM_' => $documento['numero'],
+ '_DATE_' => Translator::dateToLocale($documento['data_bozza']),
], ['upper' => true]).'
';
// Elenco impianti
-if (!empty($records[0]['idimpianti'])) {
- $impianti = $dbo->fetchArray('SELECT nome, matricola FROM my_impianti WHERE id IN ('.$records[0]['idimpianti'].')');
-
+$impianti = $dbo->fetchArray('SELECT nome, matricola FROM my_impianti WHERE id IN (SELECT my_impianti_contratti.idimpianto FROM my_impianti_contratti WHERE idcontratto = '.prepare($documento['id']).')');
+if (!empty($impianti)) {
$list = [];
foreach ($impianti as $impianto) {
$list[] = $impianto['nome']."
(".$impianto['matricola'].')';
@@ -34,6 +29,7 @@ if (!empty($records[0]['idimpianti'])) {
'.tr('Impianti', [], ['upper' => true]).'
'.implode(', ', $list).'
';
}
+
echo '
@@ -69,156 +65,180 @@ echo '
';
// Descrizione
-if (!empty($records[0]['desc_contratto'])) {
+if (!empty($documento['descrizione'])) {
echo '
-
'.nl2br($records[0]['desc_contratto']).'
+
'.nl2br($documento['descrizione']).'
';
}
-$sconto = [];
-$imponibile = [];
-$iva = [];
-
// Intestazione tabella per righe
echo "
".tr('Descrizione', [], ['upper' => true])." |
- ".tr('Q.tà', [], ['upper' => true])." |
+ ".tr('Q.tà', [], ['upper' => true]).' | ';
+
+if ($options['pricing']) {
+ echo "
".tr('Prezzo unitario', [], ['upper' => true])." |
- ".tr('Imponibile', [], ['upper' => true]).' |
+ ".tr('Imponibile', [], ['upper' => true]).' | ';
+}
+
+echo '
';
-// RIGHE PREVENTIVO CON ORDINAMENTO UNICO
-$righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`');
-foreach ($righe as $r) {
- $count = 0;
- $count += ceil(strlen($r['descrizione']) / $autofill['words']);
- $count += substr_count($r['descrizione'], PHP_EOL);
+// Righe documento
+$righe = $documento->getRighe();
+foreach ($righe as $riga) {
+ $r = $riga->toArray();
+
+ $autofill->count($r['descrizione']);
echo '
'.nl2br($r['descrizione']);
- if (!empty($r['codice_articolo'])) {
+ if ($riga->isArticolo()) {
+ // Codice articolo
+ $text = tr('COD. _COD_', [
+ '_COD_' => $riga->articolo->codice,
+ ]);
echo '
- '.tr('COD. _COD_', [
- '_COD_' => $r['codice_articolo'],
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
+ $autofill->count($text, true);
}
echo '
| ';
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if (!$riga->isDescrizione()) {
echo '
- '.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
- }
- echo '
+ |
+ '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
| ';
- if ($options['pricing']) {
- // Prezzo unitario
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if ($options['pricing']) {
+ // Prezzo unitario
echo '
- '.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta']));
- }
- echo '
- | ';
+
+ '.moneyFormat($riga->prezzo_unitario_vendita);
- // Imponibile
- echo "
- | ";
- if (empty($r['is_descrizione'])) {
- echo '
- '.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
+ if ($riga->sconto > 0) {
+ $text = tr('sconto _TOT_ _TYPE_', [
+ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
+ '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
+ ]);
- if ($r['sconto'] > 0) {
echo '
- - '.tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
- '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
+ $autofill->count($text, true);
}
- }
- echo '
+
+ echo '
| ';
+
+ // Imponibile
+ echo '
+
+ '.moneyFormat($riga->totale_imponibile).'
+ | ';
+ }
} else {
echo '
- - |
- - | ';
+ | ';
+
+ if ($options['pricing']) {
+ echo '
+ |
+ | ';
+ }
}
echo '
';
- $autofill['count'] += $count;
-
- $sconto[] = $r['sconto'];
- $imponibile[] = $r['subtotale'];
+ $autofill->next();
}
-$sconto = sum($sconto);
-$imponibile = sum($imponibile);
-
-$totale = $imponibile - $sconto;
-
echo '
|autofill|
';
+// Calcoli
+$imponibile = $documento->imponibile;
+$sconto = $documento->sconto;
+$totale_imponibile = $documento->totale_imponibile;
+$totale_iva = $documento->iva;
+$totale = $documento->totale;
+
+$show_sconto = $sconto > 0;
+
// TOTALE COSTI FINALI
if ($options['pricing']) {
- // Eventuale sconto incondizionato
- if ($sconto > 0) {
- // Totale imponibile
- echo '
+ // Totale imponibile
+ echo '
'.tr('Imponibile', [], ['upper' => true]).':
|
-
- '.moneyFormat($imponibile, 2).'
+ |
+ '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
|
';
+ // Eventuale sconto incondizionato
+ if ($show_sconto) {
echo '
'.tr('Sconto', [], ['upper' => true]).':
|
-
+ |
'.moneyFormat($sconto, 2).'
|
';
+
+ // Totale imponibile
+ echo '
+
+
+ '.tr('Totale imponibile', [], ['upper' => true]).':
+ |
+
+
+ '.moneyFormat($totale_imponibile, 2).'
+ |
+
';
}
+ // IVA
+ echo '
+
+
+ '.tr('Totale IVA', [], ['upper' => true]).':
+ |
+
+
+ '.moneyFormat($totale_iva, 2).'
+ |
+
';
+
// TOTALE
echo '
- '.tr('Quotazione totale', [], ['upper' => true]).':
+ '.tr('Totale documento', [], ['upper' => true]).':
|
-
+ |
'.moneyFormat($totale, 2).'
|
';
@@ -227,10 +247,7 @@ echo'
';
// CONDIZIONI GENERALI DI FORNITURA
-
-// Lettura pagamenti
-$rs = $dbo->fetchArray('SELECT * FROM co_pagamenti WHERE id = '.$records[0]['idpagamento']);
-$pagamento = $rs[0]['descrizione'];
+$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.$documento['idpagamento']);
echo '
@@ -246,7 +263,7 @@ echo '
- '.$pagamento.'
+ '.$pagamento['descrizione'].'
|
@@ -257,10 +274,10 @@ echo '
';
- if (!empty($records[0]['validita'])) {
+ if (!empty($documento['validita'])) {
echo'
'.tr('_TOT_ giorni', [
- '_TOT_' => $records[0]['validita'],
+ '_TOT_' => $documento['validita'],
]);
} else {
echo '-';
@@ -277,11 +294,11 @@ echo '
| ';
- if (!empty($records[0]['data_accettazione']) && !empty($records[0]['data_conclusione'])) {
+ if (!empty($documento['data_accettazione']) && !empty($documento['data_conclusione'])) {
echo '
'.tr('dal _START_ al _END_', [
- '_START_' => Translator::dateToLocale($records[0]['data_accettazione']),
- '_END_' => Translator::dateToLocale($records[0]['data_conclusione']),
+ '_START_' => Translator::dateToLocale($documento['data_accettazione']),
+ '_END_' => Translator::dateToLocale($documento['data_conclusione']),
]);
} else {
echo '-';
@@ -297,13 +314,13 @@ echo '
|
- '.nl2br($records[0]['esclusioni']).'
+ '.nl2br($documento['esclusioni']).'
|
';
// Conclusione
-if (empty($records[0]['fatturabile'])) {
+if (empty($documento->stato->fatturabile)) {
echo '
'.tr('Il tutto S.E. & O.').'
'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'
';
@@ -314,11 +331,11 @@ echo '
- lì, ___________________________
+ '.tr('lì').', ___________________________
- FIRMA PER ACCETTAZIONE
+ '.tr('Firma per accettazione', [], ['upper' => true]).'
_____________________________________________
|
diff --git a/templates/contratti/init.php b/templates/contratti/init.php
index 835573161..4fb95a6ba 100644
--- a/templates/contratti/init.php
+++ b/templates/contratti/init.php
@@ -2,10 +2,9 @@
include_once __DIR__.'/../../core.php';
-$module_name = 'Contratti';
+use Modules\Contratti\Contratto;
-// Lettura info fattura
-$records = $dbo->fetchArray('SELECT *, co_contratti.descrizione AS desc_contratto, (SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=in_interventi.id LIMIT 0,1) AS data, (SELECT is_fatturabile FROM co_staticontratti WHERE id=idstato) AS fatturabile, (SELECT GROUP_CONCAT(my_impianti_contratti.idimpianto) FROM my_impianti_contratti WHERE idcontratto = co_contratti.id) AS idimpianti, co_contratti.descrizione AS `cdescrizione`, co_contratti.idanagrafica AS `idanagrafica`, co_contratti.costo_orario AS costo_orario , co_contratti.costo_km AS costo_km FROM co_contratti LEFT OUTER JOIN (co_promemoria LEFT OUTER JOIN in_interventi ON co_promemoria.idintervento=in_interventi.id) ON co_contratti.id=co_promemoria.idcontratto WHERE co_contratti.id='.prepare($id_record));
+$documento = Contratto::find($id_record);
-$id_cliente = $records[0]['idanagrafica'];
-$id_sede = $records[0]['idsede'];
+$id_cliente = $documento['idanagrafica'];
+$id_sede = $documento['idsede'];
diff --git a/templates/ddt/body.php b/templates/ddt/body.php
index ab998b8e1..1e176078a 100644
--- a/templates/ddt/body.php
+++ b/templates/ddt/body.php
@@ -2,17 +2,9 @@
include_once __DIR__.'/../../core.php';
-$autofill = [
- 'count' => 0,
- 'words' => 70,
- 'rows' => 16,
- 'additional' => 15,
- 'columns' => $options['pricing'] ? 5 : 2,
-];
-
-$imponibile = [];
-$iva = [];
-$sconto = [];
+// Creazione righe fantasma
+$autofill = new \Util\Autofill($options['pricing'] ? 5 : 2);
+$autofill->setRows(16);
// Intestazione tabella per righe
echo "
@@ -35,133 +27,112 @@ if ($options['pricing']) {
';
-// Righe
-$rs_gen = $dbo->fetchArray("SELECT *,
- IFNULL((SELECT `codice` FROM `mg_articoli` WHERE `id` = `dt_righe_ddt`.`idarticolo`), '') AS codice_articolo,
- (SELECT GROUP_CONCAT(`serial` SEPARATOR ', ') FROM `mg_prodotti` WHERE `id_riga_ddt` = `dt_righe_ddt`.`id`) AS seriali,
- (SELECT `percentuale` FROM `co_iva` WHERE `id` = `dt_righe_ddt`.`idiva`) AS perc_iva,
- IFNULL((SELECT peso_lordo FROM mg_articoli WHERE id=idarticolo),0) * qta AS peso_lordo,
- IFNULL((SELECT volume FROM mg_articoli WHERE id=idarticolo),0) * qta AS volume
-FROM `dt_righe_ddt` WHERE idddt=".prepare($id_record).' ORDER BY `order`');
-foreach ($rs_gen as $r) {
- $count = 0;
- $count += ceil(strlen($r['descrizione']) / $autofill['words']);
- $count += substr_count($r['descrizione'], PHP_EOL);
+// Righe documento
+$righe = $documento->getRighe();
+foreach ($righe as $riga) {
+ $r = $riga->toArray();
+
+ $autofill->count($r['descrizione']);
echo '
'.nl2br($r['descrizione']);
- // Codice articolo
- if (!empty($r['codice_articolo'])) {
+ if ($riga->isArticolo()) {
+ // Codice articolo
+ $text = tr('COD. _COD_', [
+ '_COD_' => $riga->articolo->codice,
+ ]);
echo '
- '.tr('COD. _COD_', [
- '_COD_' => $r['codice_articolo'],
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
- }
+ $autofill->count($text, true);
- // Seriali
- if (!empty($r['seriali'])) {
- echo '
- '.tr('SN').': '.$r['seriali'].'';
+ // Seriali
+ $seriali = $riga->serials;
+ if (!empty($seriali)) {
+ $text = tr('SN').': '.implode($seriali, ', ');
+ echo '
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
+ $autofill->count($text, true);
}
}
// Aggiunta dei riferimenti ai documenti
if (setting('Riferimento dei documenti nelle stampe')) {
- $ref = doc_references($r, $records[0]['dir'], ['idddt']);
+ $ref = doc_references($r, $record['dir'], ['iddocumento']);
if (!empty($ref)) {
echo '
'.$ref['description'].'';
- if ($count <= 1) {
- $count += 0.4;
- }
+
+ $autofill->count($ref['description'], true);
}
}
echo '
| ';
- echo '
- ';
- if (empty($r['is_descrizione'])) {
+ if (!$riga->isDescrizione()) {
echo '
- '.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'];
- }
- echo '
- | ';
+
+ '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
+ | ';
- if ($options['pricing']) {
- // Prezzo unitario
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if ($options['pricing']) {
+ // Prezzo unitario
echo '
- '.moneyFormat($r['subtotale'] / $r['qta']);
- }
- echo '
- | ';
+
+ '.moneyFormat($riga->prezzo_unitario_vendita);
- // Imponibile
- echo "
- | ";
- if (empty($r['is_descrizione'])) {
- echo '
- '.moneyFormat($r['subtotale']);
+ if ($riga->sconto > 0) {
+ $text = tr('sconto _TOT_ _TYPE_', [
+ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
+ '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
+ ]);
- if ($r['sconto'] > 0) {
- if ($count <= 1) {
- $count += 0.4;
- }
echo '
- - '.tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
- '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
- ]).'';
+ '.$text.'';
+
+ $autofill->count($text, true);
}
- }
- echo '
- | ';
- // Iva
- echo "
- ";
- if (empty($r['is_descrizione'])) {
echo '
- '.Translator::numberToLocale($r['perc_iva'], 0);
+ | ';
+
+ // Imponibile
+ echo '
+
+ '.moneyFormat($riga->totale_imponibile).'
+ | ';
+
+ // Iva
+ echo '
+
+ '.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
+ | ';
}
+ } else {
echo '
- ';
+ | ';
+
+ if ($options['pricing']) {
+ echo '
+ |
+ |
+ | ';
+ }
}
+
echo '
-
';
+ ';
- $autofill['count'] += $count;
-
- $imponibile[] = $r['subtotale'];
- $iva[] = $r['iva'];
- $sconto[] = $r['sconto'];
+ $autofill->next();
}
echo '
|autofill|
';
-
-// Info per il footer
-$imponibile = sum($imponibile) - sum($sconto);
-$iva = sum($iva);
-
-$totale = $imponibile + $iva;
-
-$volume = sum(array_column($rs_gen, 'volume'));
-$peso_lordo = sum(array_column($rs_gen, 'peso_lordo'));
diff --git a/templates/ddt/footer.php b/templates/ddt/footer.php
index 3b9b24542..6d99ca432 100644
--- a/templates/ddt/footer.php
+++ b/templates/ddt/footer.php
@@ -1,5 +1,19 @@
imponibile;
+$sconto = $documento->sconto;
+$totale_imponibile = $documento->totale_imponibile;
+$totale_iva = $documento->iva;
+$totale = $documento->totale;
+
+$volume = $righe->sum(function ($item) {
+ return $item->isArticolo() ? $item->articolo->volume : 0;
+});
+$peso_lordo = $righe->sum(function ($item) {
+ return $item->isArticolo() ? $item->articolo->peso_lordo : 0;
+});
+
// TABELLA PRINCIPALE
echo '
';
@@ -10,7 +24,7 @@ if ($options['pricing']) {
".tr('Note', [], ['upper' => true]).'
- '.nl2br($records[0]['note'])."
+ '.nl2br($documento['note'])."
|
".tr('Totale imponibile', [], ['upper' => true]).'
@@ -29,13 +43,13 @@ if ($options['pricing']) {
echo "
|
- ".tr('Totale imposte', [], ['upper' => true])."
+ ".tr('Totale IVA', [], ['upper' => true])."
|
- ".moneyFormat($iva, 2).'
+ ".moneyFormat($totale_iva, 2).'
|
';
@@ -58,7 +72,7 @@ if ($options['pricing']) {
".tr('Note', [], ['upper' => true]).'
- '.nl2br($records[0]['note']).'
+ '.nl2br($documento['note']).'
|
';
}
diff --git a/templates/ddt/header.php b/templates/ddt/header.php
index 6880f467a..3062050f4 100644
--- a/templates/ddt/header.php
+++ b/templates/ddt/header.php
@@ -9,7 +9,7 @@ $default_header$
- DDT
+ '.tr('DDT').'
diff --git a/templates/ddt/init.php b/templates/ddt/init.php
index a3e259cb8..3eedacd6e 100644
--- a/templates/ddt/init.php
+++ b/templates/ddt/init.php
@@ -2,36 +2,33 @@
include_once __DIR__.'/../../core.php';
-// Lettura info ddt
-$q = 'SELECT *,
- (SELECT dir FROM dt_tipiddt WHERE id=idtipoddt) AS dir,
- (SELECT descrizione FROM dt_tipiddt WHERE id=idtipoddt) AS tipo_doc,
- (SELECT descrizione FROM dt_causalet WHERE id=idcausalet) AS causalet,
- (SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento,
- (SELECT descrizione FROM dt_porto WHERE id=idporto) AS porto,
- (SELECT descrizione FROM dt_aspettobeni WHERE id=idaspettobeni) AS aspettobeni,
- (SELECT descrizione FROM dt_spedizione WHERE id=idspedizione) AS spedizione,
- (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=idvettore) AS vettore
-FROM dt_ddt WHERE id='.prepare($id_record);
-$records = $dbo->fetchArray($q);
+use Modules\DDT\DDT;
-$module_name = ($records[0]['dir'] == 'entrata') ? 'Ddt di vendita' : 'Ddt di acquisto';
+$documento = DDT::find($id_record);
-$id_cliente = $records[0]['idanagrafica'];
+$id_cliente = $documento['idanagrafica'];
$id_sede = $record['idsede_partenza'];
-$tipo_doc = $records[0]['tipo_doc'];
-if (empty($records[0]['numero_esterno'])) {
+$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.prepare($documento['idpagamento']));
+$causale = $dbo->fetchOne('SELECT * FROM dt_causalet WHERE id = '.prepare($documento['idcausalet']));
+$porto = $dbo->fetchOne('SELECT * FROM dt_porto WHERE id = '.prepare($documento['idporto']));
+$aspetto_beni = $dbo->fetchOne('SELECT * FROM dt_aspettobeni WHERE id = '.prepare($documento['idaspettobeni']));
+$spedizione = $dbo->fetchOne('SELECT * FROM dt_spedizione WHERE id = '.prepare($documento['idspedizione']));
+
+$vettore = $dbo->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare($documento['idvettore']));
+
+$tipo_doc = $documento->tipo->descrizione;
+if (empty($documento['numero_esterno'])) {
$numero = 'pro-forma '.$numero;
- $tipo_doc = tr('Ddt pro-forma', [], ['upper' => true]);
+ $tipo_doc = tr('DDT pro-forma', [], ['upper' => true]);
} else {
- $numero = !empty($records[0]['numero_esterno']) ? $records[0]['numero_esterno'] : $records[0]['numero'];
+ $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
}
// Leggo i dati della destinazione (se 0=sede legale, se!=altra sede da leggere da tabella an_sedi)
$destinazione = '';
-if (!empty($records[0]['idsede_destinazione'])) {
- $rsd = $dbo->fetchArray('SELECT (SELECT codice FROM an_anagrafiche WHERE idanagrafica=an_sedi.idanagrafica) AS codice, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=an_sedi.idanagrafica) AS ragione_sociale, nomesede, indirizzo, indirizzo2, cap, citta, provincia, piva, codice_fiscale FROM an_sedi WHERE idanagrafica='.prepare($id_cliente).' AND id='.prepare($records[0]['idsede_destinazione']));
+if (!empty($documento['idsede_destinazione'])) {
+ $rsd = $dbo->fetchArray('SELECT (SELECT codice FROM an_anagrafiche WHERE idanagrafica=an_sedi.idanagrafica) AS codice, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=an_sedi.idanagrafica) AS ragione_sociale, nomesede, indirizzo, indirizzo2, cap, citta, provincia, piva, codice_fiscale FROM an_sedi WHERE idanagrafica='.prepare($id_cliente).' AND id='.prepare($documento['idsede_destinazione']));
if (!empty($rsd[0]['nomesede'])) {
$destinazione .= $rsd[0]['nomesede'].'
';
@@ -57,21 +54,21 @@ if (!empty($records[0]['idsede_destinazione'])) {
$custom = [
'tipo_doc' => $tipo_doc,
'numero' => $numero,
- 'data' => Translator::dateToLocale($records[0]['data']),
- 'pagamento' => $records[0]['tipo_pagamento'],
+ 'data' => Translator::dateToLocale($documento['data']),
+ 'pagamento' => $pagamento['descrizione'],
'c_destinazione' => $destinazione,
- 'aspettobeni' => $records[0]['aspettobeni'],
- 'causalet' => $records[0]['causalet'],
- 'porto' => $records[0]['porto'],
- 'n_colli' => !empty($records[0]['n_colli']) ? $records[0]['n_colli'] : '',
- 'spedizione' => $records[0]['spedizione'],
- 'vettore' => $records[0]['vettore'],
+ 'aspettobeni' => $aspetto_beni['descrizione'],
+ 'causalet' => $causale['descrizione'],
+ 'porto' => $porto['descrizione'],
+ 'n_colli' => !empty($documento['n_colli']) ? $documento['n_colli'] : '',
+ 'spedizione' => $spedizione['descrizione'],
+ 'vettore' => $vettore['ragione_sociale'],
];
// Accesso solo a:
// - cliente se è impostato l'idanagrafica di un Cliente
// - utente qualsiasi con permessi almeno in lettura sul modulo
// - admin
-if ((Auth::user()['gruppo'] == 'Clienti' && $id_cliente != Auth::user()['idanagrafica'] && !Auth::admin()) || Modules::getPermission($module_name) == '-') {
+if ((Auth::user()['gruppo'] == 'Clienti' && $id_cliente != Auth::user()['idanagrafica'] && !Auth::admin()) || Modules::getPermission($documento->module) == '-') {
die(tr('Non hai i permessi per questa stampa!'));
}
diff --git a/templates/fatture/body.php b/templates/fatture/body.php
index 03d51f0a6..4e2d1a141 100644
--- a/templates/fatture/body.php
+++ b/templates/fatture/body.php
@@ -2,17 +2,13 @@
include_once __DIR__.'/../../core.php';
-$autofill = [
- 'count' => 0, // Conteggio delle righe
- 'words' => 70, // Numero di parole dopo cui contare una riga nuova
- 'rows' => $fattura_accompagnatoria ? 15 : 20, // Numero di righe massimo presente nella pagina
- 'additional' => $fattura_accompagnatoria ? 10 : 15, // Numero di righe massimo da aggiungere
- 'columns' => 5, // Numero di colonne della tabella
-];
-
$v_iva = [];
$v_totale = [];
+// Creazione righe fantasma
+$autofill = new \Util\Autofill(5, 70);
+$autofill->setRows($fattura_accompagnatoria ? 15 : 20, $fattura_accompagnatoria ? 10 : 15);
+
// Intestazione tabella per righe
echo "
@@ -26,58 +22,41 @@ echo "
-
-
- |
- |
- |
- |
- |
-
-
-
';
-// RIGHE FATTURA CON ORDINAMENTO UNICO
-$righe = $fattura->getRighe();
+// Righe documento
+$righe = $documento->getRighe();
foreach ($righe as $riga) {
$r = $riga->toArray();
- $count = 0;
- $count += ceil(strlen($r['descrizione']) / $autofill['words']);
- $count += substr_count($r['descrizione'], PHP_EOL);
- $v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $r['iva']);
+ $autofill->count($r['descrizione']);
+
+ $v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $riga->iva);
$v_totale[$r['desc_iva']] = sum($v_totale[$r['desc_iva']], $riga->totale_imponibile);
- // Valori assoluti
- $r['qta'] = abs($r['qta']);
- $r['sconto_unitario'] = abs($r['sconto_unitario']);
- $r['sconto'] = abs($r['sconto']);
-
echo '
'.nl2br($r['descrizione']);
- // Codice articolo
- if (!empty($r['codice_articolo'])) {
+ if ($riga->isArticolo()) {
+ // Codice articolo
+ $text = tr('COD. _COD_', [
+ '_COD_' => $riga->articolo->codice,
+ ]);
echo '
- '.tr('COD. _COD_', [
- '_COD_' => $r['codice_articolo'],
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
- }
+ $autofill->count($text, true);
- // Seriali
- if (!empty($r['seriali'])) {
- echo '
- '.tr('SN').': '.$r['seriali'].'';
+ // Seriali
+ $seriali = $riga->serials;
+ if (!empty($seriali)) {
+ $text = tr('SN').': '.implode($seriali, ', ');
+ echo '
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
+ $autofill->count($text, true);
}
}
@@ -93,9 +72,7 @@ foreach ($righe as $riga) {
echo '
'.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
+ $autofill->count($text, true);
}
// Aggiunta dei riferimenti ai documenti
@@ -106,69 +83,62 @@ foreach ($righe as $riga) {
echo '
'.$ref['description'].'';
- if ($count <= 1) {
- $count += 0.4;
- }
+ $autofill->count($ref['description'], true);
}
}
echo '
| ';
- echo '
- ';
- if (empty($r['is_descrizione'])) {
+ if (!$riga->isDescrizione()) {
echo '
- '.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'];
- }
- echo '
+ |
+ '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
| ';
- // Prezzo unitario
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ // Prezzo unitario
echo '
- '.(empty($r['qta']) ? '' : moneyFormat($riga->prezzo_unitario_vendita));
+ |
+ '.moneyFormat($riga->prezzo_unitario_vendita);
if ($riga->sconto > 0) {
- echo "
- ".tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
- '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
- ]).'';
+ $text = tr('sconto _TOT_ _TYPE_', [
+ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
+ '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
+ ]);
- if ($count <= 1) {
- $count += 0.4;
- }
+ echo '
+ '.$text.'';
+
+ $autofill->count($text, true);
}
- }
- echo '
+ echo '
| ';
- // Imponibile
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ // Imponibile
echo '
- '.moneyFormat($riga->totale_imponibile);
- }
- echo '
+ |
+ '.moneyFormat($riga->totale_imponibile).'
| ';
- // Iva
- echo '
- ';
- if (empty($r['is_descrizione'])) {
+ // Iva
echo '
- '.Translator::numberToLocale($riga->aliquota->percentuale, 0);
+ |
+ '.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
+ | ';
+ } else {
+ echo '
+ |
+ |
+ |
+ | ';
}
+
echo '
-
';
- $autofill['count'] += $count;
+ $autofill->next();
}
echo '
@@ -177,27 +147,23 @@ echo '
';
// Aggiungo diciture particolari per l'anagrafica cliente
-$dicitura = $dbo->fetchArray('SELECT diciturafissafattura FROM an_anagrafiche WHERE idanagrafica = '.prepare($id_cliente));
+$dicitura = $dbo->fetchOne('SELECT diciturafissafattura AS dicitura FROM an_anagrafiche WHERE idanagrafica = '.prepare($id_cliente));
-if (!empty($dicitura[0]['diciturafissafattura'])) {
- $testo = $dicitura[0]['diciturafissafattura'];
-
- echo "
-
-".nl2br($testo).'
+if (!empty($dicitura['dicitura'])) {
+ echo '
+
+ '.nl2br($dicitura['dicitura']).'
';
}
// Aggiungo diciture per condizioni iva particolari
foreach ($v_iva as $key => $value) {
- $dicitura = $dbo->fetchArray('SELECT dicitura FROM co_iva WHERE descrizione = '.prepare($key));
+ $dicitura = $dbo->fetchOne('SELECT dicitura FROM co_iva WHERE descrizione = '.prepare($key));
- if (!empty($dicitura[0]['dicitura'])) {
- $testo = $dicitura[0]['dicitura'];
-
- echo "
-
- ".nl2br($testo).'
+ if (!empty($dicitura['dicitura'])) {
+ echo '
+
+ '.nl2br($dicitura['dicitura']).'
';
}
}
@@ -212,6 +178,7 @@ echo '
'.tr('Note', [], ['upper' => true]).':
'.nl2br($record['note']).'
';
}
+
echo '
';
diff --git a/templates/fatture/footer.php b/templates/fatture/footer.php
index c9d65c197..4268b2b16 100644
--- a/templates/fatture/footer.php
+++ b/templates/fatture/footer.php
@@ -1,12 +1,12 @@
imponibile;
-$sconto = $fattura->sconto;
-$totale_imponibile = $fattura->totale_imponibile;
-$totale_iva = $fattura->iva;
-$totale = $fattura->totale;
-$netto_a_pagare = $fattura->netto;
+$imponibile = $documento->imponibile;
+$sconto = $documento->sconto;
+$totale_imponibile = $documento->totale_imponibile;
+$totale_iva = $documento->iva;
+$totale = $documento->totale;
+$netto_a_pagare = $documento->netto;
$show_sconto = $sconto > 0;
$width = round(100 / ($show_sconto ? 5 : 3), 2);
@@ -207,10 +207,8 @@ if (!empty($record['rivalsainps'])) {
';
}
-$fattura = \Modules\Fatture\Fattura::find($id_record);
-
// Ritenuta d'acconto ( + se no rivalsa inps)
-if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contributi) || !empty($record['spit_payment'])) {
+if (!empty($record['ritenutaacconto']) || !empty($documento->totale_ritenuta_contributi) || !empty($record['spit_payment'])) {
$rs2 = $dbo->fetchArray('SELECT percentuale FROM co_ritenutaacconto WHERE id=(SELECT idritenutaacconto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idritenutaacconto!=0 LIMIT 0,1)');
$first_colspan = 3;
@@ -222,7 +220,7 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
}
$contributi = (!empty($record['ritenutaacconto']) ? ' - ' : '').tr('contributi: _PRC_%', [
- '_PRC_' => Translator::numberToLocale($fattura->ritenutaContributi->percentuale, 2),
+ '_PRC_' => Translator::numberToLocale($documento->ritenutaContributi->percentuale, 2),
]);
$acconto = tr('acconto: _PRC_%', [
'_PRC_' => Translator::numberToLocale($rs2[0]['percentuale'], 0),
@@ -233,7 +231,7 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
'.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [
'_ACCONTO_' => $acconto,
- '_CONTRIBUTI_' => empty($fattura->ritenutaContributi) ? null : $contributi,
+ '_CONTRIBUTI_' => empty($documento->ritenutaContributi) ? null : $contributi,
], ['upper' => true]).'
| ';
@@ -252,13 +250,13 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
- '.moneyFormat(abs($fattura->ritenuta_acconto) + $fattura->totale_ritenuta_contributi, 2).'
+ '.moneyFormat(abs($documento->ritenuta_acconto) + $documento->totale_ritenuta_contributi, 2).'
| ';
echo '
- '.moneyFormat($totale - abs($fattura->ritenuta_acconto) - $fattura->totale_ritenuta_contributi, 2).'
+ '.moneyFormat($totale - abs($documento->ritenuta_acconto) - $documento->totale_ritenuta_contributi, 2).'
|
';
}
@@ -286,7 +284,7 @@ if (!empty($record['split_payment'])) {
- '.moneyFormat($totale - $totale_iva - abs($fattura->ritenuta_acconto) - $fattura->totale_ritenuta_contributi, 2).'
+ '.moneyFormat($totale - $totale_iva - abs($documento->ritenuta_acconto) - $documento->totale_ritenuta_contributi, 2).'
|
';
}
diff --git a/templates/fatture/header.php b/templates/fatture/header.php
index 4a65750cc..59008b2fc 100644
--- a/templates/fatture/header.php
+++ b/templates/fatture/header.php
@@ -20,11 +20,11 @@ echo '
-
+
$tipo_doc$
-
+
'.tr('Nr. documento', [], ['upper' => true]).'
diff --git a/templates/fatture/init.php b/templates/fatture/init.php
index 60fc6076a..d00756961 100644
--- a/templates/fatture/init.php
+++ b/templates/fatture/init.php
@@ -4,8 +4,8 @@ include_once __DIR__.'/../../core.php';
use Modules\Fatture\Fattura;
-$fattura = Fattura::find($id_record);
-$banca = $fattura->getBanca();
+$documento = Fattura::find($id_record);
+$banca = $documento->getBanca();
// Lettura info fattura
$record = $dbo->fetchOne('SELECT *,
@@ -71,7 +71,7 @@ if (!empty($record['idsede_destinazione'])) {
$destinazione .= ' ('.$rsd[0]['provincia'].')';
}
- $settings['header-height'] += 7;
+ $settings['header-height'] += 15;
}
// Sostituzioni specifiche
diff --git a/templates/fatture/settings.php b/templates/fatture/settings.php
index 9f63798c5..93ca6f664 100644
--- a/templates/fatture/settings.php
+++ b/templates/fatture/settings.php
@@ -1,6 +1,6 @@
80,
+ 'header-height' => 70,
'footer-height' => 55,
];
diff --git a/templates/ordini/body.php b/templates/ordini/body.php
index d29ffc2a3..ca0d20305 100644
--- a/templates/ordini/body.php
+++ b/templates/ordini/body.php
@@ -2,49 +2,25 @@
include_once __DIR__.'/../../core.php';
-function findKey($array, $keySearch)
-{
- foreach ($array as $key => $item) {
- if ($key == $keySearch) {
- return true;
- } elseif (is_array($item) && findKey($item, $keySearch)) {
- echo $key;
+// Righe documento
+$righe = $documento->getRighe();
- return true;
- }
- }
+$has_image = $righe->search(function ($item) {
+ return !empty($item->articolo->immagine);
+});
- return false;
+if ($has_image) {
+ $columns = 6;
+ $char_number = $options['pricing'] ? 26 : 63;
+} else {
+ $columns = 5;
+ $char_number = $options['pricing'] ? 45 : 82;
}
+$columns = $options['pricing'] ? $columns : $columns - 3;
-$has_image = false;
-
-// RIGHE ORDINE
-$righe = $dbo->fetchArray("SELECT *,
- IFNULL((SELECT `codice` FROM `mg_articoli` WHERE `id` = `or_righe_ordini`.`idarticolo`), '') AS codice_articolo,
- IFNULL((SELECT `immagine` FROM `mg_articoli` WHERE `id` = `or_righe_ordini`.`idarticolo`), '') AS immagine_articolo,
- (SELECT GROUP_CONCAT(`serial` SEPARATOR ', ') FROM `mg_prodotti` WHERE `id_riga_ordine` = `or_righe_ordini`.`id`) AS seriali,
- (SELECT `percentuale` FROM `co_iva` WHERE `id` = `or_righe_ordini`.`idiva`) AS perc_iva
-FROM `or_righe_ordini` WHERE idordine=".prepare($id_record).' ORDER BY `order`');
-
-//controllo se gli articoli nell'ordine hanno un'immagine
-if (findKey($righe, 'immagine_articolo')) {
- if (!empty($righe[(findKey($righe, 'immagine_articolo') - 1)]['immagine_articolo'])) {
- $has_image = true;
- }
-}
-
-$autofill = [
- 'count' => 0, // Conteggio delle righe
- 'words' => 70, // Numero di parolo dopo cui contare una riga nuova
- 'rows' => 20, // Numero di righe massimo presente nella pagina
- 'additional' => 15, // Numero di righe massimo da aggiungere
- 'columns' => (($has_image) ? 6 : 5), // Numero di colonne della tabella
-];
-
-$sconto = [];
-$imponibile = [];
-$iva = [];
+// Creazione righe fantasma
+$autofill = new \Util\Autofill($columns, $char_number);
+$autofill->setRows(30);
// Intestazione tabella per righe
echo "
@@ -53,191 +29,183 @@ echo "
|
";
if ($has_image) {
- echo " ".tr('Immagine', [], ['upper' => true]).' | ';
+ echo "
+ ".tr('Immagine', [], ['upper' => true]).' | ';
}
-echo "
- ".tr('Descrizione', [], ['upper' => true])." |
- ".tr('Q.tà', [], ['upper' => true])." |
+
+ echo "
+ ".tr('Descrizione', [], ['upper' => true])." |
+ ".tr('Q.tà', [], ['upper' => true]).' | ';
+
+if ($options['pricing']) {
+ echo "
".tr('Prezzo unitario', [], ['upper' => true])." |
".tr('Importo', [], ['upper' => true])." |
- ".tr('IVA', [], ['upper' => true]).' (%) |
+ ".tr('IVA', [], ['upper' => true]).' (%) | ';
+}
+
+ echo '
';
-foreach ($righe as $r) {
- $count = 0;
- $count += ceil(strlen($r['descrizione']) / $autofill['words']);
- $count += substr_count($r['descrizione'], PHP_EOL);
+foreach ($righe as $riga) {
+ $r = $riga->toArray();
+
+ $autofill->count($r['descrizione']);
echo '
';
if ($has_image) {
- echo '
- ';
- if (!empty($r['immagine_articolo'])) {
- echo '';
+ if ($riga->isArticolo()) {
+ echo '
+ |
+
+ | ';
+
+ $autofill->set(5);
+ } else {
+ echo '
+ | ';
}
- echo '
- ';
}
echo '
- ';
-
- echo '
+ |
'.nl2br($r['descrizione']);
- // Codice articolo
- if (!empty($r['codice_articolo'])) {
+ if ($riga->isArticolo()) {
+ // Codice articolo
+ $text = tr('COD. _COD_', [
+ '_COD_' => $riga->articolo->codice,
+ ]);
echo '
- '.tr('COD. _COD_', [
- '_COD_' => $r['codice_articolo'],
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
- }
+ $autofill->count($text, true);
- // Seriali
- if (!empty($r['seriali'])) {
- echo '
- '.tr('SN').': '.$r['seriali'].'';
+ // Seriali
+ $seriali = $riga->serials;
+ if (!empty($seriali)) {
+ $text = tr('SN').': '.implode($seriali, ', ');
+ echo '
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
+ $autofill->count($text, true);
}
}
echo '
| ';
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if (!$riga->isDescrizione()) {
echo '
- '.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
- }
- echo '
+ |
+ '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
| ';
- if ($options['pricing']) {
- // Prezzo unitario
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if ($options['pricing']) {
+ // Prezzo unitario
echo '
- '.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta']));
+ |
+ '.moneyFormat($riga->prezzo_unitario_vendita);
- if ($r['sconto'] > 0) {
- echo "
- - ".tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
- '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
- ]).'';
+ if ($riga->sconto > 0) {
+ $text = tr('sconto _TOT_ _TYPE_', [
+ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
+ '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
+ ]);
- if ($count <= 1) {
- $count += 0.4;
- }
+ echo '
+ '.$text.'';
+
+ $autofill->count($text, true);
}
- }
- echo '
- | ';
- // Imponibile
- echo "
- ";
- if (empty($r['is_descrizione'])) {
echo '
- '.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
-
- if ($r['sconto'] > 0) {
- echo "
- - ".tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto']),
- '_TYPE_' => currency(),
- ]).'';
-
- if ($count <= 1) {
- $count += 0.4;
- }
- }
- }
- echo '
| ';
+
+ // Imponibile
+ echo '
+
+ '.moneyFormat($riga->totale_imponibile).'
+ | ';
+
+ // Iva
+ echo '
+
+ '.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
+ | ';
+ }
} else {
echo '
- - |
- - | ';
+ | ';
+
+ if ($options['pricing']) {
+ echo '
+ |
+ |
+ | ';
+ }
}
- // Iva
echo '
- ';
- if (empty($r['is_descrizione'])) {
- echo '
- '.Translator::numberToLocale($r['perc_iva'], 0);
- }
- echo '
- |
';
- $autofill['count'] += $count;
-
- $sconto[] = $r['sconto'];
- $imponibile[] = $r['subtotale'];
- $iva[] = $r['iva'];
+ $autofill->next();
}
-$sconto = sum($sconto);
-$imponibile = sum($imponibile);
-$iva = sum($iva);
-
-$totale = $imponibile - $sconto;
-
echo '
|autofill|
';
+// Calcoli
+$imponibile = $documento->imponibile;
+$sconto = $documento->sconto;
+$totale_imponibile = $documento->totale_imponibile;
+$totale_iva = $documento->iva;
+$totale = $documento->totale;
+
+$show_sconto = $sconto > 0;
+
// TOTALE COSTI FINALI
if ($options['pricing']) {
// Totale imponibile
echo '
-
+ |
'.tr('Imponibile', [], ['upper' => true]).':
|
- '.moneyFormat($imponibile, 2).'
+ '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
|
';
// Eventuale sconto incondizionato
- if (!empty($sconto)) {
+ if ($show_sconto) {
echo '
-
+ |
'.tr('Sconto', [], ['upper' => true]).':
|
- -'.moneyFormat($sconto, 2).'
+ '.moneyFormat($sconto, 2).'
|
';
// Totale imponibile
echo '
-
+ |
'.tr('Totale imponibile', [], ['upper' => true]).':
|
- '.moneyFormat($totale, 2).'
+ '.moneyFormat($totale_imponibile, 2).'
|
';
}
@@ -245,22 +213,20 @@ if ($options['pricing']) {
// IVA
echo '
-
+ |
'.tr('Totale IVA', [], ['upper' => true]).':
|
- '.moneyFormat($iva, 2).'
+ '.moneyFormat($totale_iva, 2).'
|
';
- $totale = sum($totale, $iva);
-
// TOTALE
echo '
-
- '.tr('Quotazione totale', [], ['upper' => true]).':
+ |
+ '.tr('Totale documento', [], ['upper' => true]).':
|
'.moneyFormat($totale, 2).'
@@ -271,9 +237,9 @@ if ($options['pricing']) {
echo '
|
';
-if (!empty($records[0]['note'])) {
+if (!empty($documento['note'])) {
echo '
'.tr('Note', [], ['upper' => true]).':
-'.nl2br($records[0]['note']).'
';
+'.nl2br($documento['note']).'
';
}
diff --git a/templates/ordini/init.php b/templates/ordini/init.php
index bf6a8bfc3..b8b50ada4 100644
--- a/templates/ordini/init.php
+++ b/templates/ordini/init.php
@@ -2,21 +2,20 @@
include_once __DIR__.'/../../core.php';
-$module_name = 'Ordini';
+use Modules\Ordini\Ordine;
-// Lettura info fattura
-$records = $dbo->fetchArray('SELECT *, (SELECT descrizione FROM or_tipiordine WHERE or_tipiordine.id=idtipoordine) AS tipo_doc, (SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento FROM or_ordini WHERE id='.prepare($id_record));
+$documento = Ordine::find($id_record);
-$id_cliente = $records[0]['idanagrafica'];
-$id_sede = $records[0]['idsede'];
+$id_cliente = $documento['idanagrafica'];
+$id_sede = $documento['idsede'];
-$numero_ord = $records[0]['numero'];
-$numero = !empty($records[0]['numero_esterno']) ? $records[0]['numero_esterno'] : $records[0]['numero'];
+$numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
+$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.prepare($documento->idpagamento));
// Sostituzioni specifiche
$custom = [
- 'tipo_doc' => Stringy\Stringy::create($records[0]['tipo_doc'])->toUpperCase(),
+ 'tipo_doc' => Stringy\Stringy::create($documento->tipo->descrizione)->toUpperCase(),
'numero' => $numero,
- 'data' => Translator::dateToLocale($records[0]['data']),
- 'pagamento' => $records[0]['tipo_pagamento'],
+ 'data' => Translator::dateToLocale($documento['data']),
+ 'pagamento' => $pagamento['descrizione'],
];
diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php
index aa3c8f463..bc892d84c 100644
--- a/templates/preventivi/body.php
+++ b/templates/preventivi/body.php
@@ -2,21 +2,17 @@
include_once __DIR__.'/../../core.php';
-$autofill = [
- 'count' => 0, // Conteggio delle righe
- 'words' => 70, // Numero di parolo dopo cui contare una riga nuova
- 'rows' => 20, // Numero di righe massimo presente nella pagina
- 'additional' => 10, // Numero di righe massimo da aggiungere
- 'columns' => 5, // Numero di colonne della tabella
-];
+// Creazione righe fantasma
+$autofill = new \Util\Autofill($options['pricing'] ? 5 : 2);
+$autofill->setRows(20, 10);
echo '
'.tr('Preventivo num. _NUM_ del _DATE_', [
- '_NUM_' => $records[0]['numero'],
- '_DATE_' => Translator::dateToLocale($records[0]['data']),
+ '_NUM_' => $documento['numero'],
+ '_DATE_' => Translator::dateToLocale($documento['data_bozza']),
], ['upper' => true]).'
@@ -54,144 +50,129 @@ echo '
';
// Descrizione
-if (!empty($records[0]['descrizione'])) {
+if (!empty($documento['descrizione'])) {
echo '
-'.nl2br($records[0]['descrizione']).'
+'.nl2br($documento['descrizione']).'
';
}
-$sconto = [];
-$imponibile = [];
-$iva = [];
-
// Intestazione tabella per righe
echo "
".tr('Descrizione', [], ['upper' => true])." |
- ".tr('Q.tà', [], ['upper' => true])." |
+ ".tr('Q.tà', [], ['upper' => true]).' | ';
+
+if ($options['pricing']) {
+ echo "
".tr('Prezzo unitario', [], ['upper' => true])." |
- ".tr('Imponibile', [], ['upper' => true])." |
- ".tr('IVA', [], ['upper' => true]).' (%) |
+ ".tr('Importo', [], ['upper' => true])." |
+ ".tr('IVA', [], ['upper' => true]).' (%) | ';
+}
+
+echo '
';
-// RIGHE PREVENTIVO CON ORDINAMENTO UNICO
-$righe = $dbo->fetchArray("SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice_articolo, (SELECT percentuale FROM co_iva WHERE id=idiva) AS perc_iva FROM `co_righe_preventivi` WHERE idpreventivo=".prepare($id_record).' ORDER BY `order`');
-foreach ($righe as $r) {
- $count = 0;
- $count += ceil(strlen($r['descrizione']) / $autofill['words']);
- $count += substr_count($r['descrizione'], PHP_EOL);
+// Righe documento
+$righe = $documento->getRighe();
+foreach ($righe as $riga) {
+ $r = $riga->toArray();
+
+ $autofill->count($r['descrizione']);
echo '
'.nl2br($r['descrizione']);
- if (!empty($r['codice_articolo'])) {
+ if ($riga->isArticolo()) {
+ // Codice articolo
+ $text = tr('COD. _COD_', [
+ '_COD_' => $riga->articolo->codice,
+ ]);
echo '
- '.tr('COD. _COD_', [
- '_COD_' => $r['codice_articolo'],
- ]).'';
+ '.$text.'';
- if ($count <= 1) {
- $count += 0.4;
- }
+ $autofill->count($text, true);
}
echo '
| ';
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if (!$riga->isDescrizione()) {
echo '
- '.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
- }
- echo '
+ |
+ '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
| ';
- if ($options['pricing']) {
- // Prezzo unitario
- echo "
- ";
- if (empty($r['is_descrizione'])) {
+ if ($options['pricing']) {
+ // Prezzo unitario
echo '
- '.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta']));
+ |
+ '.moneyFormat($riga->prezzo_unitario_vendita);
- if ($r['sconto'] > 0) {
- echo "
- - ".tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
- '_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
- ]).'';
+ if ($riga->sconto > 0) {
+ $text = tr('sconto _TOT_ _TYPE_', [
+ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
+ '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
+ ]);
- if ($count <= 1) {
- $count += 0.4;
- }
+ echo '
+ '.$text.'';
+
+ $autofill->count($text, true);
}
- }
- echo '
- | ';
- // Imponibile
- echo "
- ";
- if (empty($r['is_descrizione'])) {
echo '
- '.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
-
- if ($r['sconto'] > 0) {
- echo "
- - ".tr('sconto _TOT_ _TYPE_', [
- '_TOT_' => Translator::numberToLocale($r['sconto']),
- '_TYPE_' => currency(),
- ]).'';
-
- if ($count <= 1) {
- $count += 0.4;
- }
- }
- }
- echo '
| ';
+
+ // Imponibile
+ echo '
+
+ '.moneyFormat($riga->totale_imponibile).'
+ | ';
+
+ // Iva
+ echo '
+
+ '.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
+ | ';
+ }
} else {
echo '
- - |
- - | ';
+ | ';
+
+ if ($options['pricing']) {
+ echo '
+ |
+ |
+ | ';
+ }
}
- // Iva
echo '
- ';
- if (empty($r['is_descrizione'])) {
- echo '
- '.Translator::numberToLocale($r['perc_iva'], 0);
- }
- echo '
- |
';
- $autofill['count'] += $count;
-
- $sconto[] = $r['sconto'];
- $imponibile[] = $r['subtotale'];
- $iva[] = $r['iva'];
+ $autofill->next();
}
-$sconto = sum($sconto);
-$imponibile = sum($imponibile);
-$iva = sum($iva);
-
-$totale = $imponibile - $sconto;
-
echo '
|autofill|
';
+// Calcoli
+$imponibile = $documento->imponibile;
+$sconto = $documento->sconto;
+$totale_imponibile = $documento->totale_imponibile;
+$totale_iva = $documento->iva;
+$totale = $documento->totale;
+
+$show_sconto = $sconto > 0;
+
// TOTALE COSTI FINALI
if ($options['pricing'] and !isset($options['hide_total'])) {
// Totale imponibile
@@ -202,12 +183,12 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
- '.moneyFormat($imponibile, 2).'
+ '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
|
';
// Eventuale sconto incondizionato
- if (!empty($sconto)) {
+ if ($show_sconto) {
echo '
@@ -215,7 +196,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
|
- -'.moneyFormat($sconto, 2).'
+ '.moneyFormat($sconto, 2).'
|
';
@@ -227,7 +208,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
- '.moneyFormat($totale, 2).'
+ '.moneyFormat($totale_imponibile, 2).'
|
';
}
@@ -240,17 +221,15 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
- '.moneyFormat($iva, 2).'
+ '.moneyFormat($totale_iva, 2).'
|
';
- $totale = sum($totale, $iva);
-
// TOTALE
echo '
- '.tr('Quotazione totale', [], ['upper' => true]).':
+ '.tr('Totale documento', [], ['upper' => true]).':
|
'.moneyFormat($totale, 2).'
@@ -262,15 +241,7 @@ echo'
|
';
// CONDIZIONI GENERALI DI FORNITURA
-
-// Lettura pagamenti
-$rs = $dbo->fetchArray('SELECT * FROM co_pagamenti WHERE id = '.$records[0]['idpagamento']);
-$pagamento = $rs[0]['descrizione'];
-
-// Lettura resa
-
-//$rs = $dbo->fetchArray('SELECT * FROM dt_porto WHERE id = '.$records[0]['idporto']);
-//$resa_materiale = $rs[0]['descrizione'];
+$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.$documento['idpagamento']);
echo '
@@ -286,20 +257,10 @@ echo '
- '.$pagamento.'
+ '.$pagamento['descrizione'].'
|
-
-
'.tr('Validità offerta', [], ['upper' => true]).'
@@ -307,10 +268,10 @@ echo '
| ';
- if (!empty($records[0]['validita'])) {
+ if (!empty($documento['validita'])) {
echo'
'.tr('_TOT_ giorni', [
- '_TOT_' => $records[0]['validita'],
+ '_TOT_' => $documento['validita'],
]);
} else {
echo '-';
@@ -326,7 +287,7 @@ echo '
|
- '.$records[0]['tempi_consegna'].'
+ '.$documento['tempi_consegna'].'
|
@@ -336,7 +297,7 @@ echo '
- '.nl2br($records[0]['esclusioni']).'
+ '.nl2br($documento['esclusioni']).'
|
';
@@ -345,17 +306,19 @@ echo '
echo '
'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'
';
-//Firma
-echo '
-
-
- lì, ___________________________
- |
-
-
- FIRMA PER ACCETTAZIONE
- _____________________________________________
- |
-
-
+// Firma
+echo '
+
+
+
+
+ '.tr('lì').', ___________________________
+ |
+
+
+ '.tr('Firma per accettazione', [], ['upper' => true]).'
+ _____________________________________________
+ |
+
+
';
diff --git a/templates/preventivi/init.php b/templates/preventivi/init.php
index 108b5adc8..bbe7c61f4 100644
--- a/templates/preventivi/init.php
+++ b/templates/preventivi/init.php
@@ -2,10 +2,9 @@
include_once __DIR__.'/../../core.php';
-$module_name = 'Preventivi';
+use Modules\Preventivi\Preventivo;
-// Lettura info fattura
-$records = $dbo->fetchArray('SELECT *, data_bozza AS data FROM co_preventivi WHERE co_preventivi.id='.prepare($id_record));
+$documento = Preventivo::find($id_record);
-$id_cliente = $records[0]['idanagrafica'];
-$id_sede = $records[0]['idsede'];
+$id_cliente = $documento['idanagrafica'];
+$id_sede = $documento['idsede'];
diff --git a/update/2_4_11.sql b/update/2_4_11.sql
new file mode 100644
index 000000000..21b154f81
--- /dev/null
+++ b/update/2_4_11.sql
@@ -0,0 +1 @@
+UPDATE `zz_prints` SET `filename` = 'Preventivo num. {numero} del {data}' WHERE `name` = 'Preventivo (senza totali)';