Miglioramento stampe Scadenzario e Registro IVA

Fix #622, riferimento a #537.
Aggiunto supporto a stampe "a pezzi" per ridurre l'utilizzo della memoria.
This commit is contained in:
Thomas Zilio 2019-07-09 16:43:08 +02:00
parent 606fce5f37
commit 7eda6ad01b
18 changed files with 392 additions and 321 deletions

View File

@ -382,35 +382,51 @@ class Prints
// Individuazione delle impostazioni finali // Individuazione delle impostazioni finali
$settings = array_merge($default, (array) $custom); $settings = array_merge($default, (array) $custom);
// Instanziamento dell'oggetto mPDF
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => $settings['format'],
'orientation' => strtoupper($settings['orientation']) == 'L' ? 'L' : 'P',
'font-size' => $settings['font-size'],
'margin_left' => $settings['margins']['left'],
'margin_right' => $settings['margins']['right'],
'margin_top' => $settings['margins']['top'] + $settings['header-height'],
'margin_bottom' => $settings['margins']['bottom'] + $settings['footer-height'],
'margin_header' => $settings['margins']['top'],
'margin_footer' => $settings['margins']['bottom'],
// Abilitazione per lo standard PDF/A
//'PDFA' => true,
//'PDFAauto' => true,
]);
$mode = !empty($filename) ? 'F' : 'I';
$filename = !empty($filename) ? $filename : sanitizeFilename($report_name);
$title = basename($filename);
// Impostazione del titolo del PDF
$mpdf->SetTitle($title);
// Inclusione dei fogli di stile CSS
$styles = [
'templates/base/bootstrap.css',
'templates/base/style.css',
];
foreach ($styles as $value) {
$mpdf->WriteHTML(file_get_contents(DOCROOT.'/'.$value), 1);
}
// Impostazione del font-size
$mpdf->WriteHTML('body {font-size: '.$settings['font-size'].'pt;}', 1);
// Individuazione delle variabili fondamentali per la sostituzione dei contenuti // Individuazione delle variabili fondamentali per la sostituzione dei contenuti
include self::filepath($id_print, 'init.php'); include self::filepath($id_print, 'init.php');
// Individuazione delle variabili per la sostituzione // Individuazione delle variabili per la sostituzione
include DOCROOT.'/templates/info.php'; include DOCROOT.'/templates/info.php';
// Generazione dei contenuti della stampa
ob_start();
include self::filepath($id_print, 'body.php');
$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>';
}
$report = str_replace('|autofill|', $result, $report);
}
// Generazione dei contenuti dell'header // Generazione dei contenuti dell'header
ob_start(); ob_start();
include self::filepath($id_print, 'header.php'); include self::filepath($id_print, 'header.php');
@ -430,53 +446,70 @@ class Prints
// Operazioni di sostituzione // Operazioni di sostituzione
include DOCROOT.'/templates/replace.php'; include DOCROOT.'/templates/replace.php';
$mode = !empty($filename) ? 'F' : 'I';
$filename = !empty($filename) ? $filename : sanitizeFilename($report_name);
$title = basename($filename);
$styles = [
'templates/base/bootstrap.css',
'templates/base/style.css',
];
// Instanziamento dell'oggetto mPDF
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => $settings['format'],
'orientation' => strtoupper($settings['orientation']) == 'L' ? 'L' : 'P',
'font-size' => $settings['font-size'],
'margin_left' => $settings['margins']['left'],
'margin_right' => $settings['margins']['right'],
'margin_top' => $settings['margins']['top'] + $settings['header-height'],
'margin_bottom' => $settings['margins']['bottom'] + $settings['footer-height'],
'margin_header' => $settings['margins']['top'],
'margin_footer' => $settings['margins']['bottom'],
// Abilitazione per lo standard PDF/A
//'PDFA' => true,
//'PDFAauto' => true,
]);
// Impostazione di header e footer // Impostazione di header e footer
$mpdf->SetHTMLFooter($foot); $mpdf->SetHTMLFooter($foot);
$mpdf->SetHTMLHeader($head); $mpdf->SetHTMLHeader($head);
// Impostazione del titolo del PDF // Generazione dei contenuti della stampa
$mpdf->SetTitle($title); // Generazione a singoli pezzi
$single_pieces = self::filepath($id_print, 'piece.php');
if (!empty($single_pieces)) {
ob_start();
include self::filepath($id_print, 'top.php');
$top = ob_get_clean();
// Inclusione dei fogli di stile CSS $mpdf->WriteHTML($top);
foreach ($styles as $value) {
$mpdf->WriteHTML(file_get_contents(DOCROOT.'/'.$value), 1); foreach ($records as $record) {
ob_start();
include self::filepath($id_print, 'piece.php');
$piece = ob_get_clean();
$mpdf->WriteHTML($piece);
}
ob_start();
include self::filepath($id_print, 'bottom.php');
$bottom = ob_get_clean();
$mpdf->WriteHTML($bottom);
$report = '';
} }
// Impostazione del font-size // Generazione totale
$mpdf->WriteHTML('body {font-size: '.$settings['font-size'].'pt;}', 1); else {
ob_start();
include self::filepath($id_print, 'body.php');
$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>';
}
$report = str_replace('|autofill|', $result, $report);
}
}
// Operazioni di sostituzione
include DOCROOT.'/templates/replace.php';
// Aggiunta dei contenuti // Aggiunta dei contenuti
$mpdf->WriteHTML($report); $mpdf->WriteHTML($report);
// Creazione effettiva del PDF // Creazione effettiva del PDF
$mpdf->Output($filename, $mode); $mpdf->Output($filename, $mode);
} }
} }

