1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2024-12-22 21:28:08 +01:00

Aggiornamento stampe

This commit is contained in:
Thomas Zilio 2019-07-12 12:40:13 +02:00
parent 939ba2dea0
commit 7fcc948813
25 changed files with 687 additions and 687 deletions

View File

@ -4,15 +4,6 @@ include_once __DIR__.'/../../core.php';
$_SESSION['superselect']['id_categoria'] = $record['id_categoria']; $_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'];
}
?><form action="" method="post" id="edit-form" enctype="multipart/form-data"> ?><form action="" method="post" id="edit-form" enctype="multipart/form-data">
<input type="hidden" name="backto" value="record-edit"> <input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update"> <input type="hidden" name="op" value="update">
@ -26,7 +17,7 @@ if (!empty($record['immagine'])) {
<div class="panel-body"> <div class="panel-body">
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine", "class": "img-thumbnail", "value": "<?php echo $img; ?>" ]} {[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine", "class": "img-thumbnail", "value": "<?php echo $articolo->image; ?>" ]}
</div> </div>
<div class="col-md-4"> <div class="col-md-4">

View File

@ -3,7 +3,9 @@
namespace Modules\Articoli; namespace Modules\Articoli;
use Common\Model; use Common\Model;
use Modules;
use Modules\Interventi\Components\Articolo as ArticoloIntervento; use Modules\Interventi\Components\Articolo as ArticoloIntervento;
use Uploads;
class Articolo extends Model class Articolo extends Model
{ {
@ -65,8 +67,36 @@ class Articolo extends Model
return true; return true;
} }
public function articolo() public function articoli()
{ {
return $this->hasMany(ArticoloIntervento::class, 'idarticolo'); 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';
}
} }

View File

