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'];
$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">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -26,7 +17,7 @@ if (!empty($record['immagine'])) {
<div class="panel-body">
<div class="row">
<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 class="col-md-4">

View File

@ -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';
}
}

View File

@ -164,7 +164,7 @@ if (abs($sconto) > 0) {
echo '
<tr>
<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 class="text-right">
'.moneyFormat($sconto, 2).'

View File

@ -231,7 +231,7 @@ if (abs($sconto) > 0) {
echo '
<tr>
<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 align="right">

View File

@ -308,7 +308,7 @@ if (!empty($sconto)) {
echo '
<tr>
<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 align="right">
'.moneyFormat($sconto, 2).'

View File

@ -224,7 +224,7 @@ if (abs($sconto) > 0) {
echo '
<tr>
<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 align="right">
'.moneyFormat($sconto, 2).'

View File

@ -167,7 +167,7 @@ if (abs($sconto) > 0) {
echo '
<tr>
<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 align="right">
'.moneyFormat($sconto, 2).'

View File

@ -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 .= '
<tr>';
for ($c = 0; $c < $autofill['columns']; ++$c) {
$result .= '
<td>&nbsp;</td>';
}
$result .= '
</tr>';
}
$result = $autofill->generate();
$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';
$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 '
<div class="row">
<div class="col-xs-6">
<div class="text-center" style="height:5mm;">
<b>'.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]).'</b>
</div>';
// 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']." <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><small>'.implode(', ', $list).'</small></p>';
}
echo '
</div>
@ -69,156 +65,180 @@ echo '
</div>';
// Descrizione
if (!empty($records[0]['desc_contratto'])) {
if (!empty($documento['descrizione'])) {
echo '
<p>'.nl2br($records[0]['desc_contratto']).'</p>
<p>'.nl2br($documento['descrizione']).'</p>
<br>';
}
$sconto = [];
$imponibile = [];
$iva = [];
// Intestazione tabella per righe
echo "
<table class='table table-striped table-bordered' id='contents'>
<thead>
<tr>
<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('Imponibile', [], ['upper' => true]).'</th>
<th class='text-center' style='width:20%'>".tr('Imponibile', [], ['upper' => true]).'</th>';
}
echo '
</tr>
</thead>
<tbody>';
// 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 '
<tr>
<td>
'.nl2br($r['descrizione']);
if (!empty($r['codice_articolo'])) {
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo '
<br><small>'.tr('COD. _COD_', [
'_COD_' => $r['codice_articolo'],
]).'</small>';
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($text, true);
}
echo '
</td>';
echo "
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
if (!$riga->isDescrizione()) {
echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
}
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
if ($options['pricing']) {
// Prezzo unitario
echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : moneyFormat($r['subtotale'] / $r['qta']));
}
echo '
</td>';
<td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
// Imponibile
echo "
<td class='text-right'>";
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 '
<br><small class="help-block">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
<br><small class="text-muted">'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($text, true);
}
}
echo '
echo '
</td>';
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
}
} else {
echo '
<td class="text-center">-</td>
<td class="text-center">-</td>';
<td></td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>';
}
}
echo '
</tr>';
$autofill['count'] += $count;
$sconto[] = $r['sconto'];
$imponibile[] = $r['subtotale'];
$autofill->next();
}
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$totale = $imponibile - $sconto;
echo '
|autofill|
</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
if ($options['pricing']) {
// Eventuale sconto incondizionato
if ($sconto > 0) {
// Totale imponibile
echo '
// Totale imponibile
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<th class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b>
<th colspan="2" class="text-right">
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th>
</tr>';
// Eventuale sconto incondizionato
if ($show_sconto) {
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td>
<th class="text-right">
<th colspan="2" class="text-right">
<b>'.moneyFormat($sconto, 2).'</b>
</th>
</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
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b>
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th class="text-right">
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
</th>
</tr>';
@ -227,10 +247,7 @@ echo'
</table>';
// 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 '
<table class="table table-bordered">
@ -246,7 +263,7 @@ echo '
</th>
<td>
'.$pagamento.'
'.$pagamento['descrizione'].'
</td>
</tr>
@ -257,10 +274,10 @@ echo '
<td>';
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 '
<td>';
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 '
</th>
<td>
'.nl2br($records[0]['esclusioni']).'
'.nl2br($documento['esclusioni']).'
</td>
</tr>
</table>';
// Conclusione
if (empty($records[0]['fatturabile'])) {
if (empty($documento->stato->fatturabile)) {
echo '
<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>';
@ -314,11 +331,11 @@ echo '<div style="position:absolute; bottom:'.($settings['margins']['bottom'] +
<table>
<tr>
<td style="vertical-align:bottom;" width="50%">
, ___________________________
'.tr('').', ___________________________
</td>
<td align="center" style="vertical-align:bottom;" width="50%">
FIRMA PER ACCETTAZIONE<br><br>
'.tr('Firma per accettazione', [], ['upper' => true]).'<br><br>
_____________________________________________
</td>
</tr>

View File

@ -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'];

View File

@ -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']) {
<tbody>';
// 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 '
<tr>
<td>
'.nl2br($r['descrizione']);
// Codice articolo
if (!empty($r['codice_articolo'])) {
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo '
<br><small>'.tr('COD. _COD_', [
'_COD_' => $r['codice_articolo'],
]).'</small>';
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
$autofill->count($text, true);
// Seriali
if (!empty($r['seriali'])) {
echo '
<br><small>'.tr('SN').': '.$r['seriali'].'</small>';
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
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 '
<br><small>'.$ref['description'].'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($ref['description'], true);
}
}
echo '
</td>';
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
if (!$riga->isDescrizione()) {
echo '
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'];
}
echo '
</td>';
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
if ($options['pricing']) {
// Prezzo unitario
echo '
'.moneyFormat($r['subtotale'] / $r['qta']);
}
echo '
</td>';
<td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
// Imponibile
echo "
<td class='text-right'>";
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 '
<br><small class="help-block">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
<br><small class="text-muted">'.$text.'</small>';
$autofill->count($text, true);
}
}
echo '
</td>';
// Iva
echo "
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
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 '
</td>';
<td></td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
}
echo '
</tr>';
</tr>';
$autofill['count'] += $count;
$imponibile[] = $r['subtotale'];
$iva[] = $r['iva'];
$sconto[] = $r['sconto'];
$autofill->next();
}
echo '
|autofill|
</tbody>
</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
// 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
echo '
<table class="table-bordered">';
@ -10,7 +24,7 @@ if ($options['pricing']) {
<tr>
<td rowspan='7'>
<p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p>
<p>'.nl2br($records[0]['note'])."</p>
<p>'.nl2br($documento['note'])."</p>
</td>
<td style='width:33mm;'>
<p class='small-bold'>".tr('Totale imponibile', [], ['upper' => true]).'</p>
@ -29,13 +43,13 @@ if ($options['pricing']) {
echo "
<tr>
<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>
</tr>
<tr>
<td class='cell-padded text-right'>
".moneyFormat($iva, 2).'
".moneyFormat($totale_iva, 2).'
</td>
</tr>';
@ -58,7 +72,7 @@ if ($options['pricing']) {
<tr>
<td style='height:40mm;'>
<p class='small-bold'>".tr('Note', [], ['upper' => true]).'</p>
'.nl2br($records[0]['note']).'
'.nl2br($documento['note']).'
</td>
</tr>';
}

View File

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

View File

@ -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'].'<br/>';
@ -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!'));
}

View File

@ -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 "
<table class='table table-striped table-bordered' id='contents'>
@ -26,58 +22,41 @@ echo "
</tr>
</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>';
// 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 '
<tr>
<td>
'.nl2br($r['descrizione']);
// Codice articolo
if (!empty($r['codice_articolo'])) {
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo '
<br><small>'.tr('COD. _COD_', [
'_COD_' => $r['codice_articolo'],
]).'</small>';
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
$autofill->count($text, true);
// Seriali
if (!empty($r['seriali'])) {
echo '
<br><small>'.tr('SN').': '.$r['seriali'].'</small>';
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
$autofill->count($text, true);
}
}
@ -93,9 +72,7 @@ foreach ($righe as $riga) {
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($text, true);
}
// Aggiunta dei riferimenti ai documenti
@ -106,69 +83,62 @@ foreach ($righe as $riga) {
echo '
<br><small>'.$ref['description'].'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($ref['description'], true);
}
}
echo '
</td>';
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
if (!$riga->isDescrizione()) {
echo '
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'];
}
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
</td>';
// Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
// Prezzo unitario
echo '
'.(empty($r['qta']) ? '' : moneyFormat($riga->prezzo_unitario_vendita));
<td class="text-right">
'.moneyFormat($riga->prezzo_unitario_vendita);
if ($riga->sconto > 0) {
echo "
<br><small class='text-muted'>".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
'_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
]).'</small>';
$text = tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($riga->sconto_unitario),
'_TYPE_' => ($riga->tipo_sconto == 'PRC' ? '%' : currency()),
]);
if ($count <= 1) {
$count += 0.4;
}
echo '
<br><small class="text-muted">'.$text.'</small>';
$autofill->count($text, true);
}
}
echo '
echo '
</td>';
// Imponibile
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
// Imponibile
echo '
'.moneyFormat($riga->totale_imponibile);
}
echo '
<td class="text-right">
'.moneyFormat($riga->totale_imponibile).'
</td>';
// Iva
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
// Iva
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 '
</td>
</tr>';
$autofill['count'] += $count;
$autofill->next();
}
echo '
@ -177,27 +147,23 @@ echo '
</table>';
// 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 "
<p class='text-center'>
<b>".nl2br($testo).'</b>
if (!empty($dicitura['dicitura'])) {
echo '
<p class="text-center">
<b>'.nl2br($dicitura['dicitura']).'</b>
</p>';
}
// 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 "
<p class='text-center'>
<b>".nl2br($testo).'</b>
if (!empty($dicitura['dicitura'])) {
echo '
<p class="text-center">
<b>'.nl2br($dicitura['dicitura']).'</b>
</p>';
}
}
@ -212,6 +178,7 @@ echo '
<p class="small-bold">'.tr('Note', [], ['upper' => true]).':</p>
<p>'.nl2br($record['note']).'</p>';
}
echo '
</td>';

