mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-01-29 23:14:55 +01:00
Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
e017df05a4
@ -229,7 +229,7 @@ echo '
|
||||
?>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "<?php echo tr('Iva di vendita'); ?>", "name": "idiva_vendita", "ajax-source": "iva", "value": "$idiva_vendita$", "valore_predefinito": "Iva predefinita", "help": "<?php echo tr('Se non specificata, verrà utilizzata l\'iva di default delle impostazioni'); ?>" ]}
|
||||
{[ "type": "select", "label": "<?php echo tr('Iva di vendita'); ?>", "name": "idiva_vendita", "ajax-source": "iva", "value": "$idiva_vendita$", "help": "<?php echo tr('Se non specificata, verrà utilizzata l\'iva di default delle impostazioni'); ?>" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -27,10 +27,9 @@ $rs = $dbo->fetchArray('SELECT *,
|
||||
giorni_preavviso_rinnovo,
|
||||
(SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_contratti.idanagrafica) AS ragione_sociale
|
||||
FROM co_contratti WHERE
|
||||
idstato IN (SELECT id FROM co_staticontratti WHERE is_pianificabile = 1) AND
|
||||
rinnovabile = 1 AND
|
||||
YEAR(data_conclusione) > 1970 AND
|
||||
(SELECT id FROM co_contratti contratti WHERE contratti.idcontratto_prev = co_contratti.id) IS NULL
|
||||
co_contratti.id NOT IN (SELECT idcontratto_prev FROM co_contratti contratti)
|
||||
HAVING (ore_rimanenti < ore_preavviso_rinnovo OR DATEDIFF(data_conclusione, NOW()) < ABS(giorni_preavviso_rinnovo))
|
||||
ORDER BY giorni_rimanenti ASC, ore_rimanenti ASC');
|
||||
|
||||
|
@ -798,7 +798,7 @@ if ($dir == 'uscita' && $fattura->isFE()) {
|
||||
}
|
||||
?>
|
||||
|
||||
{( "name": "filelist_and_upload", "id_module": "$id_module$", "id_record": "$id_record$" )}
|
||||
{( "name": "filelist_and_upload", "id_module": "$id_module$", "id_record": "$id_record$", "abilita_genera": "<?php echo $abilita_genera; ?>" )}
|
||||
|
||||
<?php
|
||||
if ($dir == 'entrata') {
|
||||
|
@ -91,7 +91,7 @@ class Fattura extends Document
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment, $numero_esterno = null)
|
||||
public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment, $numero_esterno = null, $data_registrazione = null)
|
||||
{
|
||||
$model = new static();
|
||||
|
||||
@ -120,7 +120,7 @@ class Fattura extends Document
|
||||
|
||||
// Salvataggio delle informazioni
|
||||
$model->data = $data;
|
||||
$model->data_registrazione = $data;
|
||||
$model->data_registrazione = $data_registrazione ?: $data;
|
||||
$model->data_competenza = $data;
|
||||
$model->id_segment = $id_segment;
|
||||
$model->idconto = $id_conto;
|
||||
@ -224,7 +224,7 @@ class Fattura extends Document
|
||||
// Calcolo dei numeri fattura
|
||||
if ($value != $previous) {
|
||||
$direzione = $this->tipo->dir;
|
||||
$data = $this->data;
|
||||
$data = $this->data_registrazione;
|
||||
|
||||
$this->numero = static::getNextNumero($data, $direzione, $value);
|
||||
|
||||
@ -757,7 +757,7 @@ class Fattura extends Document
|
||||
$maschera = Generator::getMaschera($id_segment);
|
||||
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero', [
|
||||
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
||||
'YEAR(data_registrazione) = '.prepare(date('Y', strtotime($data))),
|
||||
'id_segment = '.prepare($id_segment),
|
||||
]);
|
||||
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
||||
|
@ -442,6 +442,10 @@ echo '
|
||||
ordine.disable();
|
||||
input("idimpianti").disable();
|
||||
input("componenti").disable();
|
||||
} else{
|
||||
let value = anagrafica.get();
|
||||
updateSelectOption("idanagrafica", value);
|
||||
session_set("superselect,idanagrafica",value, 0);
|
||||
}
|
||||
|
||||
// Quando modifico orario inizio, allineo anche l\'orario fine
|
||||
|
@ -30,11 +30,13 @@ $numero_previsto = verifica_numero_intervento($intervento);
|
||||
|
||||
if (!empty($numero_previsto) && intval((setting('Verifica numero intervento')))) {
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<i class="fa fa-warning"></i> '.tr("E' assente una attività di numero _NUM_ in data precedente o corrispondente a _DATE_: potrebbero esserci alcuni errori di continuità con la numerazione delle attività", [
|
||||
<div class="alert alert-warning alert-dismissable">
|
||||
<i class="fa fa-warning"></i> '.tr("E' assente una attività con numero _NUM_ in data precedente o corrispondente al _DATE_: potrebbero esserci alcuni errori di continuità con la numerazione delle attività", [
|
||||
'_DATE_' => dateFormat($intervento->data_richiesta),
|
||||
'_NUM_' => '"'.$numero_previsto.'"',
|
||||
]).'.</b>
|
||||
|
||||
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
|
||||
</div>';
|
||||
}
|
||||
|
||||
|
@ -343,7 +343,7 @@ function verifica_numero_intervento(Intervento $intervento)
|
||||
// Recupero maschera per questo segmento
|
||||
$maschera = setting('Formato codice attività');
|
||||
|
||||
if ((strpos($maschera, 'YYYY') !== false) or (strpos($maschera, 'yy') !== false)) {
|
||||
if ((strpos($maschera, 'YYYY') == false) or (strpos($maschera, 'yy') == false)) {
|
||||
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
|
||||
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
|
||||
'YEAR(data_richiesta) = '.prepare($data->format('Y')),
|
||||
|
@ -127,7 +127,7 @@ $(document).ready(function() {
|
||||
if ($res) {
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<p>'.tr('Ci sono '.count($res).' documenti collegati a questa aliquota IVA. Non è possibile eliminarla o modificarne alcuni campi.').'</p>
|
||||
<p>'.tr('Ci sono '.$res.' documenti collegati a questa aliquota IVA. Non è possibile eliminarla o modificarne alcuni campi.').'</p>
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
|
@ -42,7 +42,7 @@ switch ($resource) {
|
||||
if (empty($elements)) {
|
||||
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
|
||||
|
||||
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'completato';
|
||||
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_fatturabile';
|
||||
$where[] = 'idstatoordine IN (SELECT `id` FROM `or_statiordine` WHERE '.$stato.' = 1)';
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ switch (post('op')) {
|
||||
$anagrafica = $documento_import->anagrafica;
|
||||
$id_anagrafica = $anagrafica->id;
|
||||
|
||||
if (!$documento_import->stato->is_pianificabile) {
|
||||
if (!$documento_import->stato->is_fatturabile && !$documento_import->stato->is_completato) {
|
||||
break;
|
||||
}
|
||||
|
||||
@ -101,12 +101,14 @@ switch (post('op')) {
|
||||
|
||||
//Fix per idconto righe fattura
|
||||
$articolo = ArticoloOriginale::find($copia->idarticolo);
|
||||
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $idconto);
|
||||
$copia->idconto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $idconto);
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->serials = $riga->serials;
|
||||
}
|
||||
|
||||
$copia->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ echo '
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Interventi per tipologia
|
||||
// Numero interventi per tipologia
|
||||
$tipi = $dbo->fetchArray('SELECT * FROM `in_tipiintervento`');
|
||||
|
||||
$dataset = '';
|
||||
@ -299,7 +299,7 @@ foreach ($tipi as $tipo) {
|
||||
echo '
|
||||
<div class="box box-info">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Interventi per tipologia').'</h3>
|
||||
<h3 class="box-title">'.tr('Numero interventi per tipologia').'</h3>
|
||||
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse">
|
||||
@ -307,14 +307,70 @@ echo '
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<canvas class="box-body collapse in" id="interventi" height="100"></canvas>
|
||||
<canvas class="box-body collapse in" id="interventi_n_tipologia" height="100"></canvas>
|
||||
</div>';
|
||||
|
||||
// Script per il grafico degli interventi per tipologia
|
||||
// Script per il grafico del numero interventi per tipologia
|
||||
echo '
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
new Chart(document.getElementById("interventi").getContext("2d"), {
|
||||
new Chart(document.getElementById("interventi_n_tipologia").getContext("2d"), {
|
||||
type: "bar",
|
||||
data: {
|
||||
labels: months,
|
||||
datasets: [
|
||||
'.$dataset.'
|
||||
]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
legend: {
|
||||
position: "bottom",
|
||||
},
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>';
|
||||
|
||||
|
||||
// Ore interventi per tipologia
|
||||
$dataset = '';
|
||||
foreach ($tipi as $tipo) {
|
||||
$interventi = $dbo->fetchArray('SELECT ROUND( SUM(in_interventi_tecnici.ore), 2 ) AS result, YEAR(in_interventi.data_richiesta) AS year, MONTH(in_interventi.data_richiesta) AS month FROM in_interventi INNER JOIN in_interventi_tecnici ON in_interventi.id=in_interventi_tecnici.idintervento WHERE in_interventi.idtipointervento = '.prepare($tipo['idtipointervento']).' AND in_interventi.data_richiesta BETWEEN '.prepare($start).' AND '.prepare($end).' GROUP BY YEAR(in_interventi.data_richiesta), MONTH(in_interventi.data_richiesta) ORDER BY YEAR(in_interventi.data_richiesta) ASC, MONTH(in_interventi.data_richiesta) ASC');
|
||||
|
||||
$interventi = Stats::monthly($interventi, $start, $end);
|
||||
|
||||
//Random color
|
||||
$background = '#'.dechex(rand(256, 16777215));
|
||||
|
||||
$dataset .= '{
|
||||
label: "'.$tipo['descrizione'].'",
|
||||
backgroundColor: "'.$background.'",
|
||||
data: [
|
||||
'.implode(',', array_column($interventi, 'result')).'
|
||||
]
|
||||
},';
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="box box-info">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Ore interventi per tipologia').'</h3>
|
||||
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse">
|
||||
<i class="fa fa-minus"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<canvas class="box-body collapse in" id="interventi_ore_tipologia" height="100"></canvas>
|
||||
</div>';
|
||||
|
||||
// Script per il grafico delle ore interventi per tipologia
|
||||
echo '
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
new Chart(document.getElementById("interventi_ore_tipologia").getContext("2d"), {
|
||||
type: "bar",
|
||||
data: {
|
||||
labels: months,
|
||||
|
@ -1356,11 +1356,7 @@ class FatturaElettronica
|
||||
}
|
||||
|
||||
// Non ammesso ’
|
||||
// $descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8');
|
||||
$descrizione = str_replace('>', ' ', $riga['descrizione']);
|
||||
$descrizione = str_replace('…', '...', $descrizione);
|
||||
$descrizione = str_replace('’', ' ', $descrizione);
|
||||
$descrizione = str_replace('ø', 'diametro', $descrizione);
|
||||
$descrizione = $riga['descrizione'];
|
||||
|
||||
// Aggiunta dei riferimenti ai documenti
|
||||
if (setting('Riferimento dei documenti in Fattura Elettronica') && $riga->hasOriginalComponent()) {
|
||||
@ -1450,9 +1446,8 @@ class FatturaElettronica
|
||||
$id_iva_dichiarazione = setting("Iva per lettere d'intento");
|
||||
if (!empty($dichiarazione) && $riga->aliquota->id == $id_iva_dichiarazione) {
|
||||
$dettaglio[]['AltriDatiGestionali'] = [
|
||||
'TipoDato' => 'AswDichInt',
|
||||
'RiferimentoTesto' => $dichiarazione->numero_protocollo,
|
||||
'RiferimentoNumero' => $dichiarazione->numero_progressivo,
|
||||
'TipoDato' => 'INTENTO',
|
||||
'RiferimentoNumero' => $dichiarazione->numero_protocollo,
|
||||
'RiferimentoData' => $dichiarazione->data_emissione,
|
||||
];
|
||||
}
|
||||
@ -1754,4 +1749,4 @@ class FatturaElettronica
|
||||
'id_record' => $this->getDocumento()['id'],
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
@ -648,9 +648,10 @@ class Validator
|
||||
'—' => '-',
|
||||
'…' => '...',
|
||||
'~' => '-',
|
||||
'®' => '',
|
||||
]);
|
||||
|
||||
$output = preg_replace('/[[:^print:]]/', ' ', utf8_decode($output));
|
||||
$output = self::sanitizeXML($output);
|
||||
}
|
||||
|
||||
// Riduzione delle dimensioni
|
||||
@ -686,4 +687,31 @@ class Validator
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removes invalid characters from a UTF-8 XML string
|
||||
*
|
||||
* @param string a XML string potentially containing invalid characters
|
||||
* @return string
|
||||
*/
|
||||
static function sanitizeXML($string)
|
||||
{
|
||||
$result = '';
|
||||
$current = '';
|
||||
$length = strlen($string);
|
||||
|
||||
for ($i=0; $i < $length; $i++) {
|
||||
$current = ord($string[$i]);
|
||||
|
||||
if ($current < 0x20 || $current > 0x7E) {
|
||||
$result .= ' ';
|
||||
}
|
||||
else {
|
||||
$result .= chr($current);
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
@ -310,7 +310,7 @@ class FatturaElettronica
|
||||
$dati_generali = $this->getBody()['DatiGenerali']['DatiGeneraliDocumento'];
|
||||
$data = self::parseDate($dati_generali['Data']);
|
||||
|
||||
$fattura = $this->prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura);
|
||||
$fattura = $this->prepareFattura($id_tipo, $data, $data_registrazione, $id_sezionale, $ref_fattura);
|
||||
$this->fattura = $fattura;
|
||||
|
||||
$numero_esterno = $dati_generali['Numero'];
|
||||
@ -383,13 +383,13 @@ class FatturaElettronica
|
||||
return date('Y-m-d', strtotime($data));
|
||||
}
|
||||
|
||||
protected function prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura)
|
||||
protected function prepareFattura($id_tipo, $data, $data_registrazione, $id_sezionale, $ref_fattura)
|
||||
{
|
||||
$anagrafica = $this->saveAnagrafica();
|
||||
|
||||
$tipo = TipoFattura::where('id', $id_tipo)->first();
|
||||
|
||||
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_sezionale);
|
||||
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_sezionale, null, $data_registrazione);
|
||||
$this->fattura = $fattura;
|
||||
|
||||
// Riferimento per nota di credito e debito
|
||||
|
@ -341,9 +341,9 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
}
|
||||
}
|
||||
|
||||
protected function prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura)
|
||||
protected function prepareFattura($id_tipo, $data, $data_registrazione, $id_sezionale, $ref_fattura)
|
||||
{
|
||||
$fattura = parent::prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura);
|
||||
$fattura = parent::prepareFattura($id_tipo, $data, $data_registrazione, $id_sezionale, $ref_fattura);
|
||||
$database = database();
|
||||
|
||||
$righe = $this->getRighe();
|
||||
|
@ -226,7 +226,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
|
||||
*/
|
||||
public function getMarginePercentualeAttribute()
|
||||
{
|
||||
return $this->imponibile ? (($this->totale_imponibile / $this->spesa) - 1) * 100 : 100;
|
||||
return ($this->totale_imponibile && $this->spesa) ? (($this->totale_imponibile / $this->spesa) - 1) * 100 : 100;
|
||||
}
|
||||
|
||||
public function delete()
|
||||
|
@ -168,11 +168,13 @@ class FileManager implements ManagerInterface
|
||||
$result .= '
|
||||
<button type="button" class="btn btn-xs btn-warning" onclick="modificaAllegato(this)">
|
||||
<i class="fa fa-edit"></i>
|
||||
</button>
|
||||
|
||||
</button>';
|
||||
if (!$file->isFatturaElettronica() || $options['abilita_genera']) {
|
||||
$result .= '
|
||||
<button type="button" class="btn btn-xs btn-danger" onclick="rimuoviAllegato(this)">
|
||||
<i class="fa fa-trash"></i>
|
||||
</button>';
|
||||
}
|
||||
}
|
||||
|
||||
$result .= '
|
||||
|
256
src/Prints.php
256
src/Prints.php
@ -386,37 +386,42 @@ class Prints
|
||||
include $infos['full_directory'].'/pdfgen.'.$infos['directory'].'.php';
|
||||
}
|
||||
|
||||
// Sostituzione di variabili generiche
|
||||
$report = str_replace('$body$', $body, $report);
|
||||
$report = str_replace('$footer$', $footer, $report);
|
||||
if(empty($filename)){
|
||||
// Sostituzione di variabili generiche
|
||||
$report = str_replace('$body$', $body, $report);
|
||||
$report = str_replace('$footer$', $footer, $report);
|
||||
|
||||
$report = str_replace('$font_size$', $font_size, $report);
|
||||
$report = str_replace('$body_table_params$', $body_table_params, $report);
|
||||
$report = str_replace('$table$', $table, $report);
|
||||
$report = str_replace('$font_size$', $font_size, $report);
|
||||
$report = str_replace('$body_table_params$', $body_table_params, $report);
|
||||
$report = str_replace('$table$', $table, $report);
|
||||
|
||||
// Footer di default
|
||||
if (!string_contains($report, '<page_footer>')) {
|
||||
$report .= '<page_footer>$default_footer$</page_footer>';
|
||||
// Footer di default
|
||||
if (!string_contains($report, '<page_footer>')) {
|
||||
$report .= '<page_footer>$default_footer$</page_footer>';
|
||||
}
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
$mode = !empty($directory) ? 'F' : 'I';
|
||||
$mode = !empty($return_string) ? 'S' : $mode;
|
||||
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$title = $file['name'];
|
||||
$path = $file['path'];
|
||||
|
||||
$html2pdf = new Spipu\Html2Pdf\Html2Pdf($orientation, $format, 'it', true, 'UTF-8');
|
||||
|
||||
$html2pdf->writeHTML($report);
|
||||
$html2pdf->pdf->setTitle($title);
|
||||
|
||||
$pdf = $html2pdf->output($path, $mode);
|
||||
$file['pdf'] = $pdf;
|
||||
}else{
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$file['pdf'] = file_get_contents($filename);
|
||||
}
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
$mode = !empty($directory) ? 'F' : 'I';
|
||||
$mode = !empty($return_string) ? 'S' : $mode;
|
||||
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$title = $file['name'];
|
||||
$path = $file['path'];
|
||||
|
||||
$html2pdf = new Spipu\Html2Pdf\Html2Pdf($orientation, $format, 'it', true, 'UTF-8');
|
||||
|
||||
$html2pdf->writeHTML($report);
|
||||
$html2pdf->pdf->setTitle($title);
|
||||
|
||||
$pdf = $html2pdf->output($path, $mode);
|
||||
$file['pdf'] = $pdf;
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
@ -553,77 +558,17 @@ class Prints
|
||||
}
|
||||
}
|
||||
|
||||
// Generazione dei contenuti dell'header
|
||||
ob_start();
|
||||
$print_header = self::filepath($id_print, 'header.php');
|
||||
if (!empty($print_header)) {
|
||||
include $print_header;
|
||||
}
|
||||
$head = ob_get_clean();
|
||||
|
||||
// Header di default
|
||||
$head = !empty($head) ? $head : '$default_header$';
|
||||
|
||||
// Generazione dei contenuti del footer
|
||||
ob_start();
|
||||
$print_footer = self::filepath($id_print, 'footer.php');
|
||||
if (!empty($print_footer)) {
|
||||
include $print_footer;
|
||||
}
|
||||
$foot = ob_get_clean();
|
||||
|
||||
// Footer di default
|
||||
$foot = !empty($foot) ? $foot : '$default_footer$';
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
// Impostazione di header e footer
|
||||
$mpdf->SetHTMLHeader($head);
|
||||
$mpdf->SetHTMLFooter($foot);
|
||||
|
||||
// Generazione dei contenuti della stampa
|
||||
|
||||
if (!empty($single_pieces)) {
|
||||
if(empty($filename)){
|
||||
// Generazione dei contenuti dell'header
|
||||
ob_start();
|
||||
$print_top = self::filepath($id_print, 'top.php');
|
||||
if (!empty($print_top)) {
|
||||
include $print_top;
|
||||
$print_header = self::filepath($id_print, 'header.php');
|
||||
if (!empty($print_header)) {
|
||||
include $print_header;
|
||||
}
|
||||
$top = ob_get_clean();
|
||||
$head = ob_get_clean();
|
||||
|
||||
$top = str_replace(array_keys($replaces), array_values($replaces), $top);
|
||||
|
||||
$mpdf->WriteHTML($top);
|
||||
|
||||
$print_piece = self::filepath($id_print, 'piece.php');
|
||||
foreach ($records as $record) {
|
||||
ob_start();
|
||||
if (!empty($print_piece)) {
|
||||
include $print_piece;
|
||||
}
|
||||
$piece = ob_get_clean();
|
||||
|
||||
$mpdf->WriteHTML($piece);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
$print_bottom = self::filepath($id_print, 'bottom.php');
|
||||
if (!empty($print_bottom)) {
|
||||
include $print_bottom;
|
||||
}
|
||||
$bottom = ob_get_clean();
|
||||
|
||||
$bottom = str_replace(array_keys($replaces), array_values($replaces), $bottom);
|
||||
|
||||
$mpdf->WriteHTML($bottom);
|
||||
|
||||
$report = '';
|
||||
}
|
||||
|
||||
// Footer per l'ultima pagina
|
||||
if (!empty($options['last-page-footer'])) {
|
||||
$is_last_page = true;
|
||||
// Header di default
|
||||
$head = !empty($head) ? $head : '$default_header$';
|
||||
|
||||
// Generazione dei contenuti del footer
|
||||
ob_start();
|
||||
@ -632,35 +577,100 @@ class Prints
|
||||
include $print_footer;
|
||||
}
|
||||
$foot = ob_get_clean();
|
||||
|
||||
// Footer di default
|
||||
$foot = !empty($foot) ? $foot : '$default_footer$';
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
// Impostazione di header e footer
|
||||
$mpdf->SetHTMLHeader($head);
|
||||
$mpdf->SetHTMLFooter($foot);
|
||||
|
||||
// Generazione dei contenuti della stampa
|
||||
|
||||
if (!empty($single_pieces)) {
|
||||
ob_start();
|
||||
$print_top = self::filepath($id_print, 'top.php');
|
||||
if (!empty($print_top)) {
|
||||
include $print_top;
|
||||
}
|
||||
$top = ob_get_clean();
|
||||
|
||||
$top = str_replace(array_keys($replaces), array_values($replaces), $top);
|
||||
|
||||
$mpdf->WriteHTML($top);
|
||||
|
||||
$print_piece = self::filepath($id_print, 'piece.php');
|
||||
foreach ($records as $record) {
|
||||
ob_start();
|
||||
if (!empty($print_piece)) {
|
||||
include $print_piece;
|
||||
}
|
||||
$piece = ob_get_clean();
|
||||
|
||||
$mpdf->WriteHTML($piece);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
$print_bottom = self::filepath($id_print, 'bottom.php');
|
||||
if (!empty($print_bottom)) {
|
||||
include $print_bottom;
|
||||
}
|
||||
$bottom = ob_get_clean();
|
||||
|
||||
$bottom = str_replace(array_keys($replaces), array_values($replaces), $bottom);
|
||||
|
||||
$mpdf->WriteHTML($bottom);
|
||||
|
||||
$report = '';
|
||||
}
|
||||
|
||||
// Footer per l'ultima pagina
|
||||
if (!empty($options['last-page-footer'])) {
|
||||
$is_last_page = true;
|
||||
|
||||
// Generazione dei contenuti del footer
|
||||
ob_start();
|
||||
$print_footer = self::filepath($id_print, 'footer.php');
|
||||
if (!empty($print_footer)) {
|
||||
include $print_footer;
|
||||
}
|
||||
$foot = ob_get_clean();
|
||||
}
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
$mode = !empty($directory) ? 'F' : 'I';
|
||||
$mode = !empty($return_string) ? 'S' : $mode;
|
||||
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$title = $file['name'];
|
||||
$path = $file['path'];
|
||||
|
||||
// Impostazione del titolo del PDF
|
||||
$mpdf->SetTitle($title);
|
||||
|
||||
// Aggiunta dei contenuti
|
||||
$mpdf->WriteHTML($report);
|
||||
|
||||
// Impostazione footer per l'ultima pagina
|
||||
if (!empty($options['last-page-footer'])) {
|
||||
$mpdf->WriteHTML('<div class="fake-footer">'.$foot.'</div>');
|
||||
|
||||
$mpdf->WriteHTML('<div style="position:absolute; bottom: 13mm; margin-right: '.($settings['margins']['right']).'mm">'.$foot.'</div>');
|
||||
}
|
||||
|
||||
// Creazione effettiva del PDF
|
||||
$pdf = $mpdf->Output($path, $mode);
|
||||
$file['pdf'] = $pdf;
|
||||
}else{
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$file['pdf'] = file_get_contents($filename);
|
||||
}
|
||||
|
||||
// Operazioni di sostituzione
|
||||
include base_dir().'/templates/replace.php';
|
||||
|
||||
$mode = !empty($directory) ? 'F' : 'I';
|
||||
$mode = !empty($return_string) ? 'S' : $mode;
|
||||
|
||||
$file = self::getFile($infos, $id_record, $directory, $replaces);
|
||||
$title = $file['name'];
|
||||
$path = $file['path'];
|
||||
|
||||
// Impostazione del titolo del PDF
|
||||
$mpdf->SetTitle($title);
|
||||
|
||||
// Aggiunta dei contenuti
|
||||
$mpdf->WriteHTML($report);
|
||||
|
||||
// Impostazione footer per l'ultima pagina
|
||||
if (!empty($options['last-page-footer'])) {
|
||||
$mpdf->WriteHTML('<div class="fake-footer">'.$foot.'</div>');
|
||||
|
||||
$mpdf->WriteHTML('<div style="position:absolute; bottom: 13mm; margin-right: '.($settings['margins']['right']).'mm">'.$foot.'</div>');
|
||||
}
|
||||
|
||||
// Creazione effettiva del PDF
|
||||
$pdf = $mpdf->Output($path, $mode);
|
||||
$file['pdf'] = $pdf;
|
||||
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
|
@ -170,7 +170,7 @@ echo "
|
||||
if ($options['pricing']) {
|
||||
echo "
|
||||
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
|
||||
<th class='text-center' style='width:15%'>".tr('Importo', [], ['upper' => true])."</th>
|
||||
<th class='text-center' style='width:15%'>".( $options['hide_total'] ? tr('Importo ivato', [], ['upper' => true ]) : tr( 'Importo', [], ['upper' => true]) )."</th>
|
||||
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th>';
|
||||
}
|
||||
|
||||
@ -252,7 +252,7 @@ foreach ($righe as $riga) {
|
||||
// Imponibile
|
||||
echo '
|
||||
<td class="text-right" style="vertical-align: middle" >
|
||||
'.moneyFormat($riga->totale_imponibile).'
|
||||
'.( $options['hide_total'] ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile) ).'
|
||||
</td>';
|
||||
|
||||
// Iva
|
||||
|
32
templates/scadenzario/header.php
Normal file
32
templates/scadenzario/header.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Header di default.
|
||||
* I contenuti di questo file vengono utilizzati per generare l'header delle stampe nel caso non esista un file header.php all'interno della stampa.
|
||||
*
|
||||
* Per modificare l'header della stampa basta aggiungere un file header.php all'interno della cartella della stampa con i contenuti da mostrare (vedasi templates/fatture/header.php).
|
||||
*
|
||||
* La personalizzazione specifica dell'header deve comunque seguire lo standard della cartella custom: anche se il file header.php non esiste nella stampa originaria, se si vuole personalizzare l'header bisogna crearlo all'interno della cartella custom.
|
||||
*/
|
||||
|
||||
echo '
|
||||
<div class="text-right" style="'.((!empty($settings['header-font-size'])) ? 'font-size:'.($settings['header-font-size']).'px;' : '').'" >
|
||||
<p><b>'.$f_ragionesociale.'</b>'.(!empty($f_piva) ? ', '.tr('P.Iva').': '.$f_piva : '').'</p>
|
||||
</div>';
|
@ -8,4 +8,18 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`
|
||||
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `zz_prints` WHERE 1=1 AND enabled=1 HAVING 2=2' WHERE `zz_modules`.`name` = 'Stampe';
|
||||
|
||||
-- Filtro che esclude gli articoli eliminati dal widget degli articoli in esaurimento
|
||||
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(id) AS dato FROM mg_articoli WHERE qta < threshold_qta AND attivo=1 AND deleted_at IS NULL' WHERE `zz_widgets`.`name` = 'Articoli in esaurimento';
|
||||
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(id) AS dato FROM mg_articoli WHERE qta < threshold_qta AND attivo=1 AND deleted_at IS NULL' WHERE `zz_widgets`.`name` = 'Articoli in esaurimento';
|
||||
|
||||
-- Fix problema iva di vendita preselezionata
|
||||
ALTER TABLE `mg_articoli` CHANGE `idiva_vendita` `idiva_vendita` INT(11) NULL DEFAULT NULL;
|
||||
UPDATE `mg_articoli` SET `idiva_vendita`=NULL WHERE `idiva_vendita`=0;
|
||||
|
||||
-- Impostazione per la modifica di altri tecnici nell'app
|
||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES
|
||||
(NULL, 'Abilita la modifica di altri tecnici', '1', 'boolean', 1, 'Applicazione', 4, '');
|
||||
|
||||
-- Fix widget preventivi in lavorazione
|
||||
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(id) AS dato FROM co_preventivi WHERE idstato=(SELECT id FROM co_statipreventivi WHERE descrizione=\"In lavorazione\") AND default_revision=1' WHERE `zz_widgets`.`name` ='Preventivi in lavorazione';
|
||||
|
||||
-- Rimosso controllo is_pianificabile widget contratti in scadenza
|
||||
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(dati.id) AS dato FROM(SELECT id, ((SELECT SUM(co_righe_contratti.qta) FROM co_righe_contratti WHERE co_righe_contratti.um=\'ore\' AND co_righe_contratti.idcontratto=co_contratti.id) - IFNULL( (SELECT SUM(in_interventi_tecnici.ore) FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE in_interventi.id_contratto=co_contratti.id AND in_interventi.idstatointervento IN (SELECT in_statiintervento.idstatointervento FROM in_statiintervento WHERE in_statiintervento.is_completato = 1)), 0) ) AS ore_rimanenti, DATEDIFF(data_conclusione, NOW()) AS giorni_rimanenti, data_conclusione, ore_preavviso_rinnovo, giorni_preavviso_rinnovo, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_contratti.idanagrafica) AS ragione_sociale FROM co_contratti WHERE rinnovabile = 1 AND YEAR(data_conclusione) > 1970 AND co_contratti.id NOT IN (SELECT idcontratto_prev FROM co_contratti contratti) HAVING (ore_rimanenti < ore_preavviso_rinnovo OR DATEDIFF(data_conclusione, NOW()) < ABS(giorni_preavviso_rinnovo)) ORDER BY giorni_rimanenti ASC, ore_rimanenti ASC) dati' WHERE `zz_widgets`.`name` = 'Contratti in scadenza';
|
@ -75,6 +75,7 @@ return [
|
||||
'in_interventi_tecnici',
|
||||
'in_interventi_tecnici_assegnati',
|
||||
'in_righe_interventi',
|
||||
'in_righe_tipiinterventi',
|
||||
'in_statiintervento',
|
||||
'in_tariffe',
|
||||
'in_tipiintervento',
|
||||
|
Loading…
x
Reference in New Issue
Block a user