This commit is contained in:
Beppe 2022-01-13 16:05:15 +01:00
commit e017df05a4
22 changed files with 309 additions and 164 deletions

View File

@ -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>

View File

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

View File

@ -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') {

View File

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

View File

@ -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

View File

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

View File

@ -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')),

View File

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

View File

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

View File

@ -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();
}
}
}

View File

@ -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,

View File

@ -1356,11 +1356,7 @@ class FatturaElettronica
}
// Non ammesso
// $descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8');
$descrizione = str_replace('&gt;', ' ', $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'],
];
}
}
}

View File

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

View File

@ -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

View File

@ -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();

View File

@ -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()

View File

@ -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 .= '

View File

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

View 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

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

View File

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

View File

@ -75,6 +75,7 @@ return [
'in_interventi_tecnici',
'in_interventi_tecnici_assegnati',
'in_righe_interventi',
'in_righe_tipiinterventi',
'in_statiintervento',
'in_tariffe',
'in_tipiintervento',