From 7fcc94881373c383539fecabc7a81facd475b472 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 12 Jul 2019 12:40:13 +0200 Subject: [PATCH] Aggiornamento stampe --- modules/articoli/edit.php | 11 +- modules/articoli/src/Articolo.php | 32 +++- modules/contratti/row-list.php | 2 +- modules/ddt/row-list.php | 2 +- modules/fatture/row-list.php | 2 +- modules/ordini/row-list.php | 2 +- modules/preventivi/row-list.php | 2 +- src/Prints.php | 14 +- src/Util/Autofill.php | 100 +++++++++++ templates/contratti/body.php | 213 +++++++++++++----------- templates/contratti/init.php | 9 +- templates/ddt/body.php | 163 ++++++++---------- templates/ddt/footer.php | 22 ++- templates/ddt/header.php | 2 +- templates/ddt/init.php | 55 +++--- templates/fatture/body.php | 165 ++++++++---------- templates/fatture/footer.php | 26 ++- templates/fatture/header.php | 4 +- templates/fatture/init.php | 6 +- templates/fatture/settings.php | 2 +- templates/ordini/body.php | 268 +++++++++++++----------------- templates/ordini/init.php | 19 +-- templates/preventivi/body.php | 243 ++++++++++++--------------- templates/preventivi/init.php | 9 +- update/2_4_11.sql | 1 + 25 files changed, 687 insertions(+), 687 deletions(-) create mode 100644 src/Util/Autofill.php create mode 100644 update/2_4_11.sql diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index cfcea1918..90cd8448f 100644 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -4,15 +4,6 @@ include_once __DIR__.'/../../core.php'; $_SESSION['superselect']['id_categoria'] = $record['id_categoria']; -$img = null; -if (!empty($record['immagine'])) { - $fileinfo = Uploads::fileInfo($record['immagine']); - - $default_img = '/'.Uploads::getDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension']; - - $img = file_exists(DOCROOT.$default_img) ? ROOTDIR.$default_img : ROOTDIR.'/'.Uploads::getDirectory($id_module).'/'.$record['immagine']; -} - ?>
@@ -26,7 +17,7 @@ if (!empty($record['immagine'])) {
- {[ "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 " - + '; + +if ($options['pricing']) { + echo " - + '; +} + +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 ' '; - echo " - '; - if ($options['pricing']) { - // Prezzo unitario - echo " - '; + '; + + // Imponibile + echo ' + '; + } } 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 ' - '; + // Eventuale sconto incondizionato + if ($show_sconto) { echo ' - '; + + // Totale imponibile + echo ' + + + + + '; } + // IVA + echo ' + + + + + '; + // TOTALE echo ' - '; @@ -227,10 +247,7 @@ echo'
".tr('Descrizione', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true]).'".tr('Prezzo unitario', [], ['upper' => true])."".tr('Imponibile', [], ['upper' => true]).'".tr('Imponibile', [], ['upper' => true]).'
'.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 '
"; - 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 (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 '
+ '.moneyFormat($riga->totale_imponibile).' + --
'.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + + '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
'.tr('Sconto', [], ['upper' => true]).': + '.moneyFormat($sconto, 2).'
+ '.tr('Totale imponibile', [], ['upper' => true]).': + + '.moneyFormat($totale_imponibile, 2).' +
+ '.tr('Totale IVA', [], ['upper' => true]).': + + '.moneyFormat($totale_iva, 2).' +
- '.tr('Quotazione totale', [], ['upper' => true]).': + '.tr('Totale documento', [], ['upper' => true]).': + '.moneyFormat($totale, 2).'
'; // 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 ' @@ -257,10 +274,10 @@ echo '
- '.$pagamento.' + '.$pagamento['descrizione'].'
'; - 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']) { '; @@ -58,7 +72,7 @@ if ($options['pricing']) { '; } 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').'

".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).'

".tr('Note', [], ['upper' => true]).'

- '.nl2br($records[0]['note']).' + '.nl2br($documento['note']).'
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 ' '; - echo ' - '; - // Prezzo unitario - echo " - '; - // Imponibile - echo " - '; - // Iva - echo ' - '; + } else { + echo ' + + + + '; } + echo ' - '; - $autofill['count'] += $count; + $autofill->next(); } echo ' @@ -177,27 +147,23 @@ 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 '
'; - 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 (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 '
"; - if (empty($r['is_descrizione'])) { + // Imponibile echo ' - '.moneyFormat($riga->totale_imponibile); - } - echo ' + + '.moneyFormat($riga->totale_imponibile).' '; - if (empty($r['is_descrizione'])) { + // Iva echo ' - '.Translator::numberToLocale($riga->aliquota->percentuale, 0); + + '.Translator::numberToLocale($riga->aliquota->percentuale, 0).' +
'; // 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$
- +
"; if ($has_image) { - echo " '; + echo " + '; } -echo " - - + + echo " + + '; + +if ($options['pricing']) { + echo " - + '; +} + + 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 ' - '; + + $autofill->set(5); + } else { + echo ' + '; } - echo ' - '; } echo ' - '; - echo " - '; - if ($options['pricing']) { - // Prezzo unitario - echo " - '; - // Imponibile - echo " - '; + + // Imponibile + echo ' + '; + + // Iva + echo ' + '; + } } else { echo ' - - '; + '; + + if ($options['pricing']) { + echo ' + + + '; + } } - // Iva 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 ' - '; // Eventuale sconto incondizionato - if (!empty($sconto)) { + if ($show_sconto) { echo ' - '; // Totale imponibile echo ' - '; } @@ -245,22 +213,20 @@ if ($options['pricing']) { // IVA echo ' - '; - $totale = sum($totale, $iva); - // TOTALE echo ' -