@ -164,7 +164,7 @@ if (abs($sconto) > 0) {
echo ' echo '
<tr> <tr>
<td colspan="5"" class="text-right"> <td colspan="5"" class="text-right">
<b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':< <b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b>
</td> </td>
<td class="text-right"> <td class="text-right">
'.moneyFormat($sconto, 2).' '.moneyFormat($sconto, 2).'

View File

@ -231,7 +231,7 @@ if (abs($sconto) > 0) {
echo ' echo '
<tr> <tr>
<td colspan="5" class="text-right"> <td colspan="5" class="text-right">
<b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':< <b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b>
</td> </td>
<td align="right"> <td align="right">

View File

@ -308,7 +308,7 @@ if (!empty($sconto)) {
echo ' echo '
<tr> <tr>
<td colspan="5" class="text-right"> <td colspan="5" class="text-right">
<b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b> <b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"><i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b>
</td> </td>
<td align="right"> <td align="right">
'.moneyFormat($sconto, 2).' '.moneyFormat($sconto, 2).'

View File

@ -224,7 +224,7 @@ if (abs($sconto) > 0) {
echo ' echo '
<tr> <tr>
<td colspan="5" class="text-right"> <td colspan="5" class="text-right">
<b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':< <b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b>
</td> </td>
<td align="right"> <td align="right">
'.moneyFormat($sconto, 2).' '.moneyFormat($sconto, 2).'

View File

@ -167,7 +167,7 @@ if (abs($sconto) > 0) {
echo ' echo '
<tr> <tr>
<td colspan="5" class="text-right"> <td colspan="5" class="text-right">
<b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':< <b><span class="tip" title="'.tr('Un importo positivo indica uno sconto, mentre uno negativo indica una maggiorazione').'"> <i class="fa fa-question-circle-o"></i> '.tr('Sconto/maggiorazione', [], ['upper' => true]).':</span></b>
</td> </td>
<td align="right"> <td align="right">
'.moneyFormat($sconto, 2).' '.moneyFormat($sconto, 2).'

View File

@ -454,19 +454,7 @@ class Prints
$report = ob_get_clean(); $report = ob_get_clean();
if (!empty($autofill)) { if (!empty($autofill)) {
$result = ''; $result = $autofill->generate();
// max($autofill['additional']) = $autofill['rows'] - 1
for ($i = (floor($autofill['count']) % $autofill['rows']); $i < $autofill['additional']; ++$i) {
$result .= '
<tr>';
for ($c = 0; $c < $autofill['columns']; ++$c) {
$result .= '
<td>&nbsp;</td>';
}
$result .= '
</tr>';
}
$report = str_replace('|autofill|', $result, $report); $report = str_replace('|autofill|', $result, $report);
} }

100
src/Util/Autofill.php Normal file
View File

@ -0,0 +1,100 @@
<?php
namespace Util;
/**
* Classe dedicata alla gestione delle righe fantasma per il miglioramento grafico delle stampe tabellari.
*
* @since 2.3
*/
class Autofill
{
protected $space = 0;
protected $current = 0;
protected $char_number;
protected $column_number;
protected $max_rows = 20;
protected $max_rows_first_page = 20;
protected $max_additional = 15;
public function __construct($column_number, $char_number = 70)
{
$this->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, '<br>');
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 .= '
<tr>';
for ($c = 0; $c < $this->column_number; ++$c) {
$result .= '
<td>&nbsp;</td>';
}
$result .= '
</tr>';
}
return $result;
}
}

View File

@ -2,28 +2,23 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$autofill = [ // Creazione righe fantasma
'count' => 0, // Conteggio delle righe $autofill = new \Util\Autofill($options['pricing'] ? 4 : 2);
'words' => 70, // Numero di parolo dopo cui contare una riga nuova $autofill->setRows(20, 10);
'rows' => 20, // Numero di righe massimo presente nella pagina
'additional' => 10, // Numero di righe massimo da aggiungere
'columns' => 4, // Numero di colonne della tabella
];
echo ' echo '
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-6">
<div class="text-center" style="height:5mm;"> <div class="text-center" style="height:5mm;">
<b>'.tr('Contratto num. _NUM_ del _DATE_', [ <b>'.tr('Contratto num. _NUM_ del _DATE_', [
'_NUM_' => $records[0]['numero'], '_NUM_' => $documento['numero'],
'_DATE_' => Translator::dateToLocale($records[0]['data_bozza']), '_DATE_' => Translator::dateToLocale($documento['data_bozza']),
], ['upper' => true]).'</b> ], ['upper' => true]).'</b>
</div>'; </div>';
// Elenco impianti // Elenco impianti
if (!empty($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']).')');
$impianti = $dbo->fetchArray('SELECT nome, matricola FROM my_impianti WHERE id IN ('.$records[0]['idimpianti'].')'); if (!empty($impianti)) {
$list = []; $list = [];
foreach ($impianti as $impianto) { foreach ($impianti as $impianto) {
$list[] = $impianto['nome']." <span style='color:#777;'>(".$impianto['matricola'].')</span>'; $list[] = $impianto['nome']." <span style='color:#777;'>(".$impianto['matricola'].')</span>';
@ -34,6 +29,7 @@ if (!empty($records[0]['idimpianti'])) {
<p class="small-bold">'.tr('Impianti', [], ['upper' => true]).'</p> <p class="small-bold">'.tr('Impianti', [], ['upper' => true]).'</p>
<p><small>'.implode(', ', $list).'</small></p>'; <p><small>'.implode(', ', $list).'</small></p>';
} }
echo ' echo '
</div> </div>
@ -69,156 +65,180 @@ echo '
</div>'; </div>';
// Descrizione // Descrizione
if (!empty($records[0]['desc_contratto'])) { if (!empty($documento['descrizione'])) {
echo ' echo '
<p>'.nl2br($records[0]['desc_contratto']).'</p> <p>'.nl2br($documento['descrizione']).'</p>
<br>'; <br>';
} }
$sconto = [];
$imponibile = [];
$iva = [];
// Intestazione tabella per righe // Intestazione tabella per righe
echo " echo "
<table class='table table-striped table-bordered' id='contents'> <table class='table table-striped table-bordered' id='contents'>
<thead> <thead>
<tr> <tr>
<th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th> <th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true])."</th> <th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true]).'</th>';
if ($options['pricing']) {
echo "
<th class='text-center' style='width:20%'>".tr('Prezzo unitario', [], ['upper' => true])."</th> <th class='text-center' style='width:20%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:20%'>".tr('Imponibile', [], ['upper' => true]).'</th> <th class='text-center' style='width:20%'>".tr('Imponibile', [], ['upper' => true]).'</th>';
}
echo '
</tr> </tr>
</thead> </thead>
<tbody>'; <tbody>';
// RIGHE PREVENTIVO CON ORDINAMENTO UNICO // Righe documento
$righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`'); $righe = $documento->getRighe();
foreach ($righe as $r) { foreach ($righe as $riga) {
$count = 0; $r = $riga->toArray();
$count += ceil(strlen($r['descrizione']) / $autofill['words']);
$count += substr_count($r['descrizione'], PHP_EOL); $autofill->count($r['descrizione']);
echo ' echo '
<tr> <tr>
<td> <td>
'.nl2br($r['descrizione']); '.nl2br($r['descrizione']);
if (!empty($r['codice_articolo'])) { if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo ' echo '
<br><small>'.tr('COD. _COD_', [ <br><small>'.$text.'</small>';
'_COD_' => $r['codice_articolo'],
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
} }
echo ' echo '
</td>'; </td>';
echo " if (!$riga->isDescrizione()) {
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um']; <td class="text-center">
} '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
echo '
</td>'; </td>';
if ($options['pricing']) { if ($options['pricing']) {
// Prezzo unitario // Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta'])); <td class="text-right">
} '.moneyFormat($riga->prezzo_unitario_vendita);
echo '
</td>';
// Imponibile if ($riga->sconto > 0) {
echo " $text = tr('sconto _TOT_ _TYPE_', [
<td class='text-right'>"; '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
if (empty($r['is_descrizione'])) { '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
echo ' ]);
'.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
if ($r['sconto'] > 0) {
echo ' echo '
<br><small class="help-block">- '.tr('sconto _TOT_ _TYPE_', [ <br><small class="text-muted">'.$text.'</small>';
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
} }
}
echo ' echo '
</td>'; </td>';
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
}
} else { } else {
echo ' echo '
<td class="text-center">-</td> <td></td>';
<td class="text-center">-</td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>';
}
} }
echo ' echo '
</tr>'; </tr>';
$autofill['count'] += $count; $autofill->next();
$sconto[] = $r['sconto'];
$imponibile[] = $r['subtotale'];
} }
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$totale = $imponibile - $sconto;
echo ' echo '
|autofill| |autofill|
</tbody>'; </tbody>';
// 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 // TOTALE COSTI FINALI
if ($options['pricing']) { if ($options['pricing']) {
// Eventuale sconto incondizionato // Totale imponibile
if ($sconto > 0) { echo '
// Totale imponibile
echo '
<tr> <tr>
<td colspan="3" class="text-right border-top"> <td colspan="3" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b> <b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td> </td>
<th class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b> <b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th> </th>
</tr>'; </tr>';
// Eventuale sconto incondizionato
if ($show_sconto) {
echo ' echo '
<tr> <tr>
<td colspan="3" class="text-right border-top"> <td colspan="3" class="text-right border-top">
<b>'.tr('Sconto', [], ['upper' => true]).':</b> <b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td> </td>
<th class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($sconto, 2).'</b> <b>'.moneyFormat($sconto, 2).'</b>
</th> </th>
</tr>'; </tr>';
// Totale imponibile
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Totale imponibile', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_imponibile, 2).'</b>
</th>
</tr>';
} }
// IVA
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Totale IVA', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_iva, 2).'</b>
</th>
</tr>';
// TOTALE // TOTALE
echo ' echo '
<tr> <tr>
<td colspan="3" class="text-right border-top"> <td colspan="3" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b> <b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td> </td>
<th class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b> <b>'.moneyFormat($totale, 2).'</b>
</th> </th>
</tr>'; </tr>';
@ -227,10 +247,7 @@ echo'
</table>'; </table>';
// CONDIZIONI GENERALI DI FORNITURA // CONDIZIONI GENERALI DI FORNITURA
$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.$documento['idpagamento']);
// Lettura pagamenti
$rs = $dbo->fetchArray('SELECT * FROM co_pagamenti WHERE id = '.$records[0]['idpagamento']);
$pagamento = $rs[0]['descrizione'];
echo ' echo '
<table class="table table-bordered"> <table class="table table-bordered">
@ -246,7 +263,7 @@ echo '
</th> </th>
<td> <td>
'.$pagamento.' '.$pagamento['descrizione'].'
</td> </td>
</tr> </tr>
@ -257,10 +274,10 @@ echo '
<td>'; <td>';
if (!empty($records[0]['validita'])) { if (!empty($documento['validita'])) {
echo' echo'
'.tr('_TOT_ giorni', [ '.tr('_TOT_ giorni', [
'_TOT_' => $records[0]['validita'], '_TOT_' => $documento['validita'],
]); ]);
} else { } else {
echo '-'; echo '-';
@ -277,11 +294,11 @@ echo '
<td>'; <td>';
if (!empty($records[0]['data_accettazione']) && !empty($records[0]['data_conclusione'])) { if (!empty($documento['data_accettazione']) && !empty($documento['data_conclusione'])) {
echo ' echo '
'.tr('dal _START_ al _END_', [ '.tr('dal _START_ al _END_', [
'_START_' => Translator::dateToLocale($records[0]['data_accettazione']), '_START_' => Translator::dateToLocale($documento['data_accettazione']),
'_END_' => Translator::dateToLocale($records[0]['data_conclusione']), '_END_' => Translator::dateToLocale($documento['data_conclusione']),
]); ]);
} else { } else {
echo '-'; echo '-';
@ -297,13 +314,13 @@ echo '
</th> </th>
<td> <td>
'.nl2br($records[0]['esclusioni']).' '.nl2br($documento['esclusioni']).'
</td> </td>
</tr> </tr>
</table>'; </table>';
// Conclusione // Conclusione
if (empty($records[0]['fatturabile'])) { if (empty($documento->stato->fatturabile)) {
echo ' echo '
<p class="text-center"><b>'.tr('Il tutto S.E. & O.').'</b></p> <p class="text-center"><b>'.tr('Il tutto S.E. & O.').'</b></p>
<p class="text-center">'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'</p>'; <p class="text-center">'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'</p>';
@ -314,11 +331,11 @@ echo '<div style="position:absolute; bottom:'.($settings['margins']['bottom'] +
<table> <table>
<tr> <tr>
<td style="vertical-align:bottom;" width="50%"> <td style="vertical-align:bottom;" width="50%">
, ___________________________ '.tr('').', ___________________________
</td> </td>
<td align="center" style="vertical-align:bottom;" width="50%"> <td align="center" style="vertical-align:bottom;" width="50%">
FIRMA PER ACCETTAZIONE<br><br> '.tr('Firma per accettazione', [], ['upper' => true]).'<br><br>
_____________________________________________ _____________________________________________
</td> </td>
</tr> </tr>

View File

@ -2,10 +2,9 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$module_name = 'Contratti'; use Modules\Contratti\Contratto;
// Lettura info fattura $documento = Contratto::find($id_record);
$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));
$id_cliente = $records[0]['idanagrafica']; $id_cliente = $documento['idanagrafica'];
$id_sede = $records[0]['idsede']; $id_sede = $documento['idsede'];

View File

@ -2,17 +2,9 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$autofill = [ // Creazione righe fantasma
'count' => 0, $autofill = new \Util\Autofill($options['pricing'] ? 5 : 2);
'words' => 70, $autofill->setRows(16);
'rows' => 16,
'additional' => 15,
'columns' => $options['pricing'] ? 5 : 2,
];
$imponibile = [];
$iva = [];
$sconto = [];
// Intestazione tabella per righe // Intestazione tabella per righe
echo " echo "
@ -35,133 +27,112 @@ if ($options['pricing']) {
<tbody>'; <tbody>';
// Righe // Righe documento
$rs_gen = $dbo->fetchArray("SELECT *, $righe = $documento->getRighe();
IFNULL((SELECT `codice` FROM `mg_articoli` WHERE `id` = `dt_righe_ddt`.`idarticolo`), '') AS codice_articolo, foreach ($righe as $riga) {
(SELECT GROUP_CONCAT(`serial` SEPARATOR ', ') FROM `mg_prodotti` WHERE `id_riga_ddt` = `dt_righe_ddt`.`id`) AS seriali, $r = $riga->toArray();
(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, $autofill->count($r['descrizione']);
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);
echo ' echo '
<tr> <tr>
<td> <td>
'.nl2br($r['descrizione']); '.nl2br($r['descrizione']);
// Codice articolo if ($riga->isArticolo()) {
if (!empty($r['codice_articolo'])) { // Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo ' echo '
<br><small>'.tr('COD. _COD_', [ <br><small>'.$text.'</small>';
'_COD_' => $r['codice_articolo'],
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
}
// Seriali // Seriali
if (!empty($r['seriali'])) { $seriali = $riga->serials;
echo ' if (!empty($seriali)) {
<br><small>'.tr('SN').': '.$r['seriali'].'</small>'; $text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
} }
} }
// Aggiunta dei riferimenti ai documenti // Aggiunta dei riferimenti ai documenti
if (setting('Riferimento dei documenti nelle stampe')) { 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)) { if (!empty($ref)) {
echo ' echo '
<br><small>'.$ref['description'].'</small>'; <br><small>'.$ref['description'].'</small>';
if ($count <= 1) {
$count += 0.4; $autofill->count($ref['description'], true);
}
} }
} }
echo ' echo '
</td>'; </td>';
echo ' if (!$riga->isDescrizione()) {
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo ' echo '
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um']; <td class="text-center">
} '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
echo ' </td>';
</td>';
if ($options['pricing']) { if ($options['pricing']) {
// Prezzo unitario // Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.moneyFormat($r['subtotale'] / $r['qta']); <td class="text-right">
} '.moneyFormat($riga->prezzo_unitario_vendita);
echo '
</td>';
// Imponibile if ($riga->sconto > 0) {
echo " $text = tr('sconto _TOT_ _TYPE_', [
<td class='text-right'>"; '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
if (empty($r['is_descrizione'])) { '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
echo ' ]);
'.moneyFormat($r['subtotale']);
if ($r['sconto'] > 0) {
if ($count <= 1) {
$count += 0.4;
}
echo ' echo '
<br><small class="help-block">- '.tr('sconto _TOT_ _TYPE_', [ <br><small class="text-muted">'.$text.'</small>';
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()), $autofill->count($text, true);
]).'</small>';
} }
}
echo '
</td>';
// Iva
echo "
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.Translator::numberToLocale($r['perc_iva'], 0); </td>';
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
// Iva
echo '
<td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
</td>';
} }
} else {
echo ' echo '
</td>'; <td></td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
} }
echo ' echo '
</tr>'; </tr>';
$autofill['count'] += $count; $autofill->next();
$imponibile[] = $r['subtotale'];
$iva[] = $r['iva'];
$sconto[] = $r['sconto'];
} }
echo ' echo '
|autofill| |autofill|
</tbody> </tbody>
</table>'; </table>';
// 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'));

View File

@ -1,5 +1,19 @@
<?php <?php
// Calcoli
$imponibile = $documento->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 // TABELLA PRINCIPALE
echo ' echo '
<table class="table-bordered">'; <table class="table-bordered">';
@ -10,7 +24,7 @@ if ($options['pricing']) {
<tr> <tr>
<td rowspan='7'> <td rowspan='7'>
<p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p> <p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p>
<p>'.nl2br($records[0]['note'])."</p> <p>'.nl2br($documento['note'])."</p>
</td> </td>
<td style='width:33mm;'> <td style='width:33mm;'>
<p class='small-bold'>".tr('Totale imponibile', [], ['upper' => true]).'</p> <p class='small-bold'>".tr('Totale imponibile', [], ['upper' => true]).'</p>
@ -29,13 +43,13 @@ if ($options['pricing']) {
echo " echo "
<tr> <tr>
<td style='width:33mm;'> <td style='width:33mm;'>
<p class='small-bold'>".tr('Totale imposte', [], ['upper' => true])."</p> <p class='small-bold'>".tr('Totale IVA', [], ['upper' => true])."</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class='cell-padded text-right'> <td class='cell-padded text-right'>
".moneyFormat($iva, 2).' ".moneyFormat($totale_iva, 2).'
</td> </td>
</tr>'; </tr>';
@ -58,7 +72,7 @@ if ($options['pricing']) {
<tr> <tr>
<td style='height:40mm;'> <td style='height:40mm;'>
<p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p> <p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p>
'.nl2br($records[0]['note']).' '.nl2br($documento['note']).'
</td> </td>
</tr>'; </tr>';
} }

View File

@ -9,7 +9,7 @@ $default_header$
<!-- Dati Ddt --> <!-- Dati Ddt -->
<div class="col-xs-6"> <div class="col-xs-6">
<div class="text-center" style="height:5mm;"> <div class="text-center" style="height:5mm;">
<b>DDT</b> <b>'.tr('DDT').'</b>
</div> </div>
<table class="table"> <table class="table">

View File

@ -2,36 +2,33 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
// Lettura info ddt use Modules\DDT\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);
$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']; $id_sede = $record['idsede_partenza'];
$tipo_doc = $records[0]['tipo_doc']; $pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.prepare($documento['idpagamento']));
if (empty($records[0]['numero_esterno'])) { $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; $numero = 'pro-forma '.$numero;
$tipo_doc = tr('Ddt pro-forma', [], ['upper' => true]); $tipo_doc = tr('DDT pro-forma', [], ['upper' => true]);
} else { } 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) // Leggo i dati della destinazione (se 0=sede legale, se!=altra sede da leggere da tabella an_sedi)
$destinazione = ''; $destinazione = '';
if (!empty($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($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($documento['idsede_destinazione']));
if (!empty($rsd[0]['nomesede'])) { if (!empty($rsd[0]['nomesede'])) {
$destinazione .= $rsd[0]['nomesede'].'<br/>'; $destinazione .= $rsd[0]['nomesede'].'<br/>';
@ -57,21 +54,21 @@ if (!empty($records[0]['idsede_destinazione'])) {
$custom = [ $custom = [
'tipo_doc' => $tipo_doc, 'tipo_doc' => $tipo_doc,
'numero' => $numero, 'numero' => $numero,
'data' => Translator::dateToLocale($records[0]['data']), 'data' => Translator::dateToLocale($documento['data']),
'pagamento' => $records[0]['tipo_pagamento'], 'pagamento' => $pagamento['descrizione'],
'c_destinazione' => $destinazione, 'c_destinazione' => $destinazione,
'aspettobeni' => $records[0]['aspettobeni'], 'aspettobeni' => $aspetto_beni['descrizione'],
'causalet' => $records[0]['causalet'], 'causalet' => $causale['descrizione'],
'porto' => $records[0]['porto'], 'porto' => $porto['descrizione'],
'n_colli' => !empty($records[0]['n_colli']) ? $records[0]['n_colli'] : '', 'n_colli' => !empty($documento['n_colli']) ? $documento['n_colli'] : '',
'spedizione' => $records[0]['spedizione'], 'spedizione' => $spedizione['descrizione'],
'vettore' => $records[0]['vettore'], 'vettore' => $vettore['ragione_sociale'],
]; ];
// Accesso solo a: // Accesso solo a:
// - cliente se è impostato l'idanagrafica di un Cliente // - cliente se è impostato l'idanagrafica di un Cliente
// - utente qualsiasi con permessi almeno in lettura sul modulo // - utente qualsiasi con permessi almeno in lettura sul modulo
// - admin // - 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!')); die(tr('Non hai i permessi per questa stampa!'));
} }

View File

@ -2,17 +2,13 @@
include_once __DIR__.'/../../core.php'; 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_iva = [];
$v_totale = []; $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 // Intestazione tabella per righe
echo " echo "
<table class='table table-striped table-bordered' id='contents'> <table class='table table-striped table-bordered' id='contents'>
@ -26,58 +22,41 @@ echo "
</tr> </tr>
</thead> </thead>
<tfoot>
<tr>
<td style="border-top:none; border-bottom:1px solid #aaa;"></td>
<td style="border-top:none; border-bottom:1px solid #aaa;"></td>
<td style="border-top:none; border-bottom:1px solid #aaa;"></td>
<td style="border-top:none; border-bottom:1px solid #aaa;"></td>
<td style="border-top:none; border-bottom:1px solid #aaa;"></td>
</tr>
</tfoot>
<tbody>'; <tbody>';
// RIGHE FATTURA CON ORDINAMENTO UNICO // Righe documento
$righe = $fattura->getRighe(); $righe = $documento->getRighe();
foreach ($righe as $riga) { foreach ($righe as $riga) {
$r = $riga->toArray(); $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); $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 '
<tr> <tr>
<td> <td>
'.nl2br($r['descrizione']); '.nl2br($r['descrizione']);
// Codice articolo if ($riga->isArticolo()) {
if (!empty($r['codice_articolo'])) { // Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo ' echo '
<br><small>'.tr('COD. _COD_', [ <br><small>'.$text.'</small>';
'_COD_' => $r['codice_articolo'],
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
}
// Seriali // Seriali
if (!empty($r['seriali'])) { $seriali = $riga->serials;
echo ' if (!empty($seriali)) {
<br><small>'.tr('SN').': '.$r['seriali'].'</small>'; $text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
} }
} }
@ -93,9 +72,7 @@ foreach ($righe as $riga) {
echo ' echo '
<br><small>'.$text.'</small>'; <br><small>'.$text.'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
} }
// Aggiunta dei riferimenti ai documenti // Aggiunta dei riferimenti ai documenti
@ -106,69 +83,62 @@ foreach ($righe as $riga) {
echo ' echo '
<br><small>'.$ref['description'].'</small>'; <br><small>'.$ref['description'].'</small>';
if ($count <= 1) { $autofill->count($ref['description'], true);
$count += 0.4;
}
} }
} }
echo ' echo '
</td>'; </td>';
echo ' if (!$riga->isDescrizione()) {
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo ' echo '
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um']; <td class="text-center">
} '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
echo '
</td>'; </td>';
// Prezzo unitario // Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) ? '' : moneyFormat($riga->prezzo_unitario_vendita)); <td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
if ($riga->sconto > 0) { if ($riga->sconto > 0) {
echo " $text = tr('sconto _TOT_ _TYPE_', [
<br><small class='text-muted'>".tr('sconto _TOT_ _TYPE_', [ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
'_TOT_' => Translator::numberToLocale($riga->sconto_unitario), '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
'_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()), ]);
]).'</small>';
if ($count <= 1) { echo '
$count += 0.4; <br><small class="text-muted">'.$text.'</small>';
}
$autofill->count($text, true);
} }
}
echo ' echo '
</td>'; </td>';
// Imponibile // Imponibile
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.moneyFormat($riga->totale_imponibile); <td class="text-right">
} '.moneyFormat($riga->totale_imponibile).'
echo '
</td>'; </td>';
// Iva // Iva
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo ' echo '
'.Translator::numberToLocale($riga->aliquota->percentuale, 0); <td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
</td>';
} else {
echo '
<td></td>
<td></td>
<td></td>
<td></td>';
} }
echo ' echo '
</td>
</tr>'; </tr>';
$autofill['count'] += $count; $autofill->next();
} }
echo ' echo '
@ -177,27 +147,23 @@ echo '
</table>'; </table>';
// Aggiungo diciture particolari per l'anagrafica cliente // 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'])) { if (!empty($dicitura['dicitura'])) {
$testo = $dicitura[0]['diciturafissafattura']; echo '
<p class="text-center">
echo " <b>'.nl2br($dicitura['dicitura']).'</b>
<p class='text-center'>
<b>".nl2br($testo).'</b>
</p>'; </p>';
} }
// Aggiungo diciture per condizioni iva particolari // Aggiungo diciture per condizioni iva particolari
foreach ($v_iva as $key => $value) { 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'])) { if (!empty($dicitura['dicitura'])) {
$testo = $dicitura[0]['dicitura']; echo '
<p class="text-center">
echo " <b>'.nl2br($dicitura['dicitura']).'</b>
<p class='text-center'>
<b>".nl2br($testo).'</b>
</p>'; </p>';
} }
} }
@ -212,6 +178,7 @@ echo '
<p class="small-bold">'.tr('Note', [], ['upper' => true]).':</p> <p class="small-bold">'.tr('Note', [], ['upper' => true]).':</p>
<p>'.nl2br($record['note']).'</p>'; <p>'.nl2br($record['note']).'</p>';
} }
echo ' echo '
</td>'; </td>';

View File

@ -1,12 +1,12 @@
<?php <?php
// Calcoli // Calcoli
$imponibile = $fattura->imponibile; $imponibile = $documento->imponibile;
$sconto = $fattura->sconto; $sconto = $documento->sconto;
$totale_imponibile = $fattura->totale_imponibile; $totale_imponibile = $documento->totale_imponibile;
$totale_iva = $fattura->iva; $totale_iva = $documento->iva;
$totale = $fattura->totale; $totale = $documento->totale;
$netto_a_pagare = $fattura->netto; $netto_a_pagare = $documento->netto;
$show_sconto = $sconto > 0; $show_sconto = $sconto > 0;
$width = round(100 / ($show_sconto ? 5 : 3), 2); $width = round(100 / ($show_sconto ? 5 : 3), 2);
@ -207,10 +207,8 @@ if (!empty($record['rivalsainps'])) {
</tr>'; </tr>';
} }
$fattura = \Modules\Fatture\Fattura::find($id_record);
// Ritenuta d'acconto ( + se no rivalsa inps) // 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)'); $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; $first_colspan = 3;
@ -222,7 +220,7 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
} }
$contributi = (!empty($record['ritenutaacconto']) ? ' - ' : '').tr('contributi: _PRC_%', [ $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_%', [ $acconto = tr('acconto: _PRC_%', [
'_PRC_' => Translator::numberToLocale($rs2[0]['percentuale'], 0), '_PRC_' => Translator::numberToLocale($rs2[0]['percentuale'], 0),
@ -233,7 +231,7 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
<th class="text-center small" colspan="'.$first_colspan.'"> <th class="text-center small" colspan="'.$first_colspan.'">
'.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [ '.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [
'_ACCONTO_' => $acconto, '_ACCONTO_' => $acconto,
'_CONTRIBUTI_' => empty($fattura->ritenutaContributi) ? null : $contributi, '_CONTRIBUTI_' => empty($documento->ritenutaContributi) ? null : $contributi,
], ['upper' => true]).' ], ['upper' => true]).'
</th>'; </th>';
@ -252,13 +250,13 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
<tr> <tr>
<td class="cell-padded text-center" colspan="'.$first_colspan.'"> <td class="cell-padded text-center" colspan="'.$first_colspan.'">
'.moneyFormat(abs($fattura->ritenuta_acconto) + $fattura->totale_ritenuta_contributi, 2).' '.moneyFormat(abs($documento->ritenuta_acconto) + $documento->totale_ritenuta_contributi, 2).'
</td>'; </td>';
echo ' echo '
<td class="cell-padded text-center" colspan="'.$second_colspan.'"> <td class="cell-padded text-center" colspan="'.$second_colspan.'">
'.moneyFormat($totale - abs($fattura->ritenuta_acconto) - $fattura->totale_ritenuta_contributi, 2).' '.moneyFormat($totale - abs($documento->ritenuta_acconto) - $documento->totale_ritenuta_contributi, 2).'
</td> </td>
</tr>'; </tr>';
} }
@ -286,7 +284,7 @@ if (!empty($record['split_payment'])) {
</td> </td>
<td class="cell-padded text-center" colspan="'.$second_colspan.'"> <td class="cell-padded text-center" colspan="'.$second_colspan.'">
'.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).'
</td> </td>
</tr>'; </tr>';
} }

View File

@ -20,11 +20,11 @@ echo '
<div class="row"> <div class="row">
<!-- Dati Fattura --> <!-- Dati Fattura -->
<div class="col-xs-6"> <div class="col-xs-6">
<div class="text-left" style="height:5mm;"> <div class="text-center" style="height:5mm;">
<b>$tipo_doc$</b> <b>$tipo_doc$</b>
</div> </div>
<table class="table" style="overflow: visible;"> <table class="table" style="overflow: visible; width: 100%">
<tr> <tr>
<td valign="top" class="border-full text-center"> <td valign="top" class="border-full text-center">
<p class="small-bold">'.tr('Nr. documento', [], ['upper' => true]).'</p> <p class="small-bold">'.tr('Nr. documento', [], ['upper' => true]).'</p>

View File

@ -4,8 +4,8 @@ include_once __DIR__.'/../../core.php';
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
$fattura = Fattura::find($id_record); $documento = Fattura::find($id_record);
$banca = $fattura->getBanca(); $banca = $documento->getBanca();
// Lettura info fattura // Lettura info fattura
$record = $dbo->fetchOne('SELECT *, $record = $dbo->fetchOne('SELECT *,
@ -71,7 +71,7 @@ if (!empty($record['idsede_destinazione'])) {
$destinazione .= ' ('.$rsd[0]['provincia'].')'; $destinazione .= ' ('.$rsd[0]['provincia'].')';
} }
$settings['header-height'] += 7; $settings['header-height'] += 15;
} }
// Sostituzioni specifiche // Sostituzioni specifiche

View File

@ -1,6 +1,6 @@
<?php <?php
return [ return [
'header-height' => 80, 'header-height' => 70,
'footer-height' => 55, 'footer-height' => 55,
]; ];

View File

@ -2,49 +2,25 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
function findKey($array, $keySearch) // Righe documento
{ $righe = $documento->getRighe();
foreach ($array as $key => $item) {
if ($key == $keySearch) {
return true;
} elseif (is_array($item) && findKey($item, $keySearch)) {
echo $key;
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; // Creazione righe fantasma
$autofill = new \Util\Autofill($columns, $char_number);
// RIGHE ORDINE $autofill->setRows(30);
$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 = [];
// Intestazione tabella per righe // Intestazione tabella per righe
echo " echo "
@ -53,191 +29,183 @@ echo "
<tr>"; <tr>";
if ($has_image) { if ($has_image) {
echo " <th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true]).'</th>'; echo "
<th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true]).'</th>';
} }
echo "
<th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th> echo "
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true])."</th> <th class='text-center'>".tr('Descrizione', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true]).'</th>';
if ($options['pricing']) {
echo "
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th> <th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:15%'>".tr('Importo', [], ['upper' => true])."</th> <th class='text-center' style='width:15%'>".tr('Importo', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th> <th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th>';
}
echo '
</tr> </tr>
</thead> </thead>
<tbody>'; <tbody>';
foreach ($righe as $r) { foreach ($righe as $riga) {
$count = 0; $r = $riga->toArray();
$count += ceil(strlen($r['descrizione']) / $autofill['words']);
$count += substr_count($r['descrizione'], PHP_EOL); $autofill->count($r['descrizione']);
echo ' echo '
<tr>'; <tr>';
if ($has_image) { if ($has_image) {
echo ' if ($riga->isArticolo()) {
<td>'; echo '
if (!empty($r['immagine_articolo'])) { <td align="center">
echo '<img src="files/articoli/'.$r['immagine_articolo'].'" height="80"></img>'; <img src="'.$riga->articolo->image.'" style="max-height: 80px">
</td>';
$autofill->set(5);
} else {
echo '
<td></td>';
} }
echo '
</td>';
} }
echo ' echo '
<td>'; <td>
echo '
'.nl2br($r['descrizione']); '.nl2br($r['descrizione']);
// Codice articolo if ($riga->isArticolo()) {
if (!empty($r['codice_articolo'])) { // Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo ' echo '
<br><small>'.tr('COD. _COD_', [ <br><small>'.$text.'</small>';
'_COD_' => $r['codice_articolo'],
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
}
// Seriali // Seriali
if (!empty($r['seriali'])) { $seriali = $riga->serials;
echo ' if (!empty($seriali)) {
<br><small>'.tr('SN').': '.$r['seriali'].'</small>'; $text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
} }
} }
echo ' echo '
</td>'; </td>';
echo " if (!$riga->isDescrizione()) {
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um']; <td class="text-center">
} '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
echo '
</td>'; </td>';
if ($options['pricing']) { if ($options['pricing']) {
// Prezzo unitario // Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta'])); <td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
if ($r['sconto'] > 0) { if ($riga->sconto > 0) {
echo " $text = tr('sconto _TOT_ _TYPE_', [
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']), '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()), ]);
]).'</small>';
if ($count <= 1) { echo '
$count += 0.4; <br><small class="text-muted">'.$text.'</small>';
}
$autofill->count($text, true);
} }
}
echo '
</td>';
// Imponibile
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
if ($r['sconto'] > 0) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto']),
'_TYPE_' => currency(),
]).'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
}
echo '
</td>'; </td>';
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
// Iva
echo '
<td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
</td>';
}
} else { } else {
echo ' echo '
<td class="text-center">-</td> <td></td>';
<td class="text-center">-</td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
} }
// Iva
echo ' echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['perc_iva'], 0);
}
echo '
</td>
</tr>'; </tr>';
$autofill['count'] += $count; $autofill->next();
$sconto[] = $r['sconto'];
$imponibile[] = $r['subtotale'];
$iva[] = $r['iva'];
} }
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$iva = sum($iva);
$totale = $imponibile - $sconto;
echo ' echo '
|autofill| |autofill|
</tbody>'; </tbody>';
// 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 // TOTALE COSTI FINALI
if ($options['pricing']) { if ($options['pricing']) {
// Totale imponibile // Totale imponibile
echo ' echo '
<tr> <tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top"> <td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b> <b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b> <b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th> </th>
</tr>'; </tr>';
// Eventuale sconto incondizionato // Eventuale sconto incondizionato
if (!empty($sconto)) { if ($show_sconto) {
echo ' echo '
<tr> <tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top"> <td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Sconto', [], ['upper' => true]).':</b> <b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>-'.moneyFormat($sconto, 2).'</b> <b>'.moneyFormat($sconto, 2).'</b>
</th> </th>
</tr>'; </tr>';
// Totale imponibile // Totale imponibile
echo ' echo '
<tr> <tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top"> <td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Totale imponibile', [], ['upper' => true]).':</b> <b>'.tr('Totale imponibile', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b> <b>'.moneyFormat($totale_imponibile, 2).'</b>
</th> </th>
</tr>'; </tr>';
} }
@ -245,22 +213,20 @@ if ($options['pricing']) {
// IVA // IVA
echo ' echo '
<tr> <tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top"> <td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Totale IVA', [], ['upper' => true]).':</b> <b>'.tr('Totale IVA', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($iva, 2).'</b> <b>'.moneyFormat($totale_iva, 2).'</b>
</th> </th>
</tr>'; </tr>';
$totale = sum($totale, $iva);
// TOTALE // TOTALE
echo ' echo '
<tr> <tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top"> <td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b> <b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b> <b>'.moneyFormat($totale, 2).'</b>
@ -271,9 +237,9 @@ if ($options['pricing']) {
echo ' echo '
</table>'; </table>';
if (!empty($records[0]['note'])) { if (!empty($documento['note'])) {
echo ' echo '
<br> <br>
<p class="small-bold">'.tr('Note', [], ['upper' => true]).':</p> <p class="small-bold">'.tr('Note', [], ['upper' => true]).':</p>
<p>'.nl2br($records[0]['note']).'</p>'; <p>'.nl2br($documento['note']).'</p>';
} }

View File

@ -2,21 +2,20 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$module_name = 'Ordini'; use Modules\Ordini\Ordine;
// Lettura info fattura $documento = Ordine::find($id_record);
$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));
$id_cliente = $records[0]['idanagrafica']; $id_cliente = $documento['idanagrafica'];
$id_sede = $records[0]['idsede']; $id_sede = $documento['idsede'];
$numero_ord = $records[0]['numero']; $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
$numero = !empty($records[0]['numero_esterno']) ? $records[0]['numero_esterno'] : $records[0]['numero']; $pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.prepare($documento->idpagamento));
// Sostituzioni specifiche // Sostituzioni specifiche
$custom = [ $custom = [
'tipo_doc' => Stringy\Stringy::create($records[0]['tipo_doc'])->toUpperCase(), 'tipo_doc' => Stringy\Stringy::create($documento->tipo->descrizione)->toUpperCase(),
'numero' => $numero, 'numero' => $numero,
'data' => Translator::dateToLocale($records[0]['data']), 'data' => Translator::dateToLocale($documento['data']),
'pagamento' => $records[0]['tipo_pagamento'], 'pagamento' => $pagamento['descrizione'],
]; ];

View File

@ -2,21 +2,17 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$autofill = [ // Creazione righe fantasma
'count' => 0, // Conteggio delle righe $autofill = new \Util\Autofill($options['pricing'] ? 5 : 2);
'words' => 70, // Numero di parolo dopo cui contare una riga nuova $autofill->setRows(20, 10);
'rows' => 20, // Numero di righe massimo presente nella pagina
'additional' => 10, // Numero di righe massimo da aggiungere
'columns' => 5, // Numero di colonne della tabella
];
echo ' echo '
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-6">
<div class="text-center" style="height:5mm;"> <div class="text-center" style="height:5mm;">
<b>'.tr('Preventivo num. _NUM_ del _DATE_', [ <b>'.tr('Preventivo num. _NUM_ del _DATE_', [
'_NUM_' => $records[0]['numero'], '_NUM_' => $documento['numero'],
'_DATE_' => Translator::dateToLocale($records[0]['data']), '_DATE_' => Translator::dateToLocale($documento['data_bozza']),
], ['upper' => true]).'</b> ], ['upper' => true]).'</b>
</div> </div>
</div> </div>
@ -54,144 +50,129 @@ echo '
</div>'; </div>';
// Descrizione // Descrizione
if (!empty($records[0]['descrizione'])) { if (!empty($documento['descrizione'])) {
echo ' echo '
<p>'.nl2br($records[0]['descrizione']).'</p> <p>'.nl2br($documento['descrizione']).'</p>
<br>'; <br>';
} }
$sconto = [];
$imponibile = [];
$iva = [];
// Intestazione tabella per righe // Intestazione tabella per righe
echo " echo "
<table class='table table-striped table-bordered' id='contents'> <table class='table table-striped table-bordered' id='contents'>
<thead> <thead>
<tr> <tr>
<th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th> <th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true])."</th> <th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true]).'</th>';
if ($options['pricing']) {
echo "
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th> <th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:15%'>".tr('Imponibile', [], ['upper' => true])."</th> <th class='text-center' style='width:15%'>".tr('Importo', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th> <th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th>';
}
echo '
</tr> </tr>
</thead> </thead>
<tbody>'; <tbody>';
// RIGHE PREVENTIVO CON ORDINAMENTO UNICO // Righe documento
$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`'); $righe = $documento->getRighe();
foreach ($righe as $r) { foreach ($righe as $riga) {
$count = 0; $r = $riga->toArray();
$count += ceil(strlen($r['descrizione']) / $autofill['words']);
$count += substr_count($r['descrizione'], PHP_EOL); $autofill->count($r['descrizione']);
echo ' echo '
<tr> <tr>
<td> <td>
'.nl2br($r['descrizione']); '.nl2br($r['descrizione']);
if (!empty($r['codice_articolo'])) { if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo ' echo '
<br><small>'.tr('COD. _COD_', [ <br><small>'.$text.'</small>';
'_COD_' => $r['codice_articolo'],
]).'</small>';
if ($count <= 1) { $autofill->count($text, true);
$count += 0.4;
}
} }
echo ' echo '
</td>'; </td>';
echo " if (!$riga->isDescrizione()) {
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um']; <td class="text-center">
} '.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
echo '
</td>'; </td>';
if ($options['pricing']) { if ($options['pricing']) {
// Prezzo unitario // Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta'])); <td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
if ($r['sconto'] > 0) { if ($riga->sconto > 0) {
echo " $text = tr('sconto _TOT_ _TYPE_', [
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [ '_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']), '_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()), ]);
]).'</small>';
if ($count <= 1) { echo '
$count += 0.4; <br><small class="text-muted">'.$text.'</small>';
}
$autofill->count($text, true);
} }
}
echo '
</td>';
// Imponibile
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
echo ' echo '
'.(empty($r['subtotale']) ? '' : moneyFormat($r['subtotale']));
if ($r['sconto'] > 0) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto']),
'_TYPE_' => currency(),
]).'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
}
echo '
</td>'; </td>';
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
// Iva
echo '
<td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
</td>';
}
} else { } else {
echo ' echo '
<td class="text-center">-</td> <td></td>';
<td class="text-center">-</td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
} }
// Iva
echo ' echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['perc_iva'], 0);
}
echo '
</td>
</tr>'; </tr>';
$autofill['count'] += $count; $autofill->next();
$sconto[] = $r['sconto'];
$imponibile[] = $r['subtotale'];
$iva[] = $r['iva'];
} }
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$iva = sum($iva);
$totale = $imponibile - $sconto;
echo ' echo '
|autofill| |autofill|
</tbody>'; </tbody>';
// 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 // TOTALE COSTI FINALI
if ($options['pricing'] and !isset($options['hide_total'])) { if ($options['pricing'] and !isset($options['hide_total'])) {
// Totale imponibile // Totale imponibile
@ -202,12 +183,12 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b> <b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th> </th>
</tr>'; </tr>';
// Eventuale sconto incondizionato // Eventuale sconto incondizionato
if (!empty($sconto)) { if ($show_sconto) {
echo ' echo '
<tr> <tr>
<td colspan="3" class="text-right border-top"> <td colspan="3" class="text-right border-top">
@ -215,7 +196,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>-'.moneyFormat($sconto, 2).'</b> <b>'.moneyFormat($sconto, 2).'</b>
</th> </th>
</tr>'; </tr>';
@ -227,7 +208,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b> <b>'.moneyFormat($totale_imponibile, 2).'</b>
</th> </th>
</tr>'; </tr>';
} }
@ -240,17 +221,15 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($iva, 2).'</b> <b>'.moneyFormat($totale_iva, 2).'</b>
</th> </th>
</tr>'; </tr>';
$totale = sum($totale, $iva);
// TOTALE // TOTALE
echo ' echo '
<tr> <tr>
<td colspan="3" class="text-right border-top"> <td colspan="3" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b> <b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td> </td>
<th colspan="2" class="text-right"> <th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b> <b>'.moneyFormat($totale, 2).'</b>
@ -262,15 +241,7 @@ echo'
</table>'; </table>';
// CONDIZIONI GENERALI DI FORNITURA // CONDIZIONI GENERALI DI FORNITURA
$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.$documento['idpagamento']);
// 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'];
echo ' echo '
<table class="table table-bordered"> <table class="table table-bordered">
@ -286,20 +257,10 @@ echo '
</th> </th>
<td> <td>
'.$pagamento.' '.$pagamento['descrizione'].'
</td> </td>
</tr> </tr>
<!--tr>
<th>
'.tr('Resa materiale', [], ['upper' => true]).'
</th>
<td>
'.$resa_materiale.'
</td>
</tr-->
<tr> <tr>
<th> <th>
'.tr('Validità offerta', [], ['upper' => true]).' '.tr('Validità offerta', [], ['upper' => true]).'
@ -307,10 +268,10 @@ echo '
<td>'; <td>';
if (!empty($records[0]['validita'])) { if (!empty($documento['validita'])) {
echo' echo'
'.tr('_TOT_ giorni', [ '.tr('_TOT_ giorni', [
'_TOT_' => $records[0]['validita'], '_TOT_' => $documento['validita'],
]); ]);
} else { } else {
echo '-'; echo '-';
@ -326,7 +287,7 @@ echo '
</th> </th>
<td> <td>
'.$records[0]['tempi_consegna'].' '.$documento['tempi_consegna'].'
</td> </td>
</tr> </tr>
@ -336,7 +297,7 @@ echo '
</th> </th>
<td> <td>
'.nl2br($records[0]['esclusioni']).' '.nl2br($documento['esclusioni']).'
</td> </td>
</tr> </tr>
</table>'; </table>';
@ -345,17 +306,19 @@ echo '
echo ' echo '
<p class="text-center">'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'</p>'; <p class="text-center">'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'</p>';
//Firma // Firma
echo '<div style=\'position:absolute; bottom:'.($settings['margins']['bottom'] + $settings['footer-height']).'px\' > <table > echo '
<tr> <div style="position:absolute; bottom:'.($settings['margins']['bottom'] + $settings['footer-height']).'px">
<td style="vertical-align:bottom;" width="50%"> <table>
, ___________________________ <tr>
</td> <td style="vertical-align:bottom;" width="50%">
'.tr('').', ___________________________
<td align="center" style="vertical-align:bottom;" width="50%"> </td>
FIRMA PER ACCETTAZIONE<br><br>
_____________________________________________ <td align="center" style="vertical-align:bottom;" width="50%">
</td> '.tr('Firma per accettazione', [], ['upper' => true]).'<br><br>
</tr> _____________________________________________
</table> </td>
</tr>
</table>
<br></div>'; <br></div>';

View File

@ -2,10 +2,9 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$module_name = 'Preventivi'; use Modules\Preventivi\Preventivo;
// Lettura info fattura $documento = Preventivo::find($id_record);
$records = $dbo->fetchArray('SELECT *, data_bozza AS data FROM co_preventivi WHERE co_preventivi.id='.prepare($id_record));
$id_cliente = $records[0]['idanagrafica']; $id_cliente = $documento['idanagrafica'];
$id_sede = $records[0]['idsede']; $id_sede = $documento['idsede'];

1
update/2_4_11.sql Normal file
View File

@ -0,0 +1 @@
UPDATE `zz_prints` SET `filename` = 'Preventivo num. {numero} del {data}' WHERE `name` = 'Preventivo (senza totali)';