View File

@ -1,133 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$dir = $_GET['dir'];
if ($dir == 'entrata') {
$tipo = 'vendite';
} else {
$tipo = 'acquisti';
}
$report_name = 'registro_iva_'.$tipo.'.pdf';
$periodo = $_GET['periodo'];
$v_iva = [];
$v_totale = [];
$totale_iva = 0;
$totale_subtotale = 0;
$date_start = $_SESSION['period_start'];
$date_end = $_SESSION['period_end'];
$query = 'SELECT *, co_documenti.id AS id, IF(numero = "", numero_esterno, numero) AS numero, SUM(subtotale-co_righe_documenti.sconto) AS subtotale, SUM(iva) AS iva, an_anagrafiche.ragione_sociale, an_anagrafiche.codice AS codice_anagrafica FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id=co_righe_documenti.iddocumento INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_iva ON co_righe_documenti.idiva=co_iva.id INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = co_documenti.idanagrafica WHERE dir = '.prepare($dir).' AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione="Bozza" OR descrizione="Annullata") AND is_descrizione = 0 AND co_documenti.data >= '.prepare($date_start).' AND co_documenti.data <= '.prepare($date_end).' GROUP BY co_documenti.id, co_righe_documenti.idiva ORDER BY co_documenti.id, co_documenti.'.(($dir == 'entrata') ? 'data' : 'numero');
$rs = $dbo->fetchArray($query);
if ('entrata' == $dir) {
echo "<span style='font-size:12pt;'><b>".tr('Registro iva vendita dal _START_ al _END_ _ESERCIZIO_', [
'_START_' => Translator::dateToLocale($date_start),
'_END_' => Translator::dateToLocale($date_end),
'_ESERCIZIO_' => (date('Y', strtotime($date_start)) == date('Y', strtotime($date_end)) ? '- Esercizio '.date('Y', strtotime($date_end)) : ''),
], ['upper' => true]).'</b></span><br><br>';
} elseif ('uscita' == $dir) {
echo "<span style='font-size:12pt;'><b>".tr('Registro iva acquisto dal _START_ al _END_ _ESERCIZIO_', [
'_START_' => Translator::dateToLocale($date_start),
'_END_' => Translator::dateToLocale($date_end),
'_ESERCIZIO_' => (date('Y', strtotime($date_start)) == date('Y', strtotime($date_end)) ? '- Esercizio '.date('Y', strtotime($date_end)) : ''),
], ['upper' => true]).'</b></span><br><br>';
}
echo "
<table cellspacing='0' style='table-layout:fixed;'>
<thead>
<tr>
<th bgcolor='#dddddd'>N<sup>o</sup> prot.</th>
<th bgcolor='#dddddd'>N<sup>o</sup> doc.</th>
<th bgcolor='#dddddd'>Data</th>
<th bgcolor='#dddddd'>Tipo</th>
<th bgcolor='#dddddd'>".(($dir == 'entrata') ? 'Cliente' : 'Fornitore')."</th>
<th bgcolor='#dddddd'>Tot doc.</th>
<th bgcolor='#dddddd'>Imponibile</th>
<th bgcolor='#dddddd'>%</th>
<th bgcolor='#dddddd'>Iva</th>
<th bgcolor='#dddddd'>Imposta</th>
</tr>
</thead>
";
for ($i = 0; $i < sizeof($rs); ++$i) {
echo ' <tr>';
if ($rs[$i]['numero'] == $rs[$i - 1]['numero']) {
echo ' <td></td>';
echo ' <td></td>';
echo ' <td></td>';
echo ' <td></td>';
echo ' <td></td>';
echo ' <td></td>';
} else {
echo ' <td>'.(($dir == 'uscita') ? $rs[$i]['numero'] : '-').'</td>';
echo ' <td>'.$rs[$i]['numero_esterno'].'</td>';
echo ' <td>'.date('d/m/Y', strtotime($rs[$i]['data'])).'</td>';
echo ' <td>'.$rs[$i]['codice_tipo_documento_fe'].'</td>';
echo ' <td>'.$rs[$i]['codice_anagrafica'].' / '.tr($rs[$i]['ragione_sociale'], [], ['upper' => true]).'</td>';
echo " <td class='text-right'>".moneyFormat(get_totale_fattura($rs[$i]['iddocumento'])).'</td>';
}
echo " <td class='text-right'>".moneyFormat($rs[$i]['subtotale']).'</td>';
echo " <td class='text-center'>".Translator::numberToLocale($rs[$i]['percentuale'], 0).'</td>';
echo " <td class='text-center'>".$rs[$i]['desc_iva'].'</td>';
echo " <td class='text-right'>".moneyFormat($rs[$i]['iva']).'</td>';
echo ' </tr>';
$v_iva[$rs[$i]['desc_iva']] += $rs[$i]['iva'];
$v_totale[$rs[$i]['desc_iva']] += $rs[$i]['subtotale'];
$totale_iva += $rs[$i]['iva'];
$totale_subtotale += $rs[$i]['subtotale'];
}
echo '
</table>';
echo " <br><br><span style='font-size:12pt;'><b>RIEPILOGO IVA</b></span><br><br>";
echo "
<table cellspacing='0' style='table-layout:fixed;' style='width:50%'>
<tr>
<th bgcolor='#dddddd'>Iva</th>
<th bgcolor='#dddddd'>Imponibile</th>
<th bgcolor='#dddddd'>Imposta</th>
</tr>
";
foreach ($v_iva as $desc_iva => $tot_iva) {
if ('' != $desc_iva) {
echo "
<tr>
<td valign='top'>\n";
echo $desc_iva."\n";
echo " </td>\n";
echo " <td valign='top' align='right'>\n";
echo moneyFormat($v_totale[$desc_iva])."\n";
echo " </td>\n";
echo " <td valign='top' align='right'>\n";
echo moneyFormat($v_iva[$desc_iva])."\n";
echo " </td>
</tr>\n";
}
}
echo " <tr bgcolor='#dddddd'>
<td><b>TOTALE</b></td>
<td class='text-right'>".moneyFormat($totale_subtotale)."</td>
<td class='text-right'>".moneyFormat($totale_iva).'</td>
</tr>';
echo '
</table>';

