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:
parent
939ba2dea0
commit
7fcc948813
@ -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">
|
||||||
|
@ -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';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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).'
|
||||||
|
@ -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">
|
||||||
|
@ -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).'
|
||||||
|
@ -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).'
|
||||||
|
@ -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).'
|
||||||
|
@ -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> </td>';
|
|
||||||
}
|
|
||||||
$result .= '
|
|
||||||
</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$report = str_replace('|autofill|', $result, $report);
|
$report = str_replace('|autofill|', $result, $report);
|
||||||
}
|
}
|
||||||
|
100
src/Util/Autofill.php
Normal file
100
src/Util/Autofill.php
Normal 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> </td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$result .= '
|
||||||
|
</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
@ -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%">
|
||||||
lì, ___________________________
|
'.tr('lì').', ___________________________
|
||||||
</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>
|
||||||
|
@ -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'];
|
||||||
|
@ -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'));
|
|
||||||
|
@ -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>';
|
||||||
}
|
}
|
||||||
|
@ -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">
|
||||||
|
@ -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!'));
|
||||||
}
|
}
|
||||||
|
@ -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>';
|
||||||
|
|
||||||
|
@ -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>';
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'header-height' => 80,
|
'header-height' => 70,
|
||||||
'footer-height' => 55,
|
'footer-height' => 55,
|
||||||
];
|
];
|
||||||
|
@ -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>';
|
||||||
}
|
}
|
||||||
|
@ -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'],
|
||||||
];
|
];
|
||||||
|
@ -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>
|
||||||
lì, ___________________________
|
<tr>
|
||||||
</td>
|
<td style="vertical-align:bottom;" width="50%">
|
||||||
|
'.tr('lì').', ___________________________
|
||||||
<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>';
|
||||||
|
@ -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
1
update/2_4_11.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
UPDATE `zz_prints` SET `filename` = 'Preventivo num. {numero} del {data}' WHERE `name` = 'Preventivo (senza totali)';
|
Loading…
Reference in New Issue
Block a user