View File

@ -1,12 +1,12 @@
<?php
// Calcoli
$imponibile = $fattura->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'])) {
</tr>';
}
$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
<th class="text-center small" colspan="'.$first_colspan.'">
'.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [
'_ACCONTO_' => $acconto,
'_CONTRIBUTI_' => empty($fattura->ritenutaContributi) ? null : $contributi,
'_CONTRIBUTI_' => empty($documento->ritenutaContributi) ? null : $contributi,
], ['upper' => true]).'
</th>';
@ -252,13 +250,13 @@ if (!empty($record['ritenutaacconto']) || !empty($fattura->totale_ritenuta_contr
<tr>
<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>';
echo '
<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>
</tr>';
}
@ -286,7 +284,7 @@ if (!empty($record['split_payment'])) {
</td>
<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>
</tr>';
}

View File

@ -20,11 +20,11 @@ echo '
<div class="row">
<!-- Dati Fattura -->
<div class="col-xs-6">
<div class="text-left" style="height:5mm;">
<div class="text-center" style="height:5mm;">
<b>$tipo_doc$</b>
</div>
<table class="table" style="overflow: visible;">
<table class="table" style="overflow: visible; width: 100%">
<tr>
<td valign="top" class="border-full text-center">
<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;
$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

View File

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

View File

@ -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>";
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>
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true])."</th>
echo "
<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('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>
</thead>
<tbody>';
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 '
<tr>';
if ($has_image) {
echo '
<td>';
if (!empty($r['immagine_articolo'])) {
echo '<img src="files/articoli/'.$r['immagine_articolo'].'" height="80"></img>';
if ($riga->isArticolo()) {
echo '
<td align="center">
<img src="'.$riga->articolo->image.'" style="max-height: 80px">
</td>';
$autofill->set(5);
} else {
echo '
<td></td>';
}
echo '
</td>';
}
echo '
<td>';
echo '
<td>
'.nl2br($r['descrizione']);
// Codice articolo
if (!empty($r['codice_articolo'])) {
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo '
<br><small>'.tr('COD. _COD_', [
'_COD_' => $r['codice_articolo'],
]).'</small>';
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
$autofill->count($text, true);
// Seriali
if (!empty($r['seriali'])) {
echo '
<br><small>'.tr('SN').': '.$r['seriali'].'</small>';
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode($seriali, ', ');
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
$autofill->count($text, true);
}
}
echo '
</td>';
echo "
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
if (!$riga->isDescrizione()) {
echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
}
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
if ($options['pricing']) {
// Prezzo unitario
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) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
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 '
<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 '
'.(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>';
// 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 '
<td class="text-center">-</td>
<td class="text-center">-</td>';
<td></td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
}
// Iva
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['perc_iva'], 0);
}
echo '
</td>
</tr>';
$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|
</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
if ($options['pricing']) {
// Totale imponibile
echo '
<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>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b>
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th>
</tr>';
// Eventuale sconto incondizionato
if (!empty($sconto)) {
if ($show_sconto) {
echo '
<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>
</td>
<th colspan="2" class="text-right">
<b>-'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, 2).'</b>
</th>
</tr>';
// Totale imponibile
echo '
<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>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale_imponibile, 2).'</b>
</th>
</tr>';
}
@ -245,22 +213,20 @@ if ($options['pricing']) {
// IVA
echo '
<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>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($iva, 2).'</b>
<b>'.moneyFormat($totale_iva, 2).'</b>
</th>
</tr>';
$totale = sum($totale, $iva);
// TOTALE
echo '
<tr>
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b>
<td colspan="'.($has_image ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
@ -271,9 +237,9 @@ if ($options['pricing']) {
echo '
</table>';
if (!empty($records[0]['note'])) {
if (!empty($documento['note'])) {
echo '
<br>
<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';
$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'],
];

View File

@ -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 '
<div class="row">
<div class="col-xs-6">
<div class="text-center" style="height:5mm;">
<b>'.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]).'</b>
</div>
</div>
@ -54,144 +50,129 @@ echo '
</div>';
// Descrizione
if (!empty($records[0]['descrizione'])) {
if (!empty($documento['descrizione'])) {
echo '
<p>'.nl2br($records[0]['descrizione']).'</p>
<p>'.nl2br($documento['descrizione']).'</p>
<br>';
}
$sconto = [];
$imponibile = [];
$iva = [];
// Intestazione tabella per righe
echo "
<table class='table table-striped table-bordered' id='contents'>
<thead>
<tr>
<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('Imponibile', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['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>';
}
echo '
</tr>
</thead>
<tbody>';
// 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 '
<tr>
<td>
'.nl2br($r['descrizione']);
if (!empty($r['codice_articolo'])) {
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->articolo->codice,
]);
echo '
<br><small>'.tr('COD. _COD_', [
'_COD_' => $r['codice_articolo'],
]).'</small>';
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
$autofill->count($text, true);
}
echo '
</td>';
echo "
<td class='text-center'>";
if (empty($r['is_descrizione'])) {
if (!$riga->isDescrizione()) {
echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'], 'qta')).' '.$r['um'];
}
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo "
<td class='text-right'>";
if (empty($r['is_descrizione'])) {
if ($options['pricing']) {
// Prezzo unitario
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) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
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 '
<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 '
'.(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>';
// 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 '
<td class="text-center">-</td>
<td class="text-center">-</td>';
<td></td>';
if ($options['pricing']) {
echo '
<td></td>
<td></td>
<td></td>';
}
}
// Iva
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['perc_iva'], 0);
}
echo '
</td>
</tr>';
$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|
</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
if ($options['pricing'] and !isset($options['hide_total'])) {
// Totale imponibile
@ -202,12 +183,12 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($imponibile, 2).'</b>
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
</th>
</tr>';
// Eventuale sconto incondizionato
if (!empty($sconto)) {
if ($show_sconto) {
echo '
<tr>
<td colspan="3" class="text-right border-top">
@ -215,7 +196,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td>
<th colspan="2" class="text-right">
<b>-'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, 2).'</b>
</th>
</tr>';
@ -227,7 +208,7 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale_imponibile, 2).'</b>
</th>
</tr>';
}
@ -240,17 +221,15 @@ if ($options['pricing'] and !isset($options['hide_total'])) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($iva, 2).'</b>
<b>'.moneyFormat($totale_iva, 2).'</b>
</th>
</tr>';
$totale = sum($totale, $iva);
// TOTALE
echo '
<tr>
<td colspan="3" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b>
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
@ -262,15 +241,7 @@ echo'
</table>';
// 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 '
<table class="table table-bordered">
@ -286,20 +257,10 @@ echo '
</th>
<td>
'.$pagamento.'
'.$pagamento['descrizione'].'
</td>
</tr>
<!--tr>
<th>
'.tr('Resa materiale', [], ['upper' => true]).'
</th>
<td>
'.$resa_materiale.'
</td>
</tr-->
<tr>
<th>
'.tr('Validità offerta', [], ['upper' => true]).'
@ -307,10 +268,10 @@ echo '
<td>';
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 '
</th>
<td>
'.$records[0]['tempi_consegna'].'
'.$documento['tempi_consegna'].'
</td>
</tr>
@ -336,7 +297,7 @@ echo '
</th>
<td>
'.nl2br($records[0]['esclusioni']).'
'.nl2br($documento['esclusioni']).'
</td>
</tr>
</table>';
@ -345,17 +306,19 @@ echo '
echo '
<p class="text-center">'.tr("In attesa di un Vostro Cortese riscontro, colgo l'occasione per porgere Cordiali Saluti").'</p>';
//Firma
echo '<div style=\'position:absolute; bottom:'.($settings['margins']['bottom'] + $settings['footer-height']).'px\' > <table >
<tr>
<td style="vertical-align:bottom;" width="50%">
, ___________________________
</td>
<td align="center" style="vertical-align:bottom;" width="50%">
FIRMA PER ACCETTAZIONE<br><br>
_____________________________________________
</td>
</tr>
</table>
// Firma
echo '
<div style="position:absolute; bottom:'.($settings['margins']['bottom'] + $settings['footer-height']).'px">
<table>
<tr>
<td style="vertical-align:bottom;" width="50%">
'.tr('').', ___________________________
</td>
<td align="center" style="vertical-align:bottom;" width="50%">
'.tr('Firma per accettazione', [], ['upper' => true]).'<br><br>
_____________________________________________
</td>
</tr>
</table>
<br></div>';

View File

@ -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'];

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)';