View File

@ -0,0 +1,59 @@
<?php
include_once __DIR__.'/../../core.php';
$totale_iva = sum(array_column($records, 'iva'));
$totale_subtotale = sum(array_column($records, 'subtotale'));
echo '
</tbody>
</table>
<br><br>
<h4><b>'.tr('Riepilogo IVA', [], ['upper' => true]).'</b></h4>
<table class="table" style="width:50%">
<thead>
<tr bgcolor="#dddddd">
<th>'.tr('Iva').'</th>
<th class="text-center">'.tr('Imponibile').'</th>
<th class="text-center">'.tr('Imposta').'</th>
</tr>
</thead>
<tbody>';
foreach ($iva as $descrizione => $tot_iva) {
if (!empty($descrizione)) {
$somma_iva = sum($iva[$descrizione]);
$somma_totale = sum($totale[$descrizione]);
echo '
<tr>
<td>
'.$descrizione.'
</td>
<td class="text-right">
'.moneyFormat($somma_totale).'
</td>
<td class="text-right">
'.moneyFormat($somma_totale).'
</td>
</tr>';
}
}
echo '
<tr bgcolor="#dddddd">
<td class="text-right">
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</td>
<td class="text-right">'.moneyFormat($totale_subtotale).'</td>
<td class="text-right">'.moneyFormat($totale_iva).'</td>
</tr>
</tbody>
</table>';