'.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 "
".tr('Immagine', [], ['upper' => true]).'".tr('Immagine', [], ['upper' => true]).'".tr('Descrizione', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true])."".tr('Descrizione', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true]).'".tr('Prezzo unitario', [], ['upper' => true])." ".tr('Importo', [], ['upper' => true])."".tr('IVA', [], ['upper' => true]).' (%)".tr('IVA', [], ['upper' => true]).' (%)
'; - if (!empty($r['immagine_articolo'])) { - echo ''; + if ($riga->isArticolo()) { + 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 '
"; - 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 (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 ' -
"; - 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 '
+ '.moneyFormat($riga->totale_imponibile).' + + '.Translator::numberToLocale($riga->aliquota->percentuale, 0).' + --'; - if (empty($r['is_descrizione'])) { - echo ' - '.Translator::numberToLocale($r['perc_iva'], 0); - } - echo ' -
+ '.tr('Imponibile', [], ['upper' => true]).': - '.moneyFormat($imponibile, 2).' + '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
+ '.tr('Sconto', [], ['upper' => true]).': - -'.moneyFormat($sconto, 2).' + '.moneyFormat($sconto, 2).'
+ '.tr('Totale imponibile', [], ['upper' => true]).': - '.moneyFormat($totale, 2).' + '.moneyFormat($totale_imponibile, 2).'
+ '.tr('Totale IVA', [], ['upper' => true]).': - '.moneyFormat($iva, 2).' + '.moneyFormat($totale_iva, 2).'
- '.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 " - + '; + +if ($options['pricing']) { + echo " - - + + '; +} + +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 ' '; - echo " - '; - if ($options['pricing']) { - // Prezzo unitario - echo " - '; - // Imponibile - echo " - '; + + // Imponibile + echo ' + '; + + // Iva + echo ' + '; + } } else { echo ' - - '; + '; + + if ($options['pricing']) { + echo ' + + + '; + } } - // Iva 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'])) { '; // Eventuale sconto incondizionato - if (!empty($sconto)) { + if ($show_sconto) { echo ' '; @@ -227,7 +208,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) { '; } @@ -240,17 +221,15 @@ if ($options['pricing'] and !isset($options['hide_total'])) { '; - $totale = sum($totale, $iva); - // TOTALE echo '
".tr('Descrizione', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true])."".tr('Q.tà', [], ['upper' => true]).'".tr('Prezzo unitario', [], ['upper' => true])."".tr('Imponibile', [], ['upper' => true])."".tr('IVA', [], ['upper' => true]).' (%)".tr('Importo', [], ['upper' => true])."".tr('IVA', [], ['upper' => true]).' (%)
'.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 '
"; - 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 (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 ' -
"; - 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 '
+ '.moneyFormat($riga->totale_imponibile).' + + '.Translator::numberToLocale($riga->aliquota->percentuale, 0).' + --'; - if (empty($r['is_descrizione'])) { - echo ' - '.Translator::numberToLocale($r['perc_iva'], 0); - } - echo ' -
- '.moneyFormat($imponibile, 2).' + '.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
@@ -215,7 +196,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) { - -'.moneyFormat($sconto, 2).' + '.moneyFormat($sconto, 2).'
- '.moneyFormat($totale, 2).' + '.moneyFormat($totale_imponibile, 2).'
- '.moneyFormat($iva, 2).' + '.moneyFormat($totale_iva, 2).'
- '.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 ' - - @@ -336,7 +297,7 @@ 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'].'
- '.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)';