1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-01 16:36:45 +01:00

Bugfix merge

This commit is contained in:
Thomas Zilio 2019-01-10 18:41:25 +01:00
parent a8b9177447
commit 6203f594d4
38 changed files with 290 additions and 154 deletions

View File

@ -4,6 +4,10 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release.
- [2.4.5 (2019-01-10)](#245-2019-01-10)
- [Aggiunto (Added)](#aggiunto-added)
- [Modificato (Changed)](#modificato-changed)
- [Fixed](#fixed)
- [2.4.4 (2018-12-12)](#244-2018-12-12)
- [Aggiunto (Added)](#aggiunto-added)
- [Fixed](#fixed)
@ -44,12 +48,33 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- [Fixed](#fixed-7)
## 2.4.5 (2019-01-10)
### Aggiunto (Added)
- Introduzione dello split payment
- Introduzione dei campi Nome e Cognome per le anagrafiche
- Introduzione della possibilità di non verificare il certificato SSL per gli account email
- Introduzione calcolo del guadagno in fase di aggiunta righe nei documenti
### Modificato (Changed)
- Miglioramento della generazione xml per le Fatture Elettroniche
- Miglioramento procedura importazione xml per le Fatture Elettroniche
- Gestite righe di tipo descrizione nelle Fatture Elettroniche
### Fixed
- Fix calcolo codice intervento
- Fix dei filtri per la stampa del riepilogo interventi
- Risolti altri bug minori
## 2.4.4 (2018-12-12)
### Aggiunto (Added)
- Controllo sulla presenza di personalizzazioni nel modulo **Aggiornamenti**
- Stati multipli per la Fatture Elettroniche (per ampliamenti futuri)
- Stati multipli per le Fatture Elettroniche (per ampliamenti futuri)
### Fixed

View File

@ -56,4 +56,11 @@ $(document).ready(function () {
}, 350);
});
// Forza l'evento "blur" nei campi di testo per formattare i numeri con
// jquery inputmask prima del submit
setTimeout( function(){
$('form').on('submit', function(){
$('input').trigger('blur');
});
}, 1000 );
});

View File

@ -11,7 +11,7 @@ if (!isset($options['edit_articolo']) || !empty($options['edit_articolo'])) {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$result['idarticolo'].'", "ajax-source": "articoli" '.(($options['dir'] == 'uscita') ? ',"icon-after": "add|'.Modules::get('Articoli')['id'].'"' : "").' ]}
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$result['idarticolo'].'", "ajax-source": "articoli" '.(($options['dir'] == 'uscita') ? ',"icon-after": "add|'.Modules::get('Articoli')['id'].'"' : '').' ]}
</div>
</div>';
} else {

View File

@ -39,7 +39,7 @@ if (!$cliente) {
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Denominazione'); ?>", "name": "ragione_sociale", "required": 1, "value": "$ragione_sociale$" ]}
{[ "type": "text", "label": "<?php echo tr('Denominazione'); ?>", "name": "ragione_sociale", "required": 1, "value": "$ragione_sociale$", "extra": "autocomplete=\"off\"" ]}
</div>
<div class="col-md-3">
@ -54,11 +54,11 @@ if (!$cliente) {
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 0, "value": "$nome$" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 0, "value": "$nome$", "extra": "autocomplete=\"off\"" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Cognome'); ?>", "name": "cognome", "required": 0, "value": "$cognome$" ]}
{[ "type": "text", "label": "<?php echo tr('Cognome'); ?>", "name": "cognome", "required": 0, "value": "$cognome$", "extra": "autocomplete=\"off\"" ]}
</div>
<div class="col-md-4">
@ -452,7 +452,14 @@ if (!empty($google)) {
</div>
</div>
<?php
}
?>
<?php
//se non è l'anagrafica azienda, ma cliente o fornitore
if ($cliente or $fornitore) {
?>
<div class="row">
@ -599,7 +606,7 @@ if (!empty($elementi)) {
$modulo = 'Contratti';
} elseif (in_array($elemento['tipo_documento'], ['Ordine cliente', 'Ordine fornitore'])) {
$modulo = ($elemento['dir'] == 'entrata') ? 'Ordini cliente' : 'Ordini fornitore';
} elseif (in_array($elemento['tipo_documento'], ['Ddt di vendita', 'Ddt di acquisto'])) {
} elseif (in_array($elemento['tipo_documento'], ['Ddt in uscita', 'Ddt in entrata'])) {
$modulo = ($elemento['dir'] == 'entrata') ? 'Ddt di vendita' : 'Ddt di acquisto';
} else {
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
@ -660,23 +667,26 @@ if (empty($record['deleted_at'])) {
});
// Abilito solo ragione sociale oppure solo nome-cognome in base a cosa compilo
$('#nome, #cognome').keyup(function(){
$('#nome, #cognome').bind("keyup change", function(e) {
if ($('#nome').val() == '' && $('#cognome').val() == '' ){
$('#nome, #cognome').prop('disabled', true).prop('required', false);
$('#ragione_sociale').prop('disabled', false).prop('required', true);
$('#ragione_sociale').focus();
}else{
$('#nome, #cognome').prop('disabled', false).prop('required', true);
$('#ragione_sociale').prop('disabled', true).prop('required', false);
}
});
$('#ragione_sociale').keyup(function(){
$('#ragione_sociale').bind("keyup change", function(e) {
if ($('#ragione_sociale').val() == '' ){
$('#nome, #cognome').prop('disabled', false).prop('required', true);
$('#ragione_sociale').prop('disabled', true).prop('required', false);
$('#nome').focus();
}else{
$('#nome, #cognome').prop('disabled', true).prop('required', false);
$('#ragione_sociale').prop('disabled', false).prop('required', true);
$('#ragione_sociale').focus();
}
});

View File

@ -63,7 +63,10 @@ switch (post('op')) {
// Ricerca di eventuale anagrafica corrispondente
if (!empty($primary_key)) {
$anagrafica = Anagrafica::where($primary_key, '=', $dati_anagrafica[$primary_key])->first();
//impedisco di aggiornare la mia anagrafica azienda
if ($dati_anagrafica[$primary_key] != setting('Azienda predefinita')) {
$anagrafica = Anagrafica::where($primary_key, '=', $dati_anagrafica[$primary_key])->first();
}
}
if (empty($anagrafica)) {

View File

@ -66,8 +66,8 @@ if (!empty($rs2)) {
<td>'.$r['movimento'].'
'.((!empty($r['idintervento'])) ? Modules::link('Interventi', $r['idintervento']) : '').'
'.((!empty($r['idautomezzo'])) ? Modules::link('Automezzi', $r['idautomezzo']) : '').'
'.((!empty($r['idddt'])) ? (Modules::link('DDt di '.$dir, $r['idddt'], null, null, (intval($database->fetchOne('SELECT * FROM `dt_ddt` WHERE `id` ='.prepare($r['idddt'])))) ? '': 'class="disabled"')) : '').'
'.((!empty($r['iddocumento'])) ? (Modules::link('Fatture di '.$dir, $r['iddocumento'], null, null, (intval($database->fetchOne('SELECT * FROM `co_documenti` WHERE `id` ='.prepare($r['iddocumento'])))) ? '': 'class="disabled"')) : '' ).'
'.((!empty($r['idddt'])) ? (Modules::link('DDt di '.$dir, $r['idddt'], null, null, (intval($database->fetchOne('SELECT * FROM `dt_ddt` WHERE `id` ='.prepare($r['idddt'])))) ? '' : 'class="disabled"')) : '').'
'.((!empty($r['iddocumento'])) ? (Modules::link('Fatture di '.$dir, $r['iddocumento'], null, null, (intval($database->fetchOne('SELECT * FROM `co_documenti` WHERE `id` ='.prepare($r['iddocumento'])))) ? '' : 'class="disabled"')) : '').'
</td>';
// Data

View File

@ -4,7 +4,7 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'contratti':
$query = 'SELECT co_contratti.id AS id, CONCAT("Contratto ", numero, " del ", DATE_FORMAT(data_bozza, "%d/%m/%Y"), " - ", nome, " [", (SELECT `descrizione` FROM `co_staticontratti` WHERE `co_staticontratti`.`id` = `idstato`) , "]") AS descrizione, (SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS totale, (SELECT SUM(sconto) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS sconto, (SELECT COUNT(id) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS n_righe FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
$query = 'SELECT co_contratti.id AS id, CONCAT("Contratto ", numero, " del ", DATE_FORMAT(data_bozza, "%d/%m/%Y"), " - ", co_contratti.nome, " [", (SELECT `descrizione` FROM `co_staticontratti` WHERE `co_staticontratti`.`id` = `idstato`) , "]") AS descrizione, (SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS totale, (SELECT SUM(sconto) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS sconto, (SELECT COUNT(id) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS n_righe FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);

View File

@ -3,7 +3,6 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\DDT\Components\Articolo;
use Modules\DDT\Components\Descrizione;
use Modules\DDT\Components\Riga;

View File

@ -878,7 +878,7 @@ switch (post('op')) {
// Inserimento riga normale
else {
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_descrizione, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, sconto_globale, idiva, desc_iva, iva, iva_indetraibile, um, qta, `order`) values('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($rs_righe[$i]['is_descrizione']).', '.prepare($rs_righe[$i]['descrizione']).', '.prepare($rs_righe[$i]['subtotale']).', '.prepare($rs_righe[$i]['sconto']).', '.prepare($rs_righe[$i]['sconto_unitario']).', '.prepare($rs_righe[$i]['tipo_sconto']).', '.prepare($rs_righe[$i]['sconto_globale']).', '.prepare($rs_righe[$i]['idiva']).', '.prepare($rs_righe[$i]['desc_iva']).', '.prepare($rs_righe[$i]['iva']).', '.prepare($rs_righe[$i]['iva_indetraibile']).', '.prepare($rs_righe[$i]['um']).', '.prepare($rs_righe[$i]['qta']).', '.prepare($rs_righe[$i]['order']).')');
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_descrizione, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, sconto_globale, idiva, desc_iva, iva, iva_indetraibile, um, qta, idconto, `order`) values('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($rs_righe[$i]['is_descrizione']).', '.prepare($rs_righe[$i]['descrizione']).', '.prepare($rs_righe[$i]['subtotale']).', '.prepare($rs_righe[$i]['sconto']).', '.prepare($rs_righe[$i]['sconto_unitario']).', '.prepare($rs_righe[$i]['tipo_sconto']).', '.prepare($rs_righe[$i]['sconto_globale']).', '.prepare($rs_righe[$i]['idiva']).', '.prepare($rs_righe[$i]['desc_iva']).', '.prepare($rs_righe[$i]['iva']).', '.prepare($rs_righe[$i]['iva_indetraibile']).', '.prepare($rs_righe[$i]['um']).', '.prepare($rs_righe[$i]['qta']).', '.prepare($idconto).', '.prepare($rs_righe[$i]['order']).')');
}
}

View File

@ -35,16 +35,15 @@ if ($dir == 'entrata') {
<?php
if ($dir == 'entrata') {
$rs2 = $dbo->fetchArray('SELECT piva, codice_fiscale, citta, indirizzo, cap, provincia, id_nazione FROM an_anagrafiche WHERE idanagrafica='.prepare($record['idanagrafica']));
$rs2 = $dbo->fetchArray('SELECT piva, codice_fiscale, citta, indirizzo, cap, provincia, id_nazione, tipo FROM an_anagrafiche WHERE idanagrafica='.prepare($record['idanagrafica']));
$campi_mancanti = [];
if ($rs2[0]['piva'] == '') {
if ($rs2[0]['codice_fiscale'] == '' and ($rs2[0]['tipo'] == 'Privato' or $rs2[0]['tipo'] == 'Ente pubblico')) {
array_push($campi_mancanti, 'Codice fiscale');
} elseif ($rs2[0]['piva'] == '') {
array_push($campi_mancanti, 'Partita IVA');
}
/*if ($rs2[0]['codice_fiscale'] == '') {
array_push($campi_mancanti, 'Codice fiscale');
}
*/
if ($rs2[0]['citta'] == '') {
array_push($campi_mancanti, 'Città');
}
@ -235,16 +234,16 @@ if ($dir == 'uscita') {
</div>
<?php
//TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
//TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Fattura per conto terzi'); ?>", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "<?php echo tr('Nell\'xml della FE imposta il cliente come cessionario e il fornitore come cedente/prestatore.'); ?>", "placeholder": "<?php echo tr('Fattura per conto terzi'); ?>" ]}
</div>
<?php
}
?>
}
?>
</div>

View File

@ -33,25 +33,17 @@ foreach ($righe as $riga) {
$riga['sconto'] = abs($riga['sconto']);
$riga['iva'] = abs($riga['iva']);
if (empty($riga['is_descrizione'])) {
$riga['descrizione_conto'] = $dbo->fetchOne('SELECT descrizione FROM co_pianodeiconti3 WHERE id = '.prepare($riga['idconto']))['descrizione'];
}
$extra = '';
$ref_modulo = null;
$ref_id = null;
// Preventivi
if (!empty($riga['idpreventivo'])) {
$delete = 'unlink_preventivo';
}
// Contratti
elseif (!empty($riga['idcontratto'])) {
$delete = 'unlink_contratto';
}
// Intervento
elseif (!empty($riga['idintervento'])) {
$delete = 'unlink_intervento';
}
// Articoli
elseif ($riga instanceof Articolo) {
if ($riga instanceof Articolo) {
$ref_modulo = Modules::get('Articoli')['id'];
$ref_id = $riga['idarticolo'];
@ -62,6 +54,30 @@ foreach ($righe as $riga) {
$extra = '';
$mancanti = 0;
}
// Intervento
elseif (!empty($riga['idintervento'])) {
//$ref_modulo = Modules::get('Interventi')['id'];
//$ref_id = $riga['idintervento'];
$delete = 'unlink_intervento';
}
// Preventivi
elseif (!empty($riga['idpreventivo'])) {
//$ref_modulo = Modules::get('Preventivi')['id'];
//$ref_id = $riga['idpreventivo'];
$delete = 'unlink_preventivo';
}
// Contratti
elseif (!empty($riga['idcontratto'])) {
//$ref_modulo = Modules::get('Contratti')['id'];
//$ref_id = $riga['idcontratto'];
$contratto = $dbo->fetchOne('SELECT codice_cig,codice_cup,id_documento_fe FROM co_contratti WHERE id = '.prepare($riga['idcontratto']));
$riga['codice_cig'] = $contratto['codice_cig'];
$riga['codice_cup'] = $contratto['codice_cup'];
$riga['id_documento_fe'] = $contratto['id_documento_fe'];
$delete = 'unlink_contratto';
}
// Righe generiche
else {
$delete = 'unlink_riga';
@ -79,11 +95,19 @@ foreach ($righe as $riga) {
}
}
$extra_riga = '';
$extra_riga = tr('_DESCRIZIONE_CONTO_ _CODICE_CIG_ _CODICE_CUP_ _ID_DOCUMENTO_', [
'_DESCRIZIONE_CONTO_' => $riga['descrizione_conto'] ?: null,
'_CODICE_CIG_' => $riga['codice_cig'] ? '<br>CIG: '.$riga['codice_cig'] : null,
'_CODICE_CUP_' => $riga['codice_cup'] ? '<br>CUP: '.$riga['codice_cup'] : null,
'_ID_DOCUMENTO_' => $riga['id_documento_fe'] ? '<br>DOC: '.$riga['id_documento_fe'] : null,
]);
echo '
<tr data-id="'.$riga['id'].'" '.$extra.'>
<td>
'.Modules::link($ref_modulo, $ref_id, $riga['descrizione']).'
<small class="pull-right text-muted">'.$riga['descrizione_conto'].'</small>';
<small class="pull-right text-muted">'.$extra_riga.'</small>';
if (!empty($riga['abilita_serial'])) {
if (!empty($mancanti)) {
@ -111,7 +135,7 @@ foreach ($righe as $riga) {
<br>'.Modules::link('Fatture di vendita', $record['ref_documento'], $text, $text);
}
$ref = doc_references($r, $dir, ['iddocumento']);
$ref = doc_references($riga, $dir, ['iddocumento']);
if (!empty($ref)) {
echo '
<br>'.Modules::link($ref['module'], $ref['id'], $ref['description'], $ref['description']);

View File

@ -141,34 +141,44 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
</div>
<?php
// Visualizzo solo se l'attività non è già collegata ad un contratto
if (empty($record['idcontratto'])) {
// Visualizzo solo se l'anagrafica cliente è un ente pubblico
if (!empty($record['idcontratto'])) {
$contratto = $dbo->fetchOne('SELECT codice_cig,codice_cup,id_documento_fe FROM co_contratti WHERE id = '.prepare($record['idcontratto']));
$record['id_documento_fe'] = $contratto['id_documento_fe'];
$record['codice_cup'] = $contratto['codice_cup'];
$record['codice_cig'] = $contratto['codice_cig'];
}
?>
<!-- Fatturazione Elettronica PA-->
<div class="panel panel-primary <?php echo (($record['tipo_anagrafica']) == 'Ente pubblico') ? 'show' : 'hide'; ?>" >
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Dati appalto'); ?></h3>
<h3 class="panel-title"><?php echo tr('Dati appalto'); ?>
<?php if (!empty($record['idcontratto'])) {
?>
<span class="tip" title="<?php echo tr('E\' possibile specificare i dati dell\'appalto solo se il cliente è di tipo \'Ente pubblico\' e l\'attività non risulta già collegata ad un contratto.'); ?>" > <i class="fa fa-question-circle-o"></i></span>
</h3>
<?php
} ?>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Identificatore Documento'); ?>", "name": "id_documento_fe", "required": 0, "value": "$id_documento_fe$", "maxlength": 20, "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "<?php echo !empty($record['idcontratto']) ? 'span' : 'text'; ?>", "label": "<?php echo tr('Identificatore Documento'); ?>", "name": "id_documento_fe", "required": 0, "value": "<?php echo $record['id_documento_fe']; ?>", "maxlength": 20, "readonly": "<?php echo $record['flag_completato']; ?>", "extra": "" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice CIG'); ?>", "name": "codice_cig", "required": 0, "value": "$codice_cig$", "maxlength": 15, "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "<?php echo !empty($record['idcontratto']) ? 'span' : 'text'; ?>", "label": "<?php echo tr('Codice CIG'); ?>", "name": "codice_cig", "required": 0, "value": "<?php echo $record['codice_cig']; ?>", "maxlength": 15, "readonly": "<?php echo $record['flag_completato']; ?>", "extra": "" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice CUP'); ?>", "name": "codice_cup", "required": 0, "value": "$codice_cup$", "maxlength": 15, "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "<?php echo !empty($record['idcontratto']) ? 'span' : 'text'; ?>", "label": "<?php echo tr('Codice CUP'); ?>", "name": "codice_cup", "required": 0, "value": "<?php echo $record['codice_cup']; ?>", "maxlength": 15, "readonly": "<?php echo $record['flag_completato']; ?>", "extra": "" ]}
</div>
</div>
</div>
</div>
<?php
}
?>
<!-- ORE LAVORO -->
<div class="panel panel-primary">

View File

@ -6,9 +6,9 @@ use Common\Model;
class TipoSessione extends Model
{
public $incrementing = false;
protected $table = 'in_tipiintervento';
protected $primaryKey = 'idtipointervento';
public $incrementing = false;
/**
* Restituisce l'identificativo.

View File

@ -77,9 +77,10 @@ switch ($op) {
$idanagrafica = post('idanagrafica');
$nome = post('nome');
$idtecnico = post('idtecnico');
$idsede = post('idsede');
if (!empty($matricola)) {
$dbo->query('INSERT INTO my_impianti(matricola, idanagrafica, nome, data, idtecnico) VALUES ('.prepare($matricola).', '.prepare($idanagrafica).', '.prepare($nome).', NOW(), '.prepare($idtecnico).')');
$dbo->query('INSERT INTO my_impianti(matricola, idanagrafica, nome, data, idtecnico, idsede) VALUES ('.prepare($matricola).', '.prepare($idanagrafica).', '.prepare($nome).', NOW(), '.prepare($idtecnico).', '.prepare($idsede).')');
$id_record = $dbo->lastInsertedID();

View File

@ -3,7 +3,6 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Ordini\Components\Articolo;
use Modules\Ordini\Components\Descrizione;
use Modules\Ordini\Components\Riga;

View File

@ -2,7 +2,7 @@
include_once __DIR__.'/../../core.php';
if (!in_array($record['stato'], ['Evaso', 'Fatturato'])) {
if (!in_array($record['stato'], ['Fatturato'])) {
echo '
<div class="dropdown">
<button class="btn btn-info dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
@ -19,7 +19,7 @@ if (!in_array($record['stato'], ['Evaso', 'Fatturato'])) {
</li>';
}
if (in_array($record['stato'], ['Bozza', 'Parzialmente fatturato'])) {
if (in_array($record['stato'], ['Bozza', 'Evaso', 'Parzialmente evaso', 'Parzialmente fatturato'])) {
echo '
<li>
<a data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'"><i class="fa fa-file"></i>&nbsp;'.tr('fattura').'

View File

@ -15,7 +15,7 @@ class Articolo extends Article
/**
* Crea un nuovo articolo collegato ad una ordine.
*
* @param Ordine $ordine
* @param Ordine $ordine
* @param Original $articolo
*
* @return self

View File

@ -3,12 +3,10 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Interventi\TipoSessione;
use Modules\Preventivi\Components\Articolo;
use Modules\Preventivi\Components\Descrizione;
use Modules\Preventivi\Components\Riga;
use Modules\Preventivi\Preventivo;
use Modules\Interventi\TipoSessione;
switch (post('op')) {
case 'add':
@ -110,7 +108,6 @@ switch (post('op')) {
$numeropreventivo_template = str_replace('#', '%', $numeropreventivo_template);
$rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero LIKE('.prepare(Util\Generator::complete($numeropreventivo_template)).') ORDER BY numero DESC LIMIT 0,1');
$numero = Util\Generator::generate(setting('Formato codice preventivi'), $rs[0]['numero']);
$dbo->query('UPDATE co_preventivi SET idstato=1, numero = '.$numero.', master_revision = id WHERE id='.prepare($id_record));
@ -122,7 +119,6 @@ switch (post('op')) {
$dbo->query('DROP TEMPORARY TABLE tmp');
flash()->info(tr('Preventivo duplicato correttamente!'));
break;

View File

@ -5,7 +5,7 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'preventivi':
if (isset($superselect['idanagrafica'])) {
$query = 'SELECT co_preventivi.id AS id, an_anagrafiche.idanagrafica, CONCAT("Preventivo ", numero, " del ", DATE_FORMAT(data_bozza, "%d/%m/%Y"), " - ", nome, " [", (SELECT `descrizione` FROM `co_statipreventivi` WHERE `co_statipreventivi`.`id` = `idstato`) , "]") AS descrizione, co_preventivi.idtipointervento, (SELECT descrizione FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento = co_preventivi.idtipointervento) AS idtipointervento_descrizione, (SELECT tempo_standard FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento = co_preventivi.idtipointervento) AS tempo_standard, (SELECT SUM(subtotale) FROM co_righe_preventivi WHERE idpreventivo=co_preventivi.id GROUP BY idpreventivo) AS totale, (SELECT SUM(sconto) FROM co_righe_preventivi WHERE idpreventivo=co_preventivi.id GROUP BY idpreventivo) AS sconto FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
$query = 'SELECT co_preventivi.id AS id, an_anagrafiche.idanagrafica, CONCAT("Preventivo ", numero, " del ", DATE_FORMAT(data_bozza, "%d/%m/%Y"), " - ", co_preventivi.nome, " [", (SELECT `descrizione` FROM `co_statipreventivi` WHERE `co_statipreventivi`.`id` = `idstato`) , "]") AS descrizione, co_preventivi.idtipointervento, (SELECT descrizione FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento = co_preventivi.idtipointervento) AS idtipointervento_descrizione, (SELECT tempo_standard FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento = co_preventivi.idtipointervento) AS tempo_standard, (SELECT SUM(subtotale) FROM co_righe_preventivi WHERE idpreventivo=co_preventivi.id GROUP BY idpreventivo) AS totale, (SELECT SUM(sconto) FROM co_righe_preventivi WHERE idpreventivo=co_preventivi.id GROUP BY idpreventivo) AS sconto FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);
@ -45,7 +45,7 @@ switch ($resource) {
break;
case 'preventivi_aperti':
$query = 'SELECT co_preventivi.id AS id, CONCAT(numero, " ", nome, " (", ragione_sociale, ")") AS descrizione FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
$query = 'SELECT co_preventivi.id AS id, CONCAT(numero, " ", co_preventivi.nome, " (", ragione_sociale, ")") AS descrizione FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'idpreventivo='.prepare($element);

View File

@ -15,8 +15,8 @@ class Articolo extends Article
/**
* Crea un nuovo articolo collegato ad una preventivo.
*
* @param Preventivo $preventivo
* @param Original $articolo
* @param Preventivo $preventivo
* @param Original $articolo
*
* @return self
*/

View File

@ -2,12 +2,12 @@
namespace Modules\Preventivi;
use Carbon\Carbon;
use Common\Document;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\TipoSessione;
use Traits\RecordTrait;
use Util\Generator;
use Carbon\Carbon;
class Preventivo extends Document
{
@ -18,9 +18,9 @@ class Preventivo extends Document
/**
* Crea un nuovo preventivo.
*
* @param Anagrafica $anagrafica
* @param Anagrafica $anagrafica
* @param TipoIntervento $tipo_sessione
* @param string $nome
* @param string $nome
*
* @return self
*/

View File

@ -242,7 +242,7 @@ include_once __DIR__.'/../../core.php';
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type='button' class="btn btn-default" id='btn_crea_modello'><i class="fa fa-plus"></i> <?php echo tr('Aggiungi e crea modello'); ?></button>
<button type='button' class="btn btn-primary" id='btn_crea_modello'><i class="fa fa-plus"></i> <?php echo tr('Aggiungi e crea modello'); ?></button>
<button type="submit" class="btn btn-primary" id='btn_submit'><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></button>
</div>
</div>
@ -338,10 +338,10 @@ include_once __DIR__.'/../../core.php';
$('#bs-popup #modello_primanota').change(function(){
if ($(this).val()!=''){
$('#btn_crea_modello').text('<?php echo tr('Aggiungi e modifica modello'); ?>');
$('#btn_crea_modello').html('<i class="fa fa-edit"></i> '+'<?php echo tr('Aggiungi e modifica modello'); ?>');
$('#bs-popup #idmastrino').val($(this).val());
}else{
$('#btn_crea_modello').text('<?php echo tr('Aggiungi e crea modello'); ?>');
$('#btn_crea_modello').html('<i class="fa fa-plus"></i> '+'<?php echo tr('Aggiungi e crea modello'); ?>');
$('#bs-popup #idmastrino').val(0);
}

View File

@ -657,7 +657,8 @@ class FatturaElettronica
public function getRighe()
{
if (empty($this->righe)) {
$this->righe = database()->fetchArray('SELECT * FROM `co_righe_documenti` WHERE `sconto_globale` = 0 AND is_descrizione = 0 AND `iddocumento` = '.prepare($this->getDocumento()['id']));
//AND is_descrizione = 0
$this->righe = database()->fetchArray('SELECT * FROM `co_righe_documenti` WHERE `sconto_globale` = 0 AND `iddocumento` = '.prepare($this->getDocumento()['id']));
}
return $this->righe;
@ -967,13 +968,23 @@ class FatturaElettronica
$result['CodiceFiscale'] = $anagrafica['codice_fiscale'];
}
$result['Anagrafica'] = [
'Denominazione' => $anagrafica['ragione_sociale'],
// TODO: 'Nome' => $azienda['ragione_sociale'],
// TODO: 'Cognome' => $azienda['ragione_sociale'],
// TODO: 'Titolo' => $azienda['ragione_sociale'],
// TODO: CodEORI
];
if (!empty($anagrafica['nome']) or !empty($anagrafica['cognome'])) {
$result['Anagrafica'] = [
//'Denominazione' => $anagrafica['ragione_sociale'],
'Nome' => $anagrafica['nome'],
'Cognome' => $anagrafica['cognome'],
// TODO: 'Titolo' => $anagrafica['ragione_sociale'],
// TODO: CodEORI
];
} else {
$result['Anagrafica'] = [
'Denominazione' => $anagrafica['ragione_sociale'],
//'Nome' => $anagrafica['nome'],
//'Cognome' => $anagrafica['cognome'],
// TODO: 'Titolo' => $anagrafica['ragione_sociale'],
// TODO: CodEORI
];
}
// Informazioni specifiche azienda
if ($azienda) {
@ -1387,6 +1398,14 @@ class FatturaElettronica
$riga['qta'] = abs($riga['qta']);
$riga['sconto'] = abs($riga['sconto']);
//Fix per righe di tipo descrizione, copio idiva dalla prima riga del documento che non è di tipo descrizione, riportando di conseguenza eventuali % e/o nature
if (!empty($riga['is_descrizione'])) {
$riga['idiva'] = $database->fetchOne('SELECT `idiva` FROM `co_righe_documenti` WHERE `is_descrizione` = 0 AND `iddocumento` = '.prepare($documento['id']))['idiva'];
}
//Fix per qta, deve sempre essere impostata almeno a 1
$riga['qta'] = (!empty($riga['qta'])) ? $riga['qta'] : 1;
$prezzo_unitario = $riga['subtotale'] / $riga['qta'];
$prezzo_totale = $riga['subtotale'] - $riga['sconto'];
@ -1462,6 +1481,18 @@ class FatturaElettronica
$dettaglio['RiferimentoAmministrazione'] = $riga['riferimento_amministrazione'];
}
// AltriDatiGestionali (2.2.1.16) - Ritenuta ENASARCO
$riga['ritenutaenasarco'] = floatval($riga['ritenutaenasarco']);
if (!empty($riga['ritenutaenasarco'])) {
$ritenutaenasarco = [
'TipoDato' => 'CASSA-PREV',
'RiferimentoTesto' => 'ENASARCO - TC07',
'RiferimentoNumero' => $riga['ritenutaenasarco'],
];
$dettaglio['AltriDatiGestionali'] = $ritenutaenasarco;
}
$result[] = [
'DettaglioLinee' => $dettaglio,
];
@ -1473,8 +1504,8 @@ class FatturaElettronica
foreach ($riepiloghi_percentuale as $riepilogo) {
$iva = [
'AliquotaIVA' => $riepilogo['percentuale'],
'ImponibileImporto' => $riepilogo['totale'],
'Imposta' => $riepilogo['iva'],
'ImponibileImporto' => abs($riepilogo['totale']),
'Imposta' => abs($riepilogo['iva']),
'EsigibilitaIVA' => $riepilogo['esigibilita'],
];
@ -1501,8 +1532,8 @@ class FatturaElettronica
$iva = [
'AliquotaIVA' => 0,
'Natura' => $riepilogo['codice_natura_fe'],
'ImponibileImporto' => $riepilogo['totale'],
'Imposta' => $riepilogo['iva'],
'ImponibileImporto' => abs($riepilogo['totale']),
'Imposta' => abs($riepilogo['iva']),
'EsigibilitaIVA' => $riepilogo['esigibilita'],
];
@ -1541,7 +1572,7 @@ class FatturaElettronica
$pagamento = [
'ModalitaPagamento' => $co_pagamenti['codice_modalita_pagamento_fe'],
'DataScadenzaPagamento' => $scadenza['scadenza'],
'ImportoPagamento' => $scadenza['da_pagare'],
'ImportoPagamento' => abs($scadenza['da_pagare']),
];
if (!empty($documento['idbanca'])) {
@ -1556,11 +1587,9 @@ class FatturaElettronica
$pagamento['BIC'] = $co_banche['bic'];
}
}
}
$result[] = [
'DettaglioPagamento' => $pagamento,
];
$result[]['DettaglioPagamento'] = $pagamento;
}
return $result;
}

View File

@ -43,7 +43,7 @@ switch (filter('op')) {
case 'generate':
$fattura_pa = new FatturaElettronica(post('filename'));
$id_record = $fattura_pa->saveFattura(post('pagamento'), post('id_segment'));
$id_record = $fattura_pa->saveFattura(post('pagamento'), post('id_segment'), post('id_tipo'));
$fattura_pa->saveRighe(post('articoli'), post('iva'), post('conto'));
$fattura_pa->getFattura()->updateSconto();

View File

@ -74,7 +74,7 @@ echo '
<div class="col-md-3">
<button type="button" class="btn btn-primary pull-right" onclick="upload(this)">
<i class="fa fa-upload"></i> '.tr('Carica fattura di acquisto').'
<i class="fa fa-upload"></i> '.tr('Carica documento fornitore').'
</button>
</div>
</div>

View File

@ -27,18 +27,7 @@ $citta = $sede['Comune'];
$provincia = $sede['Provincia'];
echo '
<div class="row" >
<div class="col-md-6" >
<h4>'.
$ragione_sociale.'<br>
<small>
'.(!empty($codice_fiscale) ? (tr('Codice Fiscale').': '.$codice_fiscale.'<br>') : '').'
'.(!empty($partita_iva) ? (tr('Partita IVA').': '.$partita_iva.'<br>') : '').'
'.$cap.' '.$citta.' ('.$provincia.')<br>
</small>
</h4>
</div>';
echo '
<div class="row">
<div class="col-md-6">
<h4>'.$fattura_pa->getBody()['DatiGenerali']['DatiGeneraliDocumento']['Numero'].'<br>
<small>
@ -50,10 +39,10 @@ echo '
</div>
</div>';
// Pagamenti
$pagamenti = $fattura_pa->getBody()['DatiPagamento'];
// Se il blocco DatiPagamento è valorizzato (opzionale)
if (!empty($pagamenti)) {
if (!empty($fattura_pa->getBody()['DatiPagamento'])) {
$pagamenti = $fattura_pa->getBody()['DatiPagamento'];
$metodi = $pagamenti['DettaglioPagamento'];
$metodi = isset($metodi[0]) ? $metodi : [$metodi];
$codice_modalita_pagamento = $metodi[0]['ModalitaPagamento'];
@ -63,7 +52,7 @@ if (!empty($pagamenti)) {
<p>'.tr('La fattura importata presenta _NUM_ rat_E_ di pagamento con le seguenti scadenze', [
'_NUM_' => count($metodi),
'_E_' => ((count($metodi)>1) ? 'e': 'a'),
'_E_' => ((count($metodi) > 1) ? 'e' : 'a'),
]).':</p>
<ol>';
@ -80,7 +69,6 @@ if (!empty($pagamenti)) {
echo Translator::numberToLocale($metodo['ImportoPagamento']).' &euro; ';
echo '('.((!empty($metodo['ModalitaPagamento'])) ? database()->fetchOne('SELECT descrizione FROM fe_modalita_pagamento WHERE codice = '.prepare($metodo['ModalitaPagamento']))['descrizione'] : '').')';
echo '
</li>';
}
@ -89,28 +77,19 @@ if (!empty($pagamenti)) {
</ol>';
}
$metodi = $pagamenti['DettaglioPagamento'];
$metodi = isset($metodi[0]) ? $metodi : [$metodi];
// Tipo del documento
$codice_tipo_documento_fe = (intval(database()->fetchNum('SELECT id FROM co_tipidocumento WHERE codice_tipo_documento_fe = '.prepare($fattura_pa->getBody()['DatiGenerali']['DatiGeneraliDocumento']['TipoDocumento']).''))) ? $fattura_pa->getBody()['DatiGenerali']['DatiGeneraliDocumento']['TipoDocumento'] : '%';
$query = 'SELECT id, CONCAT (descrizione, IF((codice_tipo_documento_fe IS NULL), \'\', CONCAT( \' (\', codice_tipo_documento_fe, \')\' ) )) as descrizione FROM co_tipidocumento WHERE dir = \'uscita\' AND codice_tipo_documento_fe LIKE '.prepare($codice_tipo_documento_fe);
echo '
{[ "type": "select", "label": "'.tr('Tipo fattura').'", "name": "id_tipo", "required": 1, "values": "query='.$query.'" ]}';
// prc '.($pagamenti['CondizioniPagamento'] == 'TP01' ? '!' : '').'= 100 AND
$query = 'SELECT id, descrizione FROM co_pagamenti WHERE codice_modalita_pagamento_fe = '.prepare($metodi[0]['ModalitaPagamento']).' GROUP BY descrizione ORDER BY descrizione ASC';
echo '
<h4>'.tr('Pagamento').'</h4>
<p>'.tr('La fattura importata presenta _NUM_ rate di pagamento con le seguenti scadenze', [
'_NUM_' => count($metodi),
]).':</p>
<ul>';
// Scadenze di pagamento
foreach ($metodi as $metodo) {
echo '
<li>'.Translator::dateToLocale($metodo['DataScadenzaPagamento']).'</li>';
$query = 'SELECT id, CONCAT (descrizione, IF((codice_modalita_pagamento_fe IS NULL), \"\", CONCAT( \" (\", codice_modalita_pagamento_fe, \")\" ) )) as descrizione FROM co_pagamenti';
if (!empty($codice_modalita_pagamento)) {
$query .= ' WHERE codice_modalita_pagamento_fe = '.prepare($codice_modalita_pagamento);
}
echo '
</ul>';
$query .= ' GROUP BY descrizione ORDER BY descrizione ASC';
echo '
{[ "type": "select", "label": "'.tr('Pagamento').'", "name": "pagamento", "required": 1, "values": "query='.$query.'" ]}';

View File

@ -137,11 +137,10 @@ class FatturaElettronica
// Informazioni sull'anagrafica
$REA = $xml['IscrizioneREA'];
if (!empty($REA)) {
if (!empty($REA['Ufficio']) and !empty($REA['NumeroREA'])) {
$anagrafica->codicerea = $REA['Ufficio'].'-'.$REA['NumeroREA'];
}
if (!empty($REA['Ufficio']) and !empty($REA['NumeroREA'])) {
$anagrafica->codicerea = $REA['Ufficio'].'-'.$REA['NumeroREA'];
}
if (!empty($REA['CapitaleSociale'])) {
$anagrafica->capitale_sociale = $REA['CapitaleSociale'];
}
@ -295,17 +294,25 @@ class FatturaElettronica
*
* @return int
*/
public function saveFattura($id_pagamento, $id_sezionale)
public function saveFattura($id_pagamento, $id_sezionale, $id_tipo)
{
$anagrafica = static::createAnagrafica($this->getHeader()['CedentePrestatore']);
$dati_generali = $this->getBody()['DatiGenerali']['DatiGeneraliDocumento'];
$data = $dati_generali['Data'];
//Fix temporaneo per gestire TD02,TD03,TD06 non ancora previsti in OSM
/*if ($dati_generali['TipoDocumento']=='TD02' OR $dati_generali['TipoDocumento']=='TD03' OR $dati_generali['TipoDocumento']=='TD06'){
$id_tipo = 'TD01';
}
$id_tipo = database()->fetchOne('SELECT id FROM co_tipidocumento WHERE codice_tipo_documento_fe = '.prepare($dati_generali['TipoDocumento']))['id'];*/
$numero_esterno = $dati_generali['Numero'];
$progressivo_invio = $this->getHeader()['DatiTrasmissione']['ProgressivoInvio'];
$descrizione_tipo = empty($this->getBody()['DatiGenerali']['DatiTrasporto']) ? 'Fattura immediata di acquisto' : 'Fattura accompagnatoria di acquisto';
$tipo = TipoFattura::where('descrizione', $descrizione_tipo)->first();
//$descrizione_tipo = empty($this->getBody()['DatiGenerali']['DatiTrasporto']) ? 'Fattura immediata di acquisto' : 'Fattura accompagnatoria di acquisto';
$tipo = TipoFattura::where('id', $id_tipo)->first();
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_sezionale);
$this->fattura = $fattura;
@ -338,6 +345,14 @@ class FatturaElettronica
// TODO: salvare in fattura
}
$causali = $dati_generali['Causale'];
if (count($causali) > 0) {
foreach ($causali as $causale) {
$note .= $causale;
}
$fattura->note = $note;
}
// Bollo
$bollo = $dati_generali['DatiBollo'];
if (!empty($bollo)) {

View File

@ -114,7 +114,7 @@ class FileManager implements ManagerInterface
</button>';
} elseif (strtolower($extension) == 'xml') {
$result .= '
<a class="btn btn-xs btn-info" href="'.ROOTDIR.'/plugins/exportFE/view.php?id_record='.$r['id'].'" target="_blank">
<a class="btn btn-xs btn-info" href="'.ROOTDIR.'/plugins/exportFE/view.php?id_record='.$r['id_record'].'" target="_blank">
<i class="fa fa-eye"></i>
</a>';
} else {

View File

@ -218,9 +218,9 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
/**
* Invia l'email impostata.
*
* @return bool
*
* @throws Exception
*
* @return bool
*/
public function send()
{

View File

@ -2,6 +2,8 @@
namespace Util;
use UnexpectedValueException;
/**
* Classe dedicata all'interpretazione dei file XML.
*
@ -19,9 +21,16 @@ class XML
public static function read($string)
{
$content = static::stripP7MData($string);
$content = static::sanitizeXML($content);
libxml_use_internal_errors(true);
$xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($xml === false) {
$message = libxml_get_last_error()->message;
throw new UnexpectedValueException($message);
}
$result = json_decode(json_encode($xml), true);
return $result;

View File

@ -12,7 +12,7 @@ $settings = [
],
'header-height' => 35,
'footer-height' => 5,
'header-font-size' => 12,
'header-font-size' => 11,
];
return $settings;

View File

@ -54,7 +54,7 @@ echo '
</td>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('Banca di appoggio', [], ['upper' => true]).'</p>
<p>$appoggiobancario$</p>
<p><small>$appoggiobancario$</small></p>
</td>
</tr>
<tr>

View File

@ -117,7 +117,7 @@ $replaces = array_merge($replaces, [
'rootdir' => ROOTDIR,
'directory' => Prints::get($id_print)['full_directory'],
'footer' => !empty($footer) ? $footer : '',
'dicitura_fissa_fattura' => setting('Dicitura fissa fattura'),
'dicitura_fissa_fattura' => setting('Dicitura fissa fattura').((!empty(setting('OSMCloud Services API Token'))) ? tr(' Documento privo di valenza fiscale dell\'art 21 dpr 633/72.') : ''),
]);
unset($replace);

View File

@ -9,9 +9,11 @@ function findKey($array, $keySearch)
return true;
} elseif (is_array($item) && findKey($item, $keySearch)) {
echo $key;
return true;
}
}
return false;
}
@ -27,8 +29,8 @@ $righe = $dbo->fetchArray("SELECT *,
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"])) {
if (findKey($righe, 'immagine_articolo')) {
if (!empty($righe[(findKey($righe, 'immagine_articolo') - 1)]['immagine_articolo'])) {
$has_image = true;
}
}
@ -38,7 +40,7 @@ $autofill = [
'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
'columns' => (($has_image) ? 6 : 5), // Numero di colonne della tabella
];
$sconto = [];
@ -52,7 +54,7 @@ echo "
<tr>";
if ($has_image) {
echo " <th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true])."</th>";
echo " <th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true]).'</th>';
}
echo "
<th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th>
@ -206,7 +208,7 @@ if ($options['pricing']) {
// Totale imponibile
echo '
<tr>
<td colspan="'.(($has_image) ? 4:3).'" class="text-right border-top">
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
@ -219,7 +221,7 @@ if ($options['pricing']) {
if (!empty($sconto)) {
echo '
<tr>
<td colspan="'.(($has_image) ? 4:3).'" class="text-right border-top">
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td>
@ -231,7 +233,7 @@ if ($options['pricing']) {
// Imponibile scontato
echo '
<tr>
<td colspan="'.(($has_image) ? 4:3).'" class="text-right border-top">
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Imponibile scontato', [], ['upper' => true]).':</b>
</td>
@ -244,7 +246,7 @@ if ($options['pricing']) {
// IVA
echo '
<tr>
<td colspan="'.(($has_image) ? 4:3).'" class="text-right border-top">
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Totale IVA', [], ['upper' => true]).':</b>
</td>
@ -258,7 +260,7 @@ if ($options['pricing']) {
// TOTALE
echo '
<tr>
<td colspan="'.(($has_image) ? 4:3).'" class="text-right border-top">
<td colspan="'.(($has_image) ? 4 : 3).'" class="text-right border-top">
<b>'.tr('Quotazione totale', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">

View File

@ -29,8 +29,8 @@ foreach ($prefixes as $prefix) {
$replaces[$prefix.'cellulare'] = !empty($replaces[$prefix.'cellulare']) ? 'Cell: '.$replaces[$prefix.'cellulare'] : '';
$replaces[$prefix.'email'] = !empty($replaces[$prefix.'email']) ? 'Email: '.$replaces[$prefix.'email'] : '';
$replaces[$prefix.'codiceiban'] = !empty($replaces[$prefix.'codiceiban']) ? 'IBAN: '.$replaces[$prefix.'codiceiban'] : '';
$replaces[$prefix.'pec'] = !empty($replaces[$prefix.'pec']) ? 'PEC: '.$replaces[$prefix.'pec'] : '';
$replaces[$prefix.'pec'] = !empty($replaces[$prefix.'pec']) ? 'PEC: '.$replaces[$prefix.'pec'] : '';
foreach ($replaces as $key => $value) {
if (starts_with($key, $prefix)) {
$replaces[$key] = empty($value) ? $value : $value.'<br/>';

View File

@ -18,7 +18,7 @@ if (is_array($_SESSION['module_'.$id_module])) {
$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 "%'.$field_value.'%"');
array_push($search_filters, '`'.$field_name.'` LIKE "%'.$value.'%"');
}
}
}

View File

@ -35,7 +35,7 @@ ALTER TABLE `co_righe_documenti` ADD `data_inizio_periodo` date, ADD `data_fine_
ALTER TABLE `co_documenti` ADD `tipo_resa` VARCHAR(3);
-- Colonna nome impianto
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'MyImpianti'), 'Nome', 'nome', 2, 1, 0, 0, NULL, NULL, 0, 0, 0);
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'MyImpianti'), 'Nome', 'nome', 2, 1, 0, 0, NULL, NULL, 1, 0, 1);
-- Colonna causale predefinita
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Causali'), 'Predefinita', 'IF(predefined, '''', ''No'')', 2, 1, 0, 0, NULL, NULL, 0, 0, 0);

View File

@ -47,5 +47,34 @@ ALTER TABLE `an_anagrafiche` CHANGE `nome_cognome` `nome` VARCHAR(255) NOT NULL;
ALTER TABLE `an_anagrafiche` ADD `cognome` VARCHAR(255) NOT NULL AFTER `nome`;
-- Colonna Rif. fattura (Prima nota)
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota'), 'Rif. fattura', 'IF((iddocumento != ''),(SELECT numero_esterno FROM co_documenti WHERE id = iddocumento), ''-'')', 2, 1, 0, 0, NULL, NULL, 1, 0, 0);
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default` ) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota'), 'Rif. fattura', '(SELECT numero_esterno FROM co_documenti WHERE id = iddocumento)', 2, 1, 0, 0, NULL, NULL, 1, 0, 0);
-- Aumento decimali percentuali delle rate pagamenti a 2
ALTER TABLE `co_pagamenti` CHANGE `prc` `prc` DECIMAL(5,2) NOT NULL;
-- Ordino gestione documentale per data, nome
UPDATE `zz_modules` SET `options` = '{ "main_query": [ { "type": "table", "fields": "Categoria, Nome, Data", "query": "SELECT id,(SELECT descrizione FROM zz_documenti_categorie WHERE zz_documenti_categorie.id = idcategoria) AS Categoria, zz_documenti.nome AS Nome, DATE_FORMAT( zz_documenti.`data`, ''%d/%m/%Y'' ) AS `Data` FROM zz_documenti WHERE `data` >= ''|period_start|'' AND `data` <= ''|period_end|'' HAVING 1=1 ORDER BY data, nome"} ]}' WHERE `zz_modules`.`name` = 'Gestione documentale';
-- Ordino Ddt anche per created_at (nel caso di stessa data e che il cast del numero esterno non sia efficace)
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `dt_ddt` INNER JOIN `dt_tipiddt` ON `dt_ddt`.`idtipoddt` = `dt_tipiddt`.`id` WHERE 1=1 AND `dir` = ''entrata'' AND `data` >= ''|period_start|'' AND `data` <= ''|period_end|'' HAVING 2=2 ORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC,`dt_ddt`.created_at DESC' WHERE `zz_modules`.`name` = 'Ddt di vendita';
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `dt_ddt` INNER JOIN `dt_tipiddt` ON `dt_ddt`.`idtipoddt` = `dt_tipiddt`.`id` WHERE 1=1 AND `dir` = ''uscita'' AND `data` >= ''|period_start|'' AND `data` <= ''|period_end|'' HAVING 2=2 ORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC, `dt_ddt`.created_at DESC' WHERE `zz_modules`.`id` = 'Ddt di acquisto';
-- Aggiunti pagamenti mancanti Assegno circolare,Contanti presso Tesoreria, Vaglia cambiario, Bollettino bancario, RID, RID utenze, RID veloce, MAV, Quietanza erario, Giroconto su conti di contabilità speciale, Domiciliazione bancaria, Domiciliazione postale, Bollettino di c/c postale, SEPA Direct Debit, SEPA Direct Debit CORE, SEPA Direct Debit B2B, Trattenuta su somme già riscosse
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Assegno circolare', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP03');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Contanti presso Tesoreria', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP04');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Vaglia cambiario', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP06');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Bollettino bancario', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP07');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'RID', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP09');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'RID utenze', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP10');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'RID veloce', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP11');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'MAV', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP13');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Quietanza erario', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP14');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Giroconto su conti di contabilità speciale', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP15');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Domiciliazione bancaria', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP16');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Domiciliazione postale', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP17');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Bollettino di c/c postale', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP18');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'SEPA Direct Debit', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP19');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'SEPA Direct Debit CORE', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP20');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'SEPA Direct Debit B2B', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP21');
INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `created_at`, `updated_at`, `idconto_vendite`, `idconto_acquisti`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Trattenuta su somme già riscosse', '0', '1', '100', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, 'MP22');