View File

@ -4,7 +4,7 @@ echo '
<table style="color:#aaa; font-size:10px;"> <table style="color:#aaa; font-size:10px;">
<tr> <tr>
<td align="left" style="width:97mm;"> <td align="left" style="width:97mm;">
'.tr('Stampato con OpenSTAManager il _DATA_', ['_DATA_' => date('d/m/Y')]).' '.tr('Stampato con OpenSTAManager il _DATE_', ['_DATE_' => date('d/m/Y')]).'
</td> </td>
<td align="right" style="width:97mm;"> <td align="right" style="width:97mm;">

View File

@ -1,17 +0,0 @@
<?php
echo '
<!-- Intestazione fornitore -->
<div class="row">
<div class="col-xs-6">
<p><b>$f_ragionesociale$</b></p>
<p>$f_indirizzo$ $f_citta_full$</p>
<p>'.(!empty($f_piva) ? tr('P.Iva').': ' : '').'$f_piva$</p>
<p>'.(!empty($f_codicefiscale) ? tr('C.F.').': ' : '').'$f_codicefiscale$</p>
<p>'.(!empty($f_capsoc) ? tr('Cap.Soc.').': ' : '').'$f_capsoc$</p>
<p>'.(!empty($f_telefono) ? tr('Tel').': ' : '').'$f_telefono$</p>
</div>
<div class="col-xs-6 text-right">
<img src="$logo$" alt="Logo" border="0"/>
</div>
</div>';

View File

@ -0,0 +1,31 @@
<?php
include_once __DIR__.'/../../core.php';
$dir = $_GET['dir'];
$date_start = $_SESSION['period_start'];
$date_end = $_SESSION['period_end'];
$tipo = $dir == 'entrata' ? 'vendite': 'acquisti';
$report_name = 'registro_iva_'.$tipo.'.pdf';
$v_iva = [];
$v_totale = [];
$query = 'SELECT *,
co_documenti.id AS id,
IF(numero = "", numero_esterno, numero) AS numero,
SUM(subtotale - sconto) AS subtotale,
(SELECT SUM(subtotale - sconto + iva + rivalsainps - ritenutaacconto) FROM co_righe_documenti WHERE co_righe_documenti.iddocumento=co_documenti.id GROUP BY iddocumento) + co_documenti.iva_rivalsainps AS totale,
SUM(iva) AS iva, an_anagrafiche.ragione_sociale,
an_anagrafiche.codice AS codice_anagrafica
FROM co_documenti
INNER JOIN co_righe_documenti ON co_documenti.id=co_righe_documenti.iddocumento
INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id
INNER JOIN co_iva ON co_righe_documenti.idiva=co_iva.id
INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = co_documenti.idanagrafica
WHERE dir = '.prepare($dir).' AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione="Bozza" OR descrizione="Annullata") AND is_descrizione = 0 AND co_documenti.data >= '.prepare($date_start).' AND co_documenti.data <= '.prepare($date_end).'
GROUP BY co_documenti.id, co_righe_documenti.idiva
ORDER BY co_documenti.id, co_documenti.'.(($dir == 'entrata') ? 'data' : 'numero');
$records = $dbo->fetchArray($query);

View File

@ -0,0 +1,36 @@
<?php
include_once __DIR__.'/../../core.php';
echo '
<tr>';
$previous_number = $previous_number ?: null;
if ($record['numero'] == $previous_number) {
echo '
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>';
} else {
echo '
<td>'.(($dir == 'uscita') ? $record['numero'] : '-').'</td>
<td>'.$record['numero_esterno'].'</td>
<td>'.Translator::numbertoLocale($record['data']).'</td>
<td>'.$record['codice_tipo_documento_fe'].'</td>
<td>'.$record['codice_anagrafica'].' / '.tr($record['ragione_sociale'], [], ['upper' => true]).'</td>
<td>'.moneyFormat($record['totale']).'</td>';
}
echo '
<td class="text-right">'.moneyFormat($record['subtotale']).'</td>
<td class="text-center">'.Translator::numberToLocale($record['percentuale'], 0).'</td>
<td class="text-center">'.$record['desc_iva'].'</td>
<td class="text-right">'.moneyFormat($record['iva']).'</td>
</tr>';
$previous_number = $record['numero'];
$iva[$record['desc_iva']][] = $record['iva'];
$totale[$record['desc_iva']][] = $record['subtotale'];

View File

@ -0,0 +1,44 @@
<?php
include_once __DIR__.'/../../core.php';
$year_start = date('Y', strtotime($date_start));
$year_end = date('Y', strtotime($date_end));
$esercizio = $year_start == $year_end ? ' - '.tr('Esercizio _YEAR_',[
'_YEAR_' => $year_end,
]) : '';
if ('entrata' == $dir) {
$titolo = tr('Registro iva vendita dal _START_ al _END_', [
'_START_' => Translator::dateToLocale($date_start),
'_END_' => Translator::dateToLocale($date_end),
], ['upper' => true]);
} elseif ('uscita' == $dir) {
$titolo = tr('Registro iva acquisto dal _START_ al _END_', [
'_START_' => Translator::dateToLocale($date_start),
'_END_' => Translator::dateToLocale($date_end),
], ['upper' => true]);
}
$tipo = $dir == "entrata" ? tr("Cliente") : tr("Fornitore");
echo '<h4><b>'.$titolo.'</b></h4>
<table class="table">
<thead>
<tr bgcolor="#dddddd">
<th>'.tr('N<sup>o</sup> prot.').'</th>
<th>'.tr('N<sup>o</sup> doc.').'</th>
<th>'.tr('Data').'</th>
<th>'.tr('Tipo').'</th>
<th>'.$tipo.'</th>
<th>'.tr('Tot doc.').'</th>
<th>'.tr('Imponibile').'</th>
<th>%</th>
<th>'.tr('Iva').'</th>
<th>'.tr('Imposta').'</th>
</tr>
</thead>
<tbody>';

View File

@ -0,0 +1,17 @@
<?php
include_once __DIR__.'/../../core.php';
$totale_da_pagare = sum(array_column($records, 'Importo'));
$totale_pagato = sum(array_column($records, 'Pagato'));
echo '
<tr>
<td colspan="4" class="text-right">
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</td>
<td class="text-right">'.moneyFormat($totale_da_pagare, 2).'</td>
<td class="text-right">'.moneyFormat($totale_pagato, 2).'</td>
</tr>
</tbody>
</table>';

View File

@ -0,0 +1,17 @@
<?php
echo '
<table style="color:#aaa; font-size:10px;">
<tr>
<td align="left" style="width:97mm;">
'.tr('Stampato con OpenSTAManager il _DATE_', ['_DATE_' => date('d/m/Y')]).'
</td>
<td align="right" style="width:97mm;">
'.tr('Pagina _PAGE_ di _TOTAL_', [
'_PAGE_' => '{PAGENO}',
'_TOTAL_' => '{nb}',
]).'
</td>
</tr>
</table>';

View File

@ -0,0 +1,40 @@
<?php
include_once __DIR__.'/../../core.php';
$report_name = 'Scadenzario_Totale.pdf';
$module_name = 'Scadenzario';
$date_start = $_SESSION['period_start'];
$date_end = $_SESSION['period_end'];
$module = Modules::get('Scadenzario');
$id_module = $module['id'];
$total = Util\Query::readQuery($module);
// Lettura parametri modulo
$module_query = $total['query'];
$search_filters = [];
if (is_array($_SESSION['module_'.$id_module])) {
foreach ($_SESSION['module_'.$id_module] as $field => $value) {
if (!empty($value) && starts_with($field, 'search_')) {
$field_name = str_replace('search_', '', $field);
$field_name = str_replace('__', ' ', $field_name);
$field_name = str_replace('-', ' ', $field_name);
array_push($search_filters, '`'.$field_name.'` LIKE "%'.$value.'%"');
}
}
}
if (!empty($search_filters)) {
$module_query = str_replace('2=2', '2=2 AND ('.implode(' AND ', $search_filters).') ', $module_query);
}
// Filtri derivanti dai permessi (eventuali)
$module_query = Modules::replaceAdditionals($id_module, $module_query);
// Scadenze
$records = $dbo->fetchArray($module_query);

View File

@ -1,97 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module_name = 'Scadenzario';
$date_start = $_SESSION['period_start'];
$date_end = $_SESSION['period_end'];
$module = Modules::get('Scadenzario');
$id_module = $module['id'];
$total = Util\Query::readQuery($module);
// Lettura parametri modulo
$module_query = $total['query'];
$search_filters = [];
if (is_array($_SESSION['module_'.$id_module])) {
foreach ($_SESSION['module_'.$id_module] as $field => $value) {
if (!empty($value) && starts_with($field, 'search_')) {
$field_name = str_replace('search_', '', $field);
$field_name = str_replace('__', ' ', $field_name);
$field_name = str_replace('-', ' ', $field_name);
array_push($search_filters, '`'.$field_name.'` LIKE "%'.$value.'%"');
}
}
}
if (!empty($search_filters)) {
$module_query = str_replace('2=2', '2=2 AND ('.implode(' AND ', $search_filters).') ', $module_query);
}
// Filtri derivanti dai permessi (eventuali)
$module_query = Modules::replaceAdditionals($id_module, $module_query);
$scadenze = $dbo->fetchArray($module_query);
// carica report html
$report = file_get_contents($docroot.'/templates/scadenzario/scadenzario.html');
$body = file_get_contents($docroot.'/templates/scadenzario/scadenzario_body.html');
include_once $docroot.'/templates/pdfgen_variables.php';
//Filtro in base al segmento
$id_segment = $_SESSION['module_'.$id_module]['id_segment'];
$rs_segment = $dbo->fetchArray('SELECT * FROM zz_segments WHERE id='.prepare($id_segment));
$add_where = 'AND '.$rs_segment[0]['clause'];
$body .= '<h3>'.$titolo.' dal '.Translator::dateToLocale($date_start).' al '.Translator::dateToLocale($date_end)."</h3>\n";
$body .= "<table class=\"table_values\" cellspacing=\"0\" border=\"0\" cellpadding=\"0\" style=\"table-layout:fixed; border-color:#aaa;\">\n";
$body .= "<col width=\"300\"><col width=\"200\"><col width=\"150\"><col width=\"50\"><col width=\"70\"><col width=\"70\">\n";
$body .= "<thead>\n";
$body .= " <tr>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Documento</th>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Anagrafica</th>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Tipo di pagamento</th>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Data scadenza</th>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Importo</th>\n";
$body .= " <th style='padding:2mm; background:#eee;'>Già pagato</th>\n";
$body .= " </tr>\n";
$body .= "</thead>\n";
$body .= "<tbody>\n";
/*$rs = $dbo->fetchArray("SELECT co_scadenziario.id AS id, ragione_sociale AS `Anagrafica`, co_pagamenti.descrizione AS `Tipo di pagamento`, CONCAT( co_tipidocumento.descrizione, CONCAT( ' numero ', IF(numero_esterno<>'', numero_esterno, numero) ) ) AS `Documento`, DATE_FORMAT(data_emissione, '%d/%m/%Y') AS `Data emissione`, DATE_FORMAT(scadenza, '%d/%m/%Y') AS `Data scadenza`, da_pagare AS `Importo`, pagato AS `Pagato`, IF(scadenza<NOW(), '#ff7777', '') AS _bg_ FROM co_scadenziario
INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id
INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica
INNER JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id
INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id
WHERE ABS(pagato) < ABS(da_pagare) ".$add_where." AND scadenza >= '".$date_start."' AND scadenza <= '".$date_end."' ORDER BY scadenza ASC");*/
for ($i = 0; $i < sizeof($scadenze); ++$i) {
$body .= ' <tr>';
$body .= ' <td>'.$scadenze[$i]['Rif. Fattura'].'<br><small>'.Translator::dateToLocale($scadenze[$i]['Data emissione'])."</small></td>\n";
$body .= ' <td>'.$scadenze[$i]['Anagrafica']."</td>\n";
$body .= ' <td>'.$scadenze[$i]['Tipo di pagamento']."</td>\n";
$body .= " <td align='center'>".Translator::dateToLocale($scadenze[$i]['Data scadenza'])."</td>\n";
$body .= " <td align='right'>".moneyFormat($scadenze[$i]['Importo'], 2)."</td>\n";
$body .= " <td align='right'>".moneyFormat($scadenze[$i]['Pagato'], 2)."</td>\n";
$body .= " </tr>\n";
$totale_da_pagare += $scadenze[$i]['Importo'];
$totale_pagato += $scadenze[$i]['Pagato'];
}
$body .= " <tr>\n";
$body .= " <td colspan='4' align='right'><b>TOTALE:</b></td><td align='right'>".moneyFormat($totale_da_pagare, 2)."</td><td align='right'>".moneyFormat($totale_pagato, 2)."</td>\n";
$body .= " </tr>\n";
$body .= "</tbody>\n";
$body .= "</table>\n";
$orientation = 'L';
$report_name = 'Scadenzario_Totale.pdf';

View File

@ -0,0 +1,16 @@
<?php
include_once __DIR__.'/../../core.php';
echo '
<tr>
<td>
'.$record['Rif. Fattura'].'<br>
<small>'.Translator::dateToLocale($record['Data emissione']).'</small>
</td>
<td>'.$record['Anagrafica'].'</td>
<td>'.$record['Tipo di pagamento'].'</td>
<td class="text-center">'.Translator::dateToLocale($record['Data scadenza']).'</td>
<td class="text-right">'.moneyFormat($record['Importo'], 2).'</td>
<td class="text-right">'.moneyFormat($record['Pagato'], 2).'</td>
</tr>';

View File

@ -1,12 +0,0 @@
<style>
<!--
.table_values td{
border: 1px solid #888;
padding: 4px;
}
-->
</style>
<page backcolor="#ffffff" backtop="0mm" backbottom="10mm" backleft="10mm" backright="10mm" footer="" style="font-size: $font_size$">
$body$
</page>

View File

@ -1,3 +0,0 @@
<page_header>
</page_header>

View File

@ -0,0 +1,6 @@
<?php
return [
'orientation' => 'L',
'font-size' => '11pt',
];

View File

@ -0,0 +1,23 @@
<?php
include_once __DIR__.'/../../core.php';
echo '
<h4><b>'.tr('Scadenze dal _START_ al _END_', [
'_START_' => Translator::dateToLocale($date_start),
'_END_' => Translator::dateToLocale($date_end),
], ['upper' => true]).'</b></h4>
<table class="table table-striped table-bordered" id="contents">
<thead>
<tr>
<th width="10%">'.tr('Documento', [], ['upper' => true]).'</th>
<th width="30%">'.tr('Anagrafica', [], ['upper' => true]).'</th>
<th width="30%">'.tr('Tipo di pagamento', [], ['upper' => true]).'</th>
<th width="10%" class="text-center">'.tr('Data scadenza', [], ['upper' => true]).'</th>
<th width="10%" class="text-center">'.tr('Importo', [], ['upper' => true]).'</th>
<th width="10%" class="text-center">'.tr('Già pagato', [], ['upper' => true]).'</th>
</tr>
</thead>
<tbody>';

View File

@ -208,3 +208,14 @@ UPDATE `zz_views` SET `query` = '`fe_stati_documento`.`descrizione`' WHERE `name
-- Impostazione per la lunghezza delle pagine Datatables -- Impostazione per la lunghezza delle pagine Datatables
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Lunghezza in pagine del buffer Datatables', '10', 'decimal', 0, 'Generali', 1); INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Lunghezza in pagine del buffer Datatables', '10', 'decimal', 0, 'Generali', 1);
-- Miglioramento query Scadenzario
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`
LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`
LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`
LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`
LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`
WHERE 1=1 AND ABS(`co_scadenziario`.`pagato`) < ABS(`co_scadenziario`.`da_pagare`) AND `co_statidocumento`.`descrizione` IN(''Emessa'',''Parzialmente pagato'')
HAVING 2=2
ORDER BY `scadenza` ASC' WHERE `name` = 'Scadenzario';