This commit is contained in:
MatteoPistorello 2023-12-15 13:18:20 +01:00
commit f16395151a
72 changed files with 3795 additions and 2865 deletions

View File

@ -4,7 +4,8 @@ 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.52 ](#2452)
- [2.4.53 (2024-00-00)](#2453-2024-00-00)
- [2.4.52 (2023-12-08)](#2452-2023-12-08)
- [2.4.51 (2023-10-30)](#2451-2023-10-30)
- [2.4.50 (2023-10-06)](#2450-2023-10-06)
- [2.4.49 (2023-09-22)](#2449-2023-09-25)
@ -63,16 +64,66 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- [2.2 (2016-11-10)](#22-2016-11-10)
- [2.1 (2015-04-02)](#21-2015-04-02)
## 2.4.52
## 2.4.53 (2024-00-00)
### Aggiunto (Added)
- Aggiunta la gestione delle sedi definite come automezzi con pratico modulo per il carico/scarico degli articoli nell'automezzo, l'assegnazione di tecnici/autisti con date di validità e stampe di carico filtrabili
- Aggiunta sezione **dettagli aggiuntivi** nel plugin sedi per compilare i dettagli dell'automezzo (nome, descrizione, targa)
### Modificato (Changed)
- Aggiunta una limitazione sulle quantità scaricabili nei documenti di vendita in modo da non poter vendere più articoli di quelli presenti fisicamente nel magazzino selezionato. Questa limitazione è legata all'impostazione **Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita**
### Fixed
- Risolto il problema di visualizzazione dei PDF negli allegati
- Risolto un problema di movimentazione magazzino: gli articoli nelle attività venivano sempre movimentati da sede legale anche se specificata diversa sede di partenza nel documento (solo da popup di modifica articolo)
- Corretto filtro articoli negli automezzi prendendo correttamente la giacenza della sede centrale
## 2.4.52 (2023-12-08)
### Aggiunto (Added)
- Aggiunta la gestione delle sedi definite come automezzi con pratico modulo per il carico/scarico degli articoli nell'automezzo, l'assegnazione di tecnici/autisti con date di validità e stampe di carico filtrabili
- Aggiunta una limitazione sulle quantità scaricabili nei documenti di vendita in modo da non poter vendere più articoli di quelli presenti fisicamente nel magazzino selezionato. Questa limitazione è legata all'impostazione **Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita**
- Aggiunti costi e margine negli ordini cliente
- Aggiunta la possibilità di importare tramite CSV Impianti e Attività
- Aggiunte le sottocategorie in Impianti
- Aggiunti i DDT alla lista dei documenti collegati nel modulo Preventivi
- Aggiunto il calcolo della provvigione in pianificazione fatturazione
- Aggiunta una seconda ricerca delle coordinate anagrafica da azione di gruppo con Google Maps
- Aggiunta la gestione dei seriali da riferimento documento in fase di importazione di una fattura elettronica
- Aggiunta la gestione dei seriali nei contratti
- Aggiunta la stampa preventivo (solo totale imponibile)
- Aggiunta la selezione delle sottocategorie in fase di aggiunta impianto
- Aggiunta la creazione al volo dei referenti in attività
- Aggiunto colore in base allo stato in modifica stato da azioni di gruppo in Preventivi, Contratti e Ordini
- Aggiunta la gestione del rappresentante fiscale negli XML
- Aggiunte le impostazioni per definire il numero di decimali per gli importi, per le quantità e per i totali nelle stampe
- Aggiunta la variabile Nome preventivo nei Preventivi
- Aggiunto il tipo di pagamento e banca di accredito e addebito nelle scadenze
### Modificato (Changed)
- Migliorata l'importazione degli articoli tramite CSV, le anagrafiche relative a clienti e fornitori vengono ora create se non presenti a gestionale
- Migliorato il controllo sulle chiavi esterne nel controllo del database
- Ripristinata la funzionalità di duplicazione degli ordini
- La modifica della data competenza di una fattura aggiorna ora la data del movimento relativo
- Migliorato il caricamento della lista allegati
- L'aggiunta di note aggiuntive e la modifica della data competenza è ora sempre possibile nelle fatture
- Spostati tutti gli avvisi in basso a destra
- Modificate le funzioni nei file modutil.php per permettere l'aggiunta di file custom
### Fixed
- Corretto il problema di visualizzazione dei PDF negli allegati
- Corretto un problema di movimentazione magazzino: gli articoli nelle attività venivano sempre movimentati da sede legale anche se specificata diversa sede di partenza nel documento (solo da popup di modifica articolo)
- Corretta la selezione degli impianti in pianificazione ciclica delle attività
- Corretta la rimozione del referente nelle sedi
- Corretta la visualizzazione del modulo fatture di vendita per schermi a bassa risoluzione
- Corretti i calcoli della ritenuta e rivalsa in fattura
- Corretta l'importazione delle anagrafiche da CSV
- Corretta l'importazione di fatture elettroniche con aliquote IVA multiple
- Corretta la stampa del consuntivo ordine, della scadenza e del consuntivo
- Corretta la validazione di password contenenti il carattere '&'
- Corretto il calcolo del totale nei consuntivi
- Corretta l'applicazione della marca da bollo in fattura
- Corretta la visualizzazione della quantità articoli in fase di selezione
- Corretta la visualizzazione delle righe nei documenti in presenza di articoli con quantità 0
- Corretta la movimentazione degli articoli
- Corretta la creazione del conto del piano dei conti per le anagrafiche
- Corretto il funzionamento dei campi personalizzati
- Corretta la vista Fatture di vendita per l'icona email
- Corretta la crezione di attività da documenti, viene ora mantenuto il collegamento
## 2.4.51 (2023-10-30)
### Aggiunto (Added)

View File

@ -496,6 +496,8 @@ if ($structure->permission == 'rw') {
foreach ($customs as $custom) {
if (post($custom['name']) !== null) {
$values[$custom['id']] = post($custom['name']);
} else {
$values[$custom['id']] = '';
}
}
@ -520,6 +522,7 @@ if ($structure->permission == 'rw') {
$customs_present = array_column($customs_present, 'id_field');
foreach ($values as $key => $value) {
$value = (!is_array($value) ? $value : json_encode($value));
if (in_array($key, $customs_present)) {
$dbo->update('zz_field_record', [
'value' => $value,

View File

@ -792,6 +792,18 @@ input.small-width {
background-clip: padding-box;
}
.ui-menu .ui-menu-item-wrapper {
padding: 3px 1em 3px .4em;
cursor: pointer;
}
.ui-menu .ui-menu-item-wrapper:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: 400;
color: #fff;
}
.parsley-errors-list {
color: red;
}

View File

@ -139,7 +139,7 @@
],
"config": {
"sort-packages": true,
"optimize-autoloader": false,
"optimize-autoloader": true,
"apcu-autoloader": true,
"minimum-stability": "dev",
"prefer-stable": true,

File diff suppressed because it is too large Load Diff

View File

@ -9796,7 +9796,7 @@ msgstr ""
#: plugins/receiptFE/edit.php:25
msgid ""
"Le ricevute delle Fatture Elettroniche permettono di individuare se una "
"determinata fattura tramessa è stata accettata dal Sistema Di Interscambio"
"determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio"
msgstr ""
#: plugins/receiptFE/edit.php:29 plugins/receiptFE/edit.php:87

View File

@ -10853,7 +10853,7 @@ msgstr "Within"
#: plugins/receiptFE/edit.php:27
msgid ""
"Le ricevute delle Fatture Elettroniche permettono di individuare se una "
"determinata fattura tramessa è stata accettata dal Sistema Di Interscambio"
"determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio"
msgstr ""
"The receipts of the electronic invoice allow to detect if a determinate "
"released invoice is been accepted from Interchange system and the associated "

View File

@ -17,25 +17,43 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
/*
* Controlla se il database presenta alcune sezioni personalizzate.
*
* @return array
*/
function customStructure()
{
$results = [];
$dirs = [
'modules',
'templates',
'plugins',
];
if (!function_exists('customStructure')) {
function customStructure()
{
$results = [];
// Controlli di personalizzazione fisica
foreach ($dirs as $dir) {
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
$dirs = [
'modules',
'templates',
'plugins',
];
// Controlli di personalizzazione fisica
foreach ($dirs as $dir) {
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
foreach ($files as $file) {
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
$results[] = $result;
}
}
}
// Gestione cartella include
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
@ -47,90 +65,82 @@ function customStructure()
$results[] = $result;
}
}
return $results;
}
// Gestione cartella include
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
foreach ($files as $file) {
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
$results[] = $result;
}
}
return $results;
}
/**
/*
* Controlla se il database presenta alcune sezioni personalizzate.
*
* @return array
*/
function customTables()
{
$tables = include base_dir().'/update/tables.php';
if (!function_exists('customTables')) {
function customTables()
{
$tables = include base_dir().'/update/tables.php';
$names = [];
foreach ($tables as $table) {
$names[] = prepare($table);
$names = [];
foreach ($tables as $table) {
$names[] = prepare($table);
}
$database = database();
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
return array_column($results, 'TABLE_NAME');
}
$database = database();
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
return array_column($results, 'TABLE_NAME');
}
/**
/*
* Controlla se il database presenta alcune sezioni personalizzate.
*
* @return array
*/
function customDatabase()
{
$database = database();
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
$results = array_merge($modules, $plugins);
if (!function_exists('customDatabase')) {
function customDatabase()
{
$database = database();
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
return $results;
$results = array_merge($modules, $plugins);
return $results;
}
}
function customComponents()
{
$database_check = customDatabase();
$structure_check = customStructure();
if (!function_exists('customComponents')) {
function customComponents()
{
$database_check = customDatabase();
$structure_check = customStructure();
$list = [];
foreach ($database_check as $element) {
$pos = array_search($element['directory'], $structure_check);
$list = [];
foreach ($database_check as $element) {
$pos = array_search($element['directory'], $structure_check);
$list[] = [
'path' => $element['directory'],
'database' => true,
'directory' => $pos !== false,
];
$list[] = [
'path' => $element['directory'],
'database' => true,
'directory' => $pos !== false,
];
if ($pos !== false) {
unset($structure_check[$pos]);
if ($pos !== false) {
unset($structure_check[$pos]);
}
}
}
foreach ($structure_check as $element) {
$list[] = [
'path' => $element,
'database' => false,
'directory' => true,
];
}
foreach ($structure_check as $element) {
$list[] = [
'path' => $element,
'database' => false,
'directory' => true,
];
}
return $list;
return $list;
}
}

View File

@ -71,7 +71,7 @@ switch (post('op')) {
case 'ricerca-coordinate-google':
$curl = new CurlHttpAdapter();
$geocoder = new GoogleMaps($curl, null, null, true, $google);
$geocoder = new GoogleMaps($curl, 'IT-it', null, true, $google);
foreach ($id_records as $id) {
$anagrafica = Anagrafica::find($id);

View File

@ -27,8 +27,9 @@ $is_fornitore = in_array($id_fornitore, $tipi_anagrafica);
$is_cliente = in_array($id_cliente, $tipi_anagrafica);
$is_tecnico = in_array($id_tecnico, $tipi_anagrafica);
$is_agente = in_array($id_agente, $tipi_anagrafica);
$is_azienda = in_array($id_azienda, $tipi_anagrafica);
if (!$is_cliente && !$is_fornitore && $is_tecnico) {
if (!$is_cliente && !$is_fornitore && !$is_azienda && $is_tecnico) {
$ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'");
foreach ($ignore as $plugin) {

View File

@ -65,6 +65,9 @@ echo '
<script>$(document).ready(init)</script>
<script>
var indirizzi = [];
var coords = [];
$("#modals > div").on("shown.bs.modal", function () {
if (input("lat").get() && input("lng").get()) {
caricaMappa();
@ -77,10 +80,26 @@ function initGeocomplete() {
type : "GET",
dataType: "JSON",
success: function(data){
input("lat").set(data[0].lat);
input("lng").set(data[0].lon);
input("gaddress").set(data[0].display_name);
caricaMappa();
// Estrazione lista luoghi
for (var i = 0; i < data.length; i++) {
indirizzi.push(data[i].display_name);
coords[data[i].display_name] = [data[i].lat, data[i].lon];
}
// Autocompletamento indirizzi con risposta da Nominatim
$("#gaddress").autocomplete({
source: indirizzi,
minLength: 0,
select: function(event, ui) {
input("lat").set(coords[ui.item.value][0]);
input("lng").set(coords[ui.item.value][1]);
input("gaddress").set(ui.item.value);
caricaMappa();
}
}).autocomplete("search", "");
// Azzeramento indirizzi raccolti
indirizzi = [];
}
});
}
@ -147,4 +166,12 @@ function caricaMappa() {
$("#modals > div button.close").on("click", function() {
location.reload();
});
// Avvio ricerca indirizzo premendo Invio
$("#gaddress").on("keypress", function(e){
if(e.which == 13){
e.preventDefault();
initGeocomplete();
}
});
</script>';

View File

@ -19,30 +19,32 @@
include_once __DIR__.'/../../core.php';
/**
/*
* Funzione per aggiornare le sedi nei movimenti di magazzino.
*/
function aggiorna_sedi_movimenti($module, $id)
{
$dbo = database();
if (!function_exists('aggiorna_sedi_movimenti')) {
function aggiorna_sedi_movimenti($module, $id)
{
$dbo = database();
if ($module == 'ddt') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
if ($module == 'ddt') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
} elseif ($module == 'documenti') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
} elseif ($module == 'documenti') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
} elseif ($module == 'interventi') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
} elseif ($module == 'interventi') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
$idsede = $rs[0]['idsede_partenza'];
$idsede = $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
}
}
}

View File

@ -24,7 +24,7 @@ echo '
// Seleziona articolo
echo '
<div class="col-md-8">
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli" ]}
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli", "select-options": '.json_encode(['idsede_partenza' => 0]).' ]}
</div>';
// Quantità

View File

@ -77,6 +77,7 @@ echo '
var bank_code = input("bank_code");
var id_nazione = input("id_nazione");
var bic = input("bic");
var id_module = <?php echo $id_module; ?>;
var components = [branch_code, bank_code, id_nazione];
@ -112,7 +113,7 @@ echo '
$.ajax({
url: globals.rootdir + '/actions.php',
data: {
id_module: globals.id_module,
id_module: id_module,
op: "decompose",
iban: iban.get(),
},

View File

@ -17,185 +17,191 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
function renderChecklist($check, $level = 1, $parent = 0)
{
global $structure;
if (!function_exists('renderChecklist')) {
function renderChecklist($check, $level = 1, $parent = 0)
{
global $structure;
$user = auth()->getUser();
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
$user = auth()->getUser();
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
$margin = ($level * 20);
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
if ($check->is_titolo) {
$result .= '
<td style="width:40px;"></td>
<td colspan="3" style="border-top:0px;">
<span class="text unblockable"><big>'.$check->content.'</big></span>
</td>';
} else {
$result .= '
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
'_NAME_' => $check->checkUser->username,
'_DATE_' => timestampFormat($check->checked_at),
]) : '').'
</span>
</td>';
$result .= '
<td style="width:500px;border-top:0px;">
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
</td>';
$result .= '
<td style="width:150px;border-top:0px;">
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
if ($check->is_titolo) {
$result .= '
<td style="width:40px;"></td>
<td colspan="3" style="border-top:0px;">
<span class="text unblockable"><big>'.$check->content.'</big></span>
</td>';
} else {
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
$result .= '
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
'_NAME_' => $check->checkUser->username,
'_DATE_' => timestampFormat($check->checked_at),
]) : '').'
</span>
</td>';
$result .= '
<td style="width:500px;border-top:0px;">
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
</td>';
$result .= '
<td style="width:150px;border-top:0px;">
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
} else {
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
}
$result .= '
</td>';
}
$result .= '
</td>';
}
<td style="width:10px;text-align:center;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
</div>
</td>';
$result .= '
<td style="width:10px;text-align:center;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklist($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
</tr>';
return $result;
}
}
if (!function_exists('renderChecklistInserimento')) {
function renderChecklistInserimento($check, $level = 1, $parent = 0)
{
global $record;
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
$result .= '
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
$result .= '
<span class="text">'.$check->content.'</span>';
$result .= '
</td>';
$result .= '
<td style="width:40px;text-align:right;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
<td style="width:40px;text-align:center;border-top:0px;">
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
<i class="fa fa-sort"></i>
</button>
</td>
</tr>';
return $result;
}
}
if (!function_exists('renderChecklistHtml')) {
function renderChecklistHtml($check, $level = 0)
{
$user = auth()->getUser();
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
$width = 10 + 20 * $level;
$result = '
<tr>
<td class="text-center" style="width:30px;">
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
</td>
<td style="padding-left:'.$width.'px;">
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
</td>
</tr>';
$children = $check->children;
foreach ($children as $child) {
$result .= renderChecklist($child, $level + 1, $check->id);
$result .= renderChecklistHtml($child, $level + 1);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
return $result;
}
$result .= '
</table>
</td>
</tr>';
return $result;
}
function renderChecklistInserimento($check, $level = 1, $parent = 0)
{
global $record;
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
$result .= '
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
$result .= '
<span class="text">'.$check->content.'</span>';
$result .= '
</td>';
$result .= '
<td style="width:40px;text-align:right;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
<td style="width:40px;text-align:center;border-top:0px;">
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
<i class="fa fa-sort"></i>
</button>
</td>
</tr>';
return $result;
}
function renderChecklistHtml($check, $level = 0)
{
$user = auth()->getUser();
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
$width = 10 + 20 * $level;
$result = '
<tr>
<td class="text-center" style="width:30px;">
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
</td>
<td style="padding-left:'.$width.'px;">
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
</td>
</tr>';
$children = $check->children;
foreach ($children as $child) {
$result .= renderChecklistHtml($child, $level + 1);
}
return $result;
}

View File

@ -7,22 +7,24 @@
*
* @return array|array[]
*/
function cartesian($input)
{
$result = [[]];
if (!function_exists('cartesian')) {
function cartesian($input)
{
$result = [[]];
foreach ($input as $key => $values) {
$append = [];
foreach ($input as $key => $values) {
$append = [];
foreach ($result as $product) {
foreach ($values as $item) {
$product[$key] = $item;
$append[] = $product;
foreach ($result as $product) {
foreach ($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
$result = $append;
return $result;
}
return $result;
}

View File

@ -22,22 +22,26 @@ include_once __DIR__.'/../../core.php';
use Modules\Contratti\Contratto;
use Modules\Interventi\Intervento;
/**
/*
* Calcolo imponibile contratto (totale_righe - sconto).
*/
function get_imponibile_contratto($idcontratto)
{
$contratto = Contratto::find($idcontratto);
if (!function_exists('get_imponibile_contratto')) {
function get_imponibile_contratto($idcontratto)
{
$contratto = Contratto::find($idcontratto);
return $contratto->totale_imponibile;
return $contratto->totale_imponibile;
}
}
function get_totale_interventi_contratto($idcontratto)
{
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
$array_interventi = $interventi->toArray();
if (!function_exists('get_totale_interventi_contratto')) {
function get_totale_interventi_contratto($idcontratto)
{
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
return $totale;
}
}

View File

@ -145,8 +145,8 @@ foreach ($righe as $riga) {
$evasione_bar['or_righe_ordini'] = 'success';
foreach ($evasione_bar as $table => $color) {
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
if ($perc_ev > 0) {
if ($righe_ev->count() > 0) {
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
echo '
<div class="progress-bar progress-bar-'.$color.'" style="width:'.$perc_ev.'%"></div>';
}

View File

@ -22,92 +22,105 @@ include_once __DIR__.'/../../core.php';
use Modules\DDT\DDT;
use Util\Generator;
/**
/*
* Funzione per generare un nuovo numero per il ddt.
*
* @deprecated 2.4.5
*/
function get_new_numeroddt($data)
{
global $dir;
if (!function_exists('get_new_numeroddt')) {
function get_new_numeroddt($data)
{
global $dir;
return DDT::getNextNumero($data, $dir);
return DDT::getNextNumero($data, $dir);
}
}
/**
/*
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
*
* @deprecated 2.4.5
*/
function get_new_numerosecondarioddt($data)
{
global $dir;
global $id_segment;
if (!function_exists('get_new_numerosecondarioddt')) {
function get_new_numerosecondarioddt($data)
{
global $dir;
global $id_segment;
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
/*
* Calcolo imponibile ddt (totale_righe - sconto).
*
* @deprecated 2.4.5
*/
function get_imponibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_imponibile_ddt')) {
function get_imponibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->imponibile;
return $ddt->imponibile;
}
}
/**
/*
* Calcolo totale ddt (imponibile + iva).
*
* @deprecated 2.4.5
*/
function get_totale_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_totale_ddt')) {
function get_totale_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->totale;
return $ddt->totale;
}
}
/**
/*
* Calcolo netto a pagare ddt (totale - ritenute - bolli).
*
* @deprecated 2.4.5
*/
function get_netto_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_netto_ddt')) {
function get_netto_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->netto;
return $ddt->netto;
}
}
/**
/*
* Calcolo iva detraibile ddt.
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_ivadetraibile_ddt')) {
function get_ivadetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->iva_detraibile;
return $ddt->iva_detraibile;
}
}
/**
/*
* Calcolo iva indetraibile ddt.
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_ivaindetraibile_ddt')) {
function get_ivaindetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->iva_indetraibile;
return $ddt->iva_indetraibile;
}
}
/**
/*
* Ricalcola i costi aggiuntivi in ddt (rivalsa inps, ritenuta d'acconto, marca da bollo)
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
* $idddt int ID del ddt
@ -115,148 +128,154 @@ function get_ivaindetraibile_ddt($id_ddt)
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
*/
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
if (!function_exists('ricalcola_costiagg_ddt')) {
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
$dbo = database();
$dbo = database();
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
$rs = $dbo->fetchArray($query);
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ddt($idddt);
$totale_ddt = get_totale_ddt($idddt);
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ddt($idddt);
$totale_ddt = get_totale_ddt($idddt);
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Aggiorno la rivalsa inps
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
$totale_ddt = get_totale_ddt($idddt);
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ddt - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
} else {
$marca_da_bollo = 0.00;
}
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
} else {
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
// Aggiorno la rivalsa inps
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
$totale_ddt = get_totale_ddt($idddt);
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ddt - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
}
} else {
$marca_da_bollo = 0.00;
}
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
} else {
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
}
}
}
/**
/*
* Restituisce lo stato del ddt in base alle righe.
*/
function get_stato_ddt($idddt)
{
$dbo = database();
if (!function_exists('get_stato_ddt')) {
function get_stato_ddt($idddt)
{
$dbo = database();
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
if ($rs[0]['qta'] == 0) {
return 'Bozza';
} else {
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente fatturato';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Fatturato';
}
if ($rs[0]['qta'] == 0) {
return 'Bozza';
} else {
return 'Evaso';
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente fatturato';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Fatturato';
}
} else {
return 'Evaso';
}
}
}
}
function verifica_numero_ddt(DDT $ddt)
{
global $dbo;
if (!function_exists('verifica_numero_ddt')) {
function verifica_numero_ddt(DDT $ddt)
{
global $dbo;
$data = $ddt->data;
$tipo = $ddt->tipo;
$dir = $ddt->direzione;
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
$data = $ddt->data;
$tipo = $ddt->tipo;
$dir = $ddt->direzione;
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
if (empty($numero)) {
return null;
}
$documenti = DDT::where('idtipoddt', $tipo->id)
->where('data', $data)
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato numero secondario ddt');
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'idtipoddt = '.prepare($tipo->id),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $ddt->numero_esterno);
if (empty($numero)) {
return null;
}
$documenti = DDT::where('idtipoddt', $tipo->id)
->where('data', $data)
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato numero secondario ddt');
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'idtipoddt = '.prepare($tipo->id),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $ddt->numero_esterno);
return null;
}

View File

@ -297,6 +297,7 @@ switch ($op) {
}
$totale_documento = abs($totale_documento);
$totale_documento = $dati_generali['ImportoTotaleDocumento'] ? $dati_generali['ImportoTotaleDocumento'] : $totale_documento;
} catch (Exception $e) {
}

View File

@ -20,105 +20,122 @@
use Modules\Fatture\Fattura;
use Util\Generator;
/**
/*
* Funzione per generare un nuovo numero per la fattura.
*
* @deprecated 2.4.5
*/
function get_new_numerofattura($data)
{
global $dir;
global $id_segment;
if (!function_exists('get_new_numerofattura')) {
function get_new_numerofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumero($data, $dir, $id_segment);
return Fattura::getNextNumero($data, $dir, $id_segment);
}
}
/**
/*
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
*
* @deprecated 2.4.5
*/
function get_new_numerosecondariofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
if (!function_exists('get_new_numerosecondariofattura')) {
function get_new_numerosecondariofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
/*
* Calcolo imponibile fattura (totale_righe - sconto).
*
* @deprecated 2.4.5
*/
function get_imponibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->imponibile;
if (!function_exists('get_imponibile_fattura')) {
function get_imponibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->imponibile;
}
}
/**
/*
* Calcolo totale fattura (imponibile + iva).
*
* @deprecated 2.4.5
*/
function get_totale_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_totale_fattura')) {
function get_totale_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->totale;
return $fattura->totale;
}
}
/**
/*
* Calcolo netto a pagare fattura (totale - ritenute - bolli).
*
* @deprecated 2.4.5
*/
function get_netto_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_netto_fattura')) {
function get_netto_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->netto;
return $fattura->netto;
}
}
/**
/*
* Calcolo iva detraibile fattura.
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_ivadetraibile_fattura')) {
function get_ivadetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_detraibile;
return $fattura->iva_detraibile;
}
}
/**
/*
* Calcolo iva indetraibile fattura.
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_indetraibile;
if (!function_exists('get_ivaindetraibile_fattura')) {
function get_ivaindetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_indetraibile;
}
}
/**
/*
* Elimina una scadenza in base al codice documento.
*
* @deprecated 2.4.17
*/
function elimina_scadenze($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('elimina_scadenze')) {
function elimina_scadenze($iddocumento)
{
$fattura = Fattura::find($iddocumento);
$fattura->rimuoviScadenze();
$fattura->rimuoviScadenze();
}
}
/**
/*
* Funzione per ricalcolare lo scadenzario di una determinata fattura
* $iddocumento string E' l'id del documento di cui ricalcolare lo scadenzario
* $pagamento string Nome del tipo di pagamento. Se è vuoto lo leggo da co_pagamenti_documenti, perché significa che devo solo aggiornare gli importi.
@ -126,14 +143,16 @@ function elimina_scadenze($iddocumento)
*
* @deprecated 2.4.17
*/
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('aggiungi_scadenza')) {
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
{
$fattura = Fattura::find($iddocumento);
$fattura->registraScadenze($pagato);
$fattura->registraScadenze($pagato);
}
}
/**
/*
* Elimina i movimenti collegati ad una fattura.
* Se il flag $prima_nota è impostato a 1 elimina solo i movimenti di Prima Nota, altrimenti rimuove quelli automatici.
*
@ -142,17 +161,20 @@ function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
*
* @deprecated 2.4.17
*/
function elimina_movimenti($id_documento, $prima_nota = 0)
{
$dbo = database();
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
if (!function_exists('elimina_movimenti')) {
function elimina_movimenti($id_documento, $prima_nota = 0)
{
$dbo = database();
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
$dbo->query($query2);
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
$dbo->query($query2);
}
}
/**
/*
* Funzione per aggiungere la fattura in prima nota
* $iddocumento string E' l'id del documento da collegare alla prima nota
* $dir string Direzione dell'importo (entrata, uscita)
@ -160,277 +182,285 @@ function elimina_movimenti($id_documento, $prima_nota = 0)
*
* @deprecated 2.4.17
*/
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
{
$dbo = database();
if (!function_exists('aggiungi_movimento')) {
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
{
$dbo = database();
$fattura = Modules\Fatture\Fattura::find($iddocumento);
$is_nota = $fattura->isNota();
$fattura = Modules\Fatture\Fattura::find($iddocumento);
$is_nota = $fattura->isNota();
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment'];
$netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
$imponibile_fattura = get_imponibile_fattura($iddocumento);
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0;
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
for ($r = 0; $r < sizeof($rsr); ++$r) {
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
}
// Lettura iva indetraibile fattura
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
// Lettura iva delle righe in fattura
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if ($dir == 'uscita') {
$segno_mov1_cliente = -1;
$segno_mov2_ricavivendite = 1;
$segno_mov3_iva = 1;
$segno_mov4_inps = 1;
$segno_mov5_ritenutaacconto = -1;
// Lettura conto fornitore
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_fornitore'];
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
$netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
$imponibile_fattura = get_imponibile_fattura($iddocumento);
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0;
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
for ($r = 0; $r < sizeof($rsr); ++$r) {
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
}
} else {
$segno_mov1_cliente = 1;
$segno_mov2_ricavivendite = -1;
$segno_mov3_iva = -1;
$segno_mov4_inps = -1;
$segno_mov5_ritenutaacconto = 1;
// Lettura conto cliente
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
// Lettura iva indetraibile fattura
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_cliente'];
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo clienti');
// Lettura iva delle righe in fattura
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if ($dir == 'uscita') {
$segno_mov1_cliente = -1;
$segno_mov2_ricavivendite = 1;
$segno_mov3_iva = 1;
$segno_mov4_inps = 1;
$segno_mov5_ritenutaacconto = -1;
// Lettura conto fornitore
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_fornitore'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
}
} else {
$segno_mov1_cliente = 1;
$segno_mov2_ricavivendite = -1;
$segno_mov3_iva = -1;
$segno_mov4_inps = -1;
$segno_mov5_ritenutaacconto = 1;
// Lettura conto cliente
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_cliente'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo clienti');
}
}
}
// Lettura info fattura
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
$data = $rs[0]['data_competenza'];
$idanagrafica = $rs[0]['idanagrafica'];
$ragione_sociale = $rs[0]['ragione_sociale'];
$stato = $rs[0]['stato'];
// Lettura info fattura
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
$data = $rs[0]['data_competenza'];
$idanagrafica = $rs[0]['idanagrafica'];
$ragione_sociale = $rs[0]['ragione_sociale'];
$stato = $rs[0]['stato'];
$idmastrino = get_new_idmastrino();
$idmastrino = get_new_idmastrino();
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if (!empty($rs[0]['numero_esterno'])) {
$numero = $rs[0]['numero_esterno'];
} else {
$numero = $rs[0]['numero'];
}
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if (!empty($rs[0]['numero_esterno'])) {
$numero = $rs[0]['numero_esterno'];
} else {
$numero = $rs[0]['numero'];
}
// Abbreviazioni contabili dei movimenti
$tipodoc = '';
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
$tipodoc = 'Nota di credito';
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
$tipodoc = 'Nota di debito';
} else {
$tipodoc = 'Fattura';
}
// Abbreviazioni contabili dei movimenti
$tipodoc = '';
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
$tipodoc = 'Nota di credito';
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
$tipodoc = 'Nota di debito';
} else {
$tipodoc = 'Fattura';
}
$descrizione = $tipodoc.' num. '.$numero;
$descrizione = $tipodoc.' num. '.$numero;
/*
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
1) dare imponibile+iva al conto cliente
2) avere imponibile sul conto dei ricavi
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
/*
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
1) dare imponibile+iva al conto cliente
2) avere imponibile sul conto dei ricavi
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
aggiuntivo:
4) eventuale rivalsa inps
5) eventuale ritenuta d'acconto
*/
// 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura;
aggiuntivo:
4) eventuale rivalsa inps
5) eventuale ritenuta d'acconto
*/
// 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura;
if ($split_payment) {
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
}
if ($split_payment) {
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
}
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
foreach ($righe as $riga) {
// Retrocompatibilità
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ($iva_fattura != 0 && !$split_payment) {
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// Lettura id conto iva indetraibile
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$idconto_iva2 = setting('Conto per Iva indetraibile');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ($totale_rivalsainps != 0) {
$idconto_inps = setting('Conto per Erario c/INPS');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutaacconto != 0) {
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutacontributi != 0) {
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
foreach ($righe as $riga) {
// Retrocompatibilità
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$dbo->query($query2);
}
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ($iva_fattura != 0 && !$split_payment) {
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// Lettura id conto iva indetraibile
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$idconto_iva2 = setting('Conto per Iva indetraibile');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ($totale_rivalsainps != 0) {
$idconto_inps = setting('Conto per Erario c/INPS');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutaacconto != 0) {
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutacontributi != 0) {
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
}
}
/**
/*
* Funzione per generare un nuovo codice per il mastrino.
*
* @deprecated 2.4.17
*/
function get_new_idmastrino($table = 'co_movimenti')
{
$dbo = database();
if (!function_exists('get_new_idmastrino')) {
function get_new_idmastrino($table = 'co_movimenti')
{
$dbo = database();
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
$rs = $dbo->fetchArray($query);
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
$rs = $dbo->fetchArray($query);
return intval($rs[0]['maxidmastrino']) + 1;
return intval($rs[0]['maxidmastrino']) + 1;
}
}
/**
/*
* Ricalcola i costi aggiuntivi in fattura (rivalsa inps, ritenuta d'acconto, marca da bollo)
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
* $iddocumento int ID della fattura.
*
* @deprecated 2.4.17
*/
function ricalcola_costiagg_fattura($iddocumento)
{
global $dir;
$fattura = Fattura::find($iddocumento);
$fattura->save();
if (!function_exists('ricalcola_costiagg_fattura')) {
function ricalcola_costiagg_fattura($iddocumento)
{
global $dir;
$fattura = Fattura::find($iddocumento);
$fattura->save();
}
}
/**
/*
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato, a partire dai valori delle fatture ai giorni precedenti.
* Restituisce il numero_esterno mancante in caso di numero errato.
*
* @return bool|string
*/
function verifica_numero_fattura(Fattura $fattura)
{
if (empty($fattura->numero_esterno)) {
return null;
}
$id_segment = $fattura->id_segment;
$data = $fattura->data;
$documenti = Fattura::where('id_segment', '=', $id_segment)
->where('data', '=', $data)
->get();
// Recupero maschera per questo segmento
$maschera = Generator::getMaschera($id_segment);
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'id_segment = '.prepare($id_segment),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
if (!function_exists('verifica_numero_fattura')) {
function verifica_numero_fattura(Fattura $fattura)
{
if (empty($fattura->numero_esterno)) {
return null;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $fattura->numero_esterno);
$id_segment = $fattura->id_segment;
$data = $fattura->data;
return null;
$documenti = Fattura::where('id_segment', '=', $id_segment)
->where('data', '=', $data)
->get();
// Recupero maschera per questo segmento
$maschera = Generator::getMaschera($id_segment);
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'id_segment = '.prepare($id_segment),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $fattura->numero_esterno);
return null;
}
}

View File

@ -21,18 +21,20 @@ use Util\Ini;
include_once __DIR__.'/../../core.php';
function crea_form_componente($contenuto)
{
$fields = Ini::getFields($contenuto);
$title = array_shift($fields);
if (!function_exists('crea_form_componente')) {
function crea_form_componente($contenuto)
{
$fields = Ini::getFields($contenuto);
$title = array_shift($fields);
foreach ($fields as $key => $value) {
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
foreach ($fields as $key => $value) {
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
}
echo $title.'
<div class="row">
'.implode(PHP_EOL, $fields).'
<script>restart_inputs()</script>
</div>';
}
echo $title.'
<div class="row">
'.implode(PHP_EOL, $fields).'
<script>restart_inputs()</script>
</div>';
}

View File

@ -616,6 +616,15 @@ switch (post('op')) {
$intervento->idreferente = $documento->idreferente;
$intervento->idagente = $documento->idagente;
if ($class == 'Modules\Preventivi\Preventivo') {
$intervento->id_preventivo = $documento->id;
$intervento->richiesta = 'Attività creata da preventivo num. '.$documento->numero.'<br>'.$documento->nome;
}
if ($class == 'Modules\Ordini\Ordine') {
$intervento->id_ordine = $documento->id;
$intervento->richiesta = 'Attività creata da ordine num. '.$documento->numero_esterno;
}
$intervento->save();
$id_record = $intervento->id;

View File

@ -32,21 +32,24 @@ use Modules\Interventi\Intervento;
use Util\Generator;
use Util\Ini;
/**
/*
* Recupera il totale delle ore spese per un intervento.
*
* @param int $id_intervento
*
* @deprecated
*/
function get_ore_intervento($id_intervento)
{
$intervento = Intervento::find($id_intervento);
return $intervento->ore_totali;
if (!function_exists('get_ore_intervento')) {
function get_ore_intervento($id_intervento)
{
$intervento = Intervento::find($id_intervento);
return $intervento->ore_totali;
}
}
/**
/*
* Funzione per collegare gli articoli, usati in un intervento, ai rispettivi impianti.
*
* @param int $id_intervento
@ -56,80 +59,84 @@ function get_ore_intervento($id_intervento)
*
* @deprecated 2.4.25
*/
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
{
if (empty($id_impianto) || empty($id_intervento)) {
return;
}
$dbo = database();
$intervento = Intervento::find($id_intervento);
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
$data = $intervento->inizio ?: $intervento->data_richiesta;
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
$dati = [
'idimpianto' => $id_impianto,
'idintervento' => $id_intervento,
'nome' => $nome_componente,
'data' => $data,
'filename' => $componente_articolo['componente_filename'],
'contenuto' => $componente_articolo['contenuto'],
];
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
for ($q = 0; $q < $qta; ++$q) {
$dbo->insert('my_impianto_componenti', $dati);
if (!function_exists('link_componente_to_articolo')) {
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
{
if (empty($id_impianto) || empty($id_intervento)) {
return;
}
}
}
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
{
$intervento = Intervento::find($id_intervento);
$anagrafica = Anagrafica::find($idtecnico);
$dbo = database();
$intervento = Intervento::find($id_intervento);
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
$data = $intervento->inizio ?: $intervento->data_richiesta;
// Notifica nuovo intervento al tecnico
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
if (!empty($anagrafica['email'])) {
$template = Template::pool('Notifica intervento');
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
if (!empty($template)) {
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
$mail->addReceiver($anagrafica['email']);
$mail->save();
$dati = [
'idimpianto' => $id_impianto,
'idintervento' => $id_intervento,
'nome' => $nome_componente,
'data' => $data,
'filename' => $componente_articolo['componente_filename'],
'contenuto' => $componente_articolo['contenuto'],
];
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
for ($q = 0; $q < $qta; ++$q) {
$dbo->insert('my_impianto_componenti', $dati);
}
}
}
//Inserisco le righe aggiuntive previste dal tipo di intervento
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
$riga = RigaIntervento::build($intervento);
$riga->descrizione = $riga_aggiuntiva['descrizione'];
$riga->um = $riga_aggiuntiva['um'];
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
$riga->qta = $riga_aggiuntiva['qta'];
$riga->save();
}
return true;
}
/**
if (!function_exists('add_tecnico')) {
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
{
$intervento = Intervento::find($id_intervento);
$anagrafica = Anagrafica::find($idtecnico);
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
// Notifica nuovo intervento al tecnico
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
if (!empty($anagrafica['email'])) {
$template = Template::pool('Notifica intervento');
if (!empty($template)) {
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
$mail->addReceiver($anagrafica['email']);
$mail->save();
}
}
}
//Inserisco le righe aggiuntive previste dal tipo di intervento
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
$riga = RigaIntervento::build($intervento);
$riga->descrizione = $riga_aggiuntiva['descrizione'];
$riga->um = $riga_aggiuntiva['um'];
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
$riga->qta = $riga_aggiuntiva['qta'];
$riga->save();
}
return true;
}
}
/*
* Calcola le ore presenti tra due date.
*
* @param string $orario_inizio
@ -139,236 +146,242 @@ function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto =
*
* @deprecated
*/
function calcola_ore_intervento($orario_inizio, $orario_fine)
{
$inizio = new DateTime($orario_inizio);
$diff = $inizio->diff(new DateTime($orario_fine));
if (!function_exists('calcola_ore_intervento')) {
function calcola_ore_intervento($orario_inizio, $orario_fine)
{
$inizio = new DateTime($orario_inizio);
$diff = $inizio->diff(new DateTime($orario_fine));
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
return $ore;
return $ore;
}
}
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
{
$dbo = database();
if (!function_exists('aggiungi_intervento_in_fattura')) {
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
{
$dbo = database();
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
$fattura = Fattura::find($id_fattura);
$intervento = Intervento::find($id_intervento);
$fattura = Fattura::find($id_fattura);
$intervento = Intervento::find($id_intervento);
$data = $intervento->fine;
$codice = $intervento->codice;
$data = $intervento->fine;
$codice = $intervento->codice;
// Riga di descrizione
$riga = Descrizione::build($fattura);
$riga->descrizione = $descrizione;
$riga->idintervento = $id_intervento;
$riga->save();
// Riga di descrizione
$riga = Descrizione::build($fattura);
$riga->descrizione = $descrizione;
$riga->idintervento = $id_intervento;
$riga->save();
// Ore di lavoro raggruppate per costo orario
$sessioni = $intervento->sessioni;
// Ore di lavoro raggruppate per costo orario
$sessioni = $intervento->sessioni;
if (empty($sessioni)) {
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice,
]));
} else {
$decimals = setting('Cifre decimali per quantità');
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
});
foreach ($ore_di_lavoro as $gruppo) {
$sessione = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
if (empty($sessioni)) {
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'ore';
]));
} else {
$decimals = setting('Cifre decimali per quantità');
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
});
foreach ($ore_di_lavoro as $gruppo) {
$sessione = $gruppo->first();
$riga = Riga::build($fattura);
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'ore';
$riga->prezzo_unitario = $sessione->prezzo_orario;
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
} else {
$sconto_unitario = $sessione->sconto_unitario;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->prezzo_unitario = $sessione->prezzo_orario;
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
} else {
$sconto_unitario = $sessione->sconto_unitario;
}
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
$qta_gruppo = $gruppo->sum('ore');
$riga->qta = round($qta_gruppo, $decimals);
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
// Diritti di chiamata raggruppati per costo
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_diritto_chiamata'];
});
foreach ($diritti_chiamata as $gruppo) {
$diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura);
$qta_gruppo = $gruppo->sum('ore');
$riga->qta = round($qta_gruppo, $decimals);
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
//$riga->um = 'ore';
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->save();
}
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
// Diritti di chiamata raggruppati per costo
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_diritto_chiamata'];
});
foreach ($diritti_chiamata as $gruppo) {
$diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura);
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
$riga->qta = $gruppo->count();
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
//$riga->um = 'ore';
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
$riga->qta = $gruppo->count();
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
// Viaggi raggruppati per costo
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
});
foreach ($viaggi as $gruppo) {
$qta_trasferta = $gruppo->sum('km');
if ($qta_trasferta == 0) {
continue;
$riga->save();
}
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
// Viaggi raggruppati per costo
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
});
foreach ($viaggi as $gruppo) {
$qta_trasferta = $gruppo->sum('km');
if ($qta_trasferta == 0) {
continue;
}
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'km';
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'km';
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
$riga->qta = $qta_trasferta;
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
}
$riga->qta = $qta_trasferta;
// Articoli, righe, sconti e descrizioni collegati all'intervento
$righe = $intervento->getRighe();
foreach ($righe as $riga) {
$qta = $riga->qta;
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
$copia->id_rivalsa_inps = $id_rivalsa_inps;
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
$articolo = ArticoloOriginale::find($copia->idarticolo);
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
$riga->save();
}
}
$copia->save();
// Articoli, righe, sconti e descrizioni collegati all'intervento
$righe = $intervento->getRighe();
foreach ($righe as $riga) {
$qta = $riga->qta;
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
$copia->id_rivalsa_inps = $id_rivalsa_inps;
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
$articolo = ArticoloOriginale::find($copia->idarticolo);
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
}
$copia->save();
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura($id_fattura);
// Metto l'intervento in stato "Fatturato"
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura($id_fattura);
// Metto l'intervento in stato "Fatturato"
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
}
/**
/*
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato, a partire dai valori delle fatture ai giorni precedenti.
* Restituisce il numero_esterno mancante in caso di numero errato.
*
* @return bool|string
*/
function verifica_numero_intervento(Intervento $intervento)
{
if (empty($intervento->codice)) {
return null;
}
$data = $intervento->data_richiesta;
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato codice attività');
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')),
], $data);
} else {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
]);
}
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->codice == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
if (!function_exists('verifica_numero_intervento')) {
function verifica_numero_intervento(Intervento $intervento)
{
if (empty($intervento->codice)) {
return null;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $intervento->codice);
$data = $intervento->data_richiesta;
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
->get();
return null;
// Recupero maschera per questo segmento
$maschera = setting('Formato codice attività');
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')),
], $data);
} else {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
]);
}
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->codice == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $intervento->codice);
return null;
}
}

View File

@ -415,7 +415,7 @@ class Sessione extends Model
*/
public function getRicaricoPercentualeAttribute()
{
return $this->imponibile ? (($this->imponibile / $this->spesa) - 1) * 100 : 100;
return $this->imponibile ? (($this->imponibile / $this->spesa) - 1) * 100 : 0;
}
public function getIvaIndetraibileAttribute()

View File

@ -69,9 +69,18 @@ echo '
</div>
</div>
</form>';
?>
echo '
<script>
$(document).ready(init);
content_was_modified = false;
</script>';
var is_add = <?php echo empty(get('id')) ? '1' : '0'; ?>;
$(document).ready(function(){
init();
// Inizializzazione prezzo di vendita articolo
if (is_add) {
$('#prezzo_unitario').val( $('#id_articolo').selectData().prezzo_vendita );
}
});
content_was_modified = false;
</script>

View File

@ -284,8 +284,8 @@ if (!$block_edit) {
if ($dir == 'entrata') {
echo '
<div class="pull-right">
<a class="btn btn-sm btn-info" data-href="'.$structure->fileurl('quantita_impegnate.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Controllo sulle quantità impegnate').'" onclick="saveForm()">
<i class="fa fa-question-circle"></i> '.tr('Verifica disponibilità').'
<a class="btn btn-info" data-href="'.$structure->fileurl('quantita_impegnate.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Controllo sulle quantità impegnate').'" onclick="saveForm()">
<i class="fa fa-question-circle"></i> '.tr('Disponibilità').'
</a>
</div>';
}

View File

@ -22,92 +22,107 @@ include_once __DIR__.'/../../core.php';
use Modules\Interventi\Intervento;
use Modules\Ordini\Ordine;
/**
/*
* Funzione per generare un nuovo numero per l'ordine.
*
* @deprecated 2.4.5
*/
function get_new_numeroordine($data)
{
global $dir;
if (!function_exists('get_new_numeroordine')) {
function get_new_numeroordine($data)
{
global $dir;
return Ordine::getNextNumero($data, $dir);
return Ordine::getNextNumero($data, $dir);
}
}
/**
/*
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
*
* @deprecated 2.4.5
*/
function get_new_numerosecondarioordine($data)
{
global $dir;
global $id_segment;
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
if (!function_exists('get_new_numerosecondarioordine')) {
function get_new_numerosecondarioordine($data)
{
global $dir;
global $id_segment;
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
/*
* Calcolo imponibile ordine (totale_righe - sconto).
*
* @deprecated 2.4.5
*/
function get_imponibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->imponibile;
if (!function_exists('get_imponibile_ordine')) {
function get_imponibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->imponibile;
}
}
/**
/*
* Calcolo totale ordine (imponibile + iva).
*
* @deprecated 2.4.5
*/
function get_totale_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_totale_ordine')) {
function get_totale_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->totale;
return $ordine->totale;
}
}
/**
/*
* Calcolo netto a pagare ordine (totale - ritenute - bolli).
*
* @deprecated 2.4.5
*/
function get_netto_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->netto;
if (!function_exists('get_netto_ordine')) {
function get_netto_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->netto;
}
}
/**
/*
* Calcolo iva detraibile ordine.
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_ivadetraibile_ordine')) {
function get_ivadetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->iva_detraibile;
return $ordine->iva_detraibile;
}
}
/**
/*
* Calcolo iva indetraibile ordine.
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_ivaindetraibile_ordine')) {
function get_ivaindetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->iva_indetraibile;
return $ordine->iva_indetraibile;
}
}
/**
/*
* Ricalcola i costi aggiuntivi in ordine (rivalsa inps, ritenuta d'acconto, marca da bollo)
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
* $idordine int ID del ordine
@ -115,140 +130,145 @@ function get_ivaindetraibile_ordine($idordine)
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
*/
function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
if (!function_exists('ricalcola_costiagg_ordine')) {
function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
$dbo = database();
$dbo = database();
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = 'SELECT COUNT(id) AS righe FROM or_righe_ordini WHERE idordine='.prepare($idordine);
$rs = $dbo->fetchArray($query);
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ordine($idordine);
$totale_ordine = get_totale_ordine($idordine);
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = 'SELECT percentuale FROM co_rivalse WHERE id='.prepare($idrivalsainps);
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = 'SELECT COUNT(id) AS righe FROM or_righe_ordini WHERE idordine='.prepare($idordine);
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ordine($idordine);
$totale_ordine = get_totale_ordine($idordine);
// Aggiorno la rivalsa inps
$dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id=".prepare($idordine));
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Leggo la ritenuta d'acconto se c'è
$totale_ordine = get_totale_ordine($idordine);
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ordine - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = 'SELECT percentuale FROM co_rivalse WHERE id='.prepare($idrivalsainps);
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
// Aggiorno la rivalsa inps
$dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id=".prepare($idordine));
// Leggo la ritenuta d'acconto se c'è
$totale_ordine = get_totale_ordine($idordine);
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ordine - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
}
} else {
$marca_da_bollo = 0.00;
}
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
} else {
$marca_da_bollo = 0.00;
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
}
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
} else {
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
}
}
/**
/*
* Restituisce lo stato dell'ordine in base alle righe.
*/
function get_stato_ordine($idordine)
{
$dbo = database();
if (!function_exists('get_stato_ordine')) {
function get_stato_ordine($idordine)
{
$dbo = database();
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
$qta_ordine = $rs_ordine[0]['qta'];
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
$qta_ordine = $rs_ordine[0]['qta'];
//Righe dell'ordine in ddt
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
$qta_ddt = $rs_ddt[0]['qta'];
//Righe dell'ordine in ddt
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
$qta_ddt = $rs_ddt[0]['qta'];
//Righe dell'ordine in fattura
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
$qta_fattura = $rs_fattura[0]['qta'];
//Righe dell'ordine in fattura
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
$qta_fattura = $rs_fattura[0]['qta'];
//Righe dell'ordine in fattura passando da ddt
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
//Righe dell'ordine in fattura passando da ddt
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
if ($qta_ddt == 0) {
$stato = 'Accettato';
}
if ($qta_fattura == 0) {
$stato = 'Accettato';
}
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente evaso';
}
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
$stato = 'Evaso';
}
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt == 0) {
$stato = 'Accettato';
}
if ($qta_fattura == 0) {
$stato = 'Accettato';
}
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente evaso';
}
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
$stato = 'Evaso';
}
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
return $stato;
return $stato;
}
}
function get_totale_interventi_ordine($idordine)
{
$interventi = Intervento::where('id_ordine', $idordine)->get();
$array_interventi = $interventi->toArray();
if (!function_exists('get_totale_interventi_ordine')) {
function get_totale_interventi_ordine($idordine)
{
$interventi = Intervento::where('id_ordine', $idordine)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
return $totale;
}
}

View File

@ -16,7 +16,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../../core.php';
use Modules\Interventi\Intervento;
@ -381,8 +380,8 @@ if ($diff > 0) {
foreach ($materiali_array1 as $materiali_array2) {
foreach ($materiali_array2 as $materiale) {
$margine = $materiale['ricavo'] - $materiale['costo'];
$margine_prc = (int) (1 - ($materiale['costo'] / $materiale['ricavo'])) * 100;
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
$margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] ? $materiale['ricavo'] : 1))) * 100;
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] ? $materiale['costo'] : 1)) - 1) * 100) : 100;
echo '
<tr>
<td>'.Modules::link('Articoli', $materiale['id'], $key).'</td>
@ -399,9 +398,9 @@ if ($diff > 0) {
ksort($materiali_righe);
foreach ($materiali_righe as $key => $materiale) {
$margine = $materiale['ricavo'] - $materiale['costo'];
$margine_prc = (int) (1 - ($materiale['costo'] / $materiale['ricavo'])) * 100;
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / $materiale['costo']) - 1) * 100) : 100;
echo '
$margine_prc = (int) (1 - ($materiale['costo'] / ($materiale['ricavo'] ? $materiale['ricavo'] : 1))) * 100;
$ricarico_prc = ($materiale['ricavo'] && $materiale['costo']) ? (int) ((($materiale['ricavo'] / ($materiale['costo'] ? $materiale['costo'] : 1)) - 1) * 100) : 100;
echo'
<tr>
<td>'.$key.'</td>
<td class="text-center">'.$materiale['qta'].'</td>

View File

@ -213,8 +213,8 @@ foreach ($righe as $riga) {
$evasione_bar['in_righe_interventi'] = 'warning';
$evasione_bar['or_righe_ordini'] = 'success';
foreach ($evasione_bar as $table => $color) {
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
if ($righe_ev->count() > 0) {
$righe_ev = $dbo->table($table)->where('original_id', $riga->id)->where('original_type', get_class($riga))->get();
$perc_ev = $righe_ev->sum('qta') * 100 / $riga->qta;
if ($perc_ev > 0) {
echo '

View File

@ -22,39 +22,46 @@ include_once __DIR__.'/../../core.php';
use Modules\Interventi\Intervento;
use Modules\Preventivi\Preventivo;
function get_imponibile_preventivo($idpreventivo)
{
$preventivo = Preventivo::find($idpreventivo);
if (!function_exists('get_imponibile_preventivo')) {
function get_imponibile_preventivo($idpreventivo)
{
$preventivo = Preventivo::find($idpreventivo);
return $preventivo->totale_imponibile;
}
/**
* Restituisce lo stato del preventivo in base alle righe.
*/
function get_stato_preventivo($idpreventivo)
{
$dbo = database();
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente evaso';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Evaso';
}
} else {
return 'Non evaso';
return $preventivo->totale_imponibile;
}
}
function get_totale_interventi_preventivo($idpreventivo)
{
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
$array_interventi = $interventi->toArray();
/*
* Restituisce lo stato del preventivo in base alle righe.
*/
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
if (!function_exists('get_stato_preventivo')) {
function get_stato_preventivo($idpreventivo)
{
$dbo = database();
return $totale;
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente evaso';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Evaso';
}
} else {
return 'Non evaso';
}
}
}
if (!function_exists('get_totale_interventi_preventivo')) {
function get_totale_interventi_preventivo($idpreventivo)
{
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
}
}

View File

@ -434,8 +434,8 @@ echo '
<tr>
<td colspan="'.$colspan.'" class="text-right">
'.tr('Ricarico (_PRC_%)', [
'_PRC_' => numberFormat($preventivo->ricarico_percentuale),
'.tr('Ricarico (_PRC_)', [
'_PRC_' => ($preventivo->ricarico_percentuale != 0 ? numberFormat($preventivo->ricarico_percentuale).'%' : 'N.D.'),
]).':
</td>
</tr>';

View File

@ -17,10 +17,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
$r = $dbo->fetchOne('SELECT *,
an_anagrafiche.ragione_sociale, co_preventivi.idanagrafica, an_referenti.nome,
IF( (an_referenti.email IS NOT NULL AND an_referenti.email!=""), an_referenti.email, an_anagrafiche.email) AS email
FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica LEFT OUTER JOIN an_referenti ON an_referenti.id=co_preventivi.idreferente WHERE co_preventivi.id='.prepare($id_record));
$r = $dbo->fetchOne('SELECT *,
co_preventivi.nome as nome_preventivo,
an_anagrafiche.ragione_sociale,
co_preventivi.idanagrafica,
an_referenti.nome as nome_referente,
IF((an_referenti.email IS NOT NULL AND an_referenti.email!=""), an_referenti.email, an_anagrafiche.email) AS email
FROM
co_preventivi
INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica
LEFT JOIN an_referenti ON an_referenti.id=co_preventivi.idreferente
WHERE
co_preventivi.id='.prepare($id_record));
$revisione = $dbo->fetchNum('SELECT * FROM co_preventivi WHERE master_revision = (SELECT master_revision FROM co_preventivi WHERE id = '.prepare($id_record).') AND id < '.prepare($id_record));
@ -33,5 +41,6 @@ return [
'data' => Translator::dateToLocale($r['data_bozza']),
'id_anagrafica' => $r['idanagrafica'],
'revisione' => $revisione,
'nome_referente' => $r['nome'],
'nome_referente' => $r['nome_referente'],
'nome_preventivo' => $r['nome_preventivo'],
];

View File

@ -229,13 +229,13 @@ foreach ($scadenze as $i => $scadenza) {
</tbody>
<tfoot>
<tr>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"><b>'.tr('Totale').'</b></td>
<td class="text-right" id="totale_utente">'.numberFormat($totale_da_pagare).'</td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
</tr>
</tfoot>
</table>

View File

@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> <b>'.tr('Attenzione', [], ['upper']).':</b> '.tr('le suddette stampe contabili non sono da considerarsi valide ai fini fiscali').'.
<i class="fa fa-warning"></i> <b>'.tr('Attenzione', [], ['upper']).':</b> '.tr('le seguenti stampe contabili possono essere utilizzate per fini fiscali previa verifica delle informazioni inserite nel gestionale.<br/> Rimane esclusiva responsabilità dell\'utente controllare la correttezza dei documenti qui prodotti').'.
</div>
<div class="row">

View File

@ -19,53 +19,55 @@
include_once __DIR__.'/../../core.php';
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
{
$dbo = database();
++$depth;
if (!function_exists('menuSelection')) {
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
{
$dbo = database();
++$depth;
// Permessi impostati per il gruppo
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
// Permessi impostati per il gruppo
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
$result = '
<tr>
<td>'.str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $depth).'<span>'.$element['title'].'</span></td>
<td>
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
$result = '
<tr>
<td>'.str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $depth).'<span>'.$element['title'].'</span></td>
<td>
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
foreach ($permessi_disponibili as $id => $nome) {
switch ($id) {
case 'rw':
$bgcolor = 'green';
break;
case 'r':
$bgcolor = 'orange';
break;
case '-':
$bgcolor = 'red';
break;
default:
break;
foreach ($permessi_disponibili as $id => $nome) {
switch ($id) {
case 'rw':
$bgcolor = 'green';
break;
case 'r':
$bgcolor = 'orange';
break;
case '-':
$bgcolor = 'red';
break;
default:
break;
}
$attr = ($id == $permessi) ? ' selected="selected"' : '';
$result .= '
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
}
$attr = ($id == $permessi) ? ' selected="selected"' : '';
$result .= '
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
}
</select>
</td>
</tr>';
$result .= '
</select>
</td>
</tr>';
$submenus = $element['all_children'];
if (!empty($submenus)) {
foreach ($submenus as $submenu) {
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
$submenus = $element['all_children'];
if (!empty($submenus)) {
foreach ($submenus as $submenu) {
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
}
}
}
return $result;
return $result;
}
}

View File

@ -1778,7 +1778,7 @@ class FatturaElettronica
{
$documento = $fattura->getDocumento();
$rappresentante_fiscale = null;
//Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore)
if ($documento['is_fattura_conto_terzi']) {
$azienda = $fattura->getCliente();

View File

@ -417,7 +417,7 @@ switch (filter('op')) {
$codici = $riga['CodiceArticolo'] ?: [];
$codici = !empty($codici) && !isset($codici[0]) ? [$codici] : $codici;
// Ricerca dell'articolo collegato al codice
// Ricerca dell'articolo collegato a ogni codice associato alla riga
$id_articolo = null;
foreach ($codici as $codice) {
if (!empty($anagrafica) && empty($id_articolo)) {
@ -434,6 +434,15 @@ switch (filter('op')) {
if (empty($id_articolo)) {
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE REPLACE(codice, " ", "") = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
}
// Controllo se esistono articoli con barcode corrispondente al codice
if (empty($id_articolo)) {
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE barcode = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
}
if (empty($id_articolo)) {
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE REPLACE(barcode, " ", "") = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id'];
}
}
if (!empty($id_articolo)) {

View File

@ -2,40 +2,42 @@
include_once __DIR__.'/../../core.php';
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
{
$mese = [
'01' => 'Gennaio',
'02' => 'Febbraio',
'03' => 'Marzo',
'04' => 'Aprile',
'05' => 'Maggio',
'06' => 'Giugno',
'07' => 'Luglio',
'08' => 'Agosto',
'09' => 'Settembre',
'10' => 'Ottobre',
'11' => 'Novembre',
'12' => 'Dicembre',
];
if (!function_exists('variables')) {
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
{
$mese = [
'01' => 'Gennaio',
'02' => 'Febbraio',
'03' => 'Marzo',
'04' => 'Aprile',
'05' => 'Maggio',
'06' => 'Giugno',
'07' => 'Luglio',
'08' => 'Agosto',
'09' => 'Settembre',
'10' => 'Ottobre',
'11' => 'Novembre',
'12' => 'Dicembre',
];
$result['list'] = '<ul>
<li><code>{periodo}</code></li>
<li><code>{data_inizio}</code></li>
<li><code>{data_fine}</code></li>
<li><code>{mese_fatturazione}</code></li>
<li><code>{rata_attuale}</code></li>
<li><code>{numero_rate}</code></li>
</ul>';
$result['list'] = '<ul>
<li><code>{periodo}</code></li>
<li><code>{data_inizio}</code></li>
<li><code>{data_fine}</code></li>
<li><code>{mese_fatturazione}</code></li>
<li><code>{rata_attuale}</code></li>
<li><code>{numero_rate}</code></li>
</ul>';
if (!empty($descrizione)) {
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
if (!empty($descrizione)) {
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
}
return $result;
}
return $result;
}

View File

@ -25,7 +25,7 @@ use Plugins\ReceiptFE\Interaction;
use Util\XML;
echo '
<p>'.tr('Le ricevute delle Fatture Elettroniche permettono di individuare se una determinata fattura tramessa è stata accettata dal Sistema Di Interscambio').'.</p>';
<p>'.tr('Le ricevute delle Fatture Elettroniche permettono di individuare se una determinata fattura trasmessa è stata accettata dal Sistema Di Interscambio').'.</p>';
if (Interaction::isEnabled()) {
echo '

View File

@ -44,6 +44,9 @@ switch ($operazione) {
'codice_destinatario' => post('codice_destinatario'),
'is_automezzo' => post('is_automezzo'),
'is_rappresentante_fiscale' => post('is_rappresentante_fiscale'),
'targa' => post('targa'),
'nome' => post('nome'),
'descrizione' => post('descrizione'),
]);
$id_record = $dbo->lastInsertedID();
@ -65,7 +68,7 @@ switch ($operazione) {
} else {
flash()->warning(tr('Errore durante aggiunta della sede'));
}
$sede = Sede::find($id_record);
$sede->save();
@ -97,6 +100,9 @@ switch ($operazione) {
'gaddress' => post('gaddress'),
'lat' => post('lat'),
'lng' => post('lng'),
'targa' => post('targa'),
'nome' => post('nome'),
'descrizione' => post('descrizione'),
], ['id' => $id_record]);
$referenti = $dbo->fetchArray('SELECT id FROM an_referenti WHERE idsede = '.$id_record);

View File

@ -97,8 +97,40 @@ echo '
<div class="col-md-12">
{[ "type": "select", "multiple": "1", "label": "'.tr('Referenti').'", "name": "id_referenti[]", "ajax-source": "referenti", "select-options": {"idanagrafica": '.$id_parent.'}, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|id_plugin='.Plugins::get('Referenti')['id'].'&id_parent='.$id_parent.'" ]}
</div>
</div>
</div>';
$espandi_dettagli = setting('Espandi automaticamente la sezione "Dettagli aggiuntivi"');
echo '
<!-- DATI AGGIUNTIVI -->
<div class="box box-info collapsable '.(empty($espandi_dettagli) ? 'collapsed-box' : '').'">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Dettagli aggiuntivi').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-'.(empty($espandi_dettagli) ? 'plus' : 'minus').'"></i>
</button>
</div>
</div>
<div class="box-body">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Nome').'", "name": "nome", "value": "" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Targa').'", "name": "targa", "maxlength": 10, "class": "alphanumeric-mask", "value": "" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "value": "" ]}
</div>
</div>
</div>
</div>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">

View File

@ -191,6 +191,37 @@ if (!empty($elementi)) {
$disabled = 'disabled';
}
$espandi_dettagli = setting('Espandi automaticamente la sezione "Dettagli aggiuntivi"');
echo '
<!-- DATI AGGIUNTIVI -->
<div class="box box-info collapsable '.(empty($espandi_dettagli) ? 'collapsed-box' : '').'">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Dettagli aggiuntivi').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-'.(empty($espandi_dettagli) ? 'plus' : 'minus').'"></i>
</button>
</div>
</div>
<div class="box-body">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Nome').'", "name": "nome", "value": "$nome$" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Targa').'", "name": "targa", "maxlength": 10, "class": "alphanumeric-mask", "value": "$targa$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "value": "$descrizione$" ]}
</div>
</div>
</div>
</div>';
echo '
<!-- PULSANTI -->
<div class="row">

View File

@ -361,7 +361,7 @@ abstract class Accounting extends Component
*/
public function getRicaricoPercentualeAttribute()
{
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 0;
}
/**

View File

@ -308,7 +308,7 @@ abstract class Article extends Accounting
->groupBy('idarticolo')
->sum('qta');
$qta_modifica = $this->attributes['qta']-$this->original['qta'];
$qta_modifica = $this->attributes['qta'] - $this->original['qta'];
//Se la quantità supera la giacenza in sede allora movimento solo quello che resta
if (($qta_sede + $qta_finale) < 0 && $qta_sede >= 0) {
@ -334,7 +334,6 @@ abstract class Article extends Accounting
'reference_id' => $documento->id,
'idsede' => $id_sede,
]);
}
protected static function boot()

View File

@ -246,7 +246,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
*/
public function getRicaricoPercentualeAttribute()
{
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 0;
}
public function delete()

View File

@ -332,6 +332,26 @@ class HTMLBuilder
self::$record = $record;
}
/**
* Decodifica i tag personalizzati e li converte in un array basato sul formato JSON.
*
* @param string $string
* @param string $type
*
* @return array
*/
public static function decode($string, $type)
{
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
// Fix per contenuti con newline integrati
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
$json = (array) json_decode($string, true);
return $json;
}
/**
* Genera il codice HTML per i singoli tag di input.
*
@ -366,26 +386,6 @@ class HTMLBuilder
return $result;
}
/**
* Decodifica i tag personalizzati e li converte in un array basato sul formato JSON.
*
* @param string $string
* @param string $type
*
* @return array
*/
protected static function decode($string, $type)
{
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
// Fix per contenuti con newline integrati
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
$json = (array) json_decode($string, true);
return $json;
}
/**
* Elabora l'array contenente le impostazioni del tag per renderlo fruibile alla conversione in HTML (per i tag di input).
*

View File

@ -206,7 +206,7 @@ class SelectHandler implements HandlerInterface
}
}
$element['text'] = empty($element['text']) ? $element['descrizione'] : $element['text'];
$element['text'] = ($element['text'] == '' || $element['text'] == null) ? $element['descrizione'] : $element['text'];
if ($link == 'stampa') {
$element['title'] = ' ';

View File

@ -82,6 +82,12 @@ class FieldManager implements ManagerInterface
$field['value'] = isset($field['value']) ? $field['value'] : '';
//Gestione valori multipli
$values = json_decode((string) $field['value'], true);
if (is_array($values)) {
$field['value'] = implode(',', $values);
}
$replace = [
'value' => $field['value'],
'label' => $field['name'],
@ -101,6 +107,10 @@ class FieldManager implements ManagerInterface
$result .= '
</div>';
}
// Forzatura inizializzazione componente
$component = \HTMLBuilder\HTMLBuilder::decode(\Filter::sanitize($field['content']), 'manager');
$result .= '<script>$(document).ready( function(){ input("#'.(!empty($component['id']) ? $component['id'] : $component['name']).'").init(); });</script>';
}
if (($key + 1) % 3 != 0) {

View File

@ -127,51 +127,97 @@ echo '
// Righe documento
$righe = $documento->getRighe();
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
$riferimenti = [];
$id_rif = [];
foreach ($righe as $riga) {
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
if (!empty($riferimento)) {
if (!array_key_exists($riferimento, $riferimenti)) {
$riferimenti[$riferimento] = [];
}
if (!in_array($riga->id, $riferimenti[$riferimento])) {
$id_rif[] = $riga->id;
$riferimenti[$riferimento][] = $riga->id;
}
}
}
}
foreach ($righe as $riga) {
$r = $riga->toArray();
$autofill->count($r['descrizione']);
echo '
<tr>
<td>
'.nl2br($r['descrizione']);
<tr>
<td>';
$text = '';
foreach ($riferimenti as $key => $riferimento) {
if (in_array($riga->id, $riferimento)) {
if ($riga->id === $riferimento[0]) {
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
}
$text = '<b>'.$key.'</b><br>';
if ($options['pricing']) {
$text = $text.'<td></td><td></td>';
}
$text = $text.'</td><td></td></tr><tr><td>';
echo nl2br($text);
}
}
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
}
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
echo $r['descrizione'];
} else {
echo nl2br($r['descrizione']);
}
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->codice,
]);
echo '
<br><small>'.$text.'</small>';
$autofill->count($text, true);
echo nl2br('<br><small>'.$riga->codice.'</small>');
} else {
echo '-';
}
if ($riga->isArticolo()) {
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode(', ', $seriali);
echo '
<br><small>'.$text.'</small>';
<small>'.$text.'</small>';
$autofill->count($text, true);
}
}
echo '
</td>';
</td>';
if (!$riga->isDescrizione()) {
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
if ($riga->sconto > 0) {
$text = discountInfo($riga, false);
@ -188,7 +234,7 @@ foreach ($righe as $riga) {
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
</td>';
}
} else {
@ -233,7 +279,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
</th>
</tr>';
@ -246,7 +292,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, $d_totali).'</b>
</th>
</tr>';
@ -258,7 +304,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_imponibile, 2).'</b>
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
</th>
</tr>';
}
@ -271,7 +317,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_iva, 2).'</b>
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
</th>
</tr>';
@ -282,7 +328,7 @@ if ($options['pricing']) {
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale, $d_totali).'</b>
</th>
</tr>';
@ -294,7 +340,7 @@ if ($options['pricing']) {
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($sconto_finale, 2).'</b>
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
</th>
</tr>';
@ -305,7 +351,7 @@ if ($options['pricing']) {
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
</th>
</tr>';
}

View File

@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
use Modules\Contratti\Contratto;
$documento = Contratto::find($id_record);
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$id_cliente = $documento['idanagrafica'];

View File

@ -22,7 +22,7 @@ include_once __DIR__.'/../../core.php';
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
// Creazione righe fantasma
$autofill = new \Util\Autofill($options['pricing'] ? 7 : 4);
$autofill = new \Util\Autofill($options['pricing'] ? 6 : 3);
$rows_per_page = 16;
if (!empty($options['last-page-footer'])) {
$rows_per_page += 10;
@ -35,7 +35,6 @@ echo "
<thead>
<tr>
<th class='text-center' style='width:5%'>".tr('#', [], ['upper' => true])."</th>
<th class='text-center'>".tr('Cod.', [], ['upper' => true])."</th>
<th class='text-center'>".tr('Descrizione', [], ['upper' => true])."</th>
<th class='text-center'>".tr('Q.tà', [], ['upper' => true]).'</th>';
@ -55,6 +54,26 @@ if ($options['pricing']) {
// Righe documento
$righe = $documento->getRighe();
$num = 0;
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
$riferimenti = [];
$id_rif = [];
foreach ($righe as $riga) {
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
if (!empty($riferimento)) {
if (!array_key_exists($riferimento, $riferimenti)) {
$riferimenti[$riferimento] = [];
}
if (!in_array($riga->id, $riferimenti[$riferimento])) {
$id_rif[] = $riga->id;
$riferimenti[$riferimento][] = $riga->id;
}
}
}
}
foreach ($righe as $riga) {
++$num;
$r = $riga->toArray();
@ -63,88 +82,85 @@ foreach ($righe as $riga) {
echo '
<tr>
<td class="text-center" style="vertical-align: middle">
'.$num.'
</td>
<td class="text-center" style="vertical-align: middle">';
<td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
$text = '';
foreach ($riferimenti as $key => $riferimento) {
if (in_array($riga->id, $riferimento)) {
if ($riga->id === $riferimento[0]) {
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
}
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
if (!empty($rif2)) {
$text .= '<b>'.$rif2[0].'</b>';
}
$text .= '<b>'.$key.'</b>';
if ($options['pricing']) {
$text .= '</td><td></td><td></td><td>';
}
$text .= '</td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
echo '
</td>
<td>
'.nl2br($text);
}
}
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
$autofill->count($r['descrizione']);
}
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
echo $num.'
</td>
<td>'.$r['descrizione'];
} else {
echo $num.'
</td>
<td>'.nl2br($r['descrizione']);
}
if ($riga->isArticolo()) {
echo $riga->codice;
echo '<br><small>'.$riga->codice.'</small>';
} else {
echo '-';
}
echo '
</td>
<td>
'.nl2br($r['descrizione']);
//Riferimenti ordini/ddt righe
if ($riga->referenceTargets()->count()) {
$source = $source_type::find($riga->id);
$riferimenti = $source->referenceTargets;
foreach ($riferimenti as $riferimento) {
$documento_riferimento = $riferimento->target->getDocument();
echo '
<br><small>'.$riferimento->target->descrizione.'<br>'.tr('Rif. _DOCUMENT_', [
'_DOCUMENT_' => strtolower($documento_riferimento->getReference()),
]).'</small>';
}
}
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->codice,
]);
echo '
<br><small>'.$text.'</small>';
$autofill->count($text, true);
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode(', ', $seriali);
echo '
<br><small>'.$text.'</small>';
<small>'.$text.'</small>';
$autofill->count($text, true);
}
}
// Aggiunta dei riferimenti ai documenti
/*
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
$ref = $riga->getOriginal()->getDocument()->getReference();
if (!empty($ref)) {
echo '
<br><small>'.$ref.'</small>';
$autofill->count($ref, true);
}
}
*/
echo '
</td>';
if (!$riga->isDescrizione()) {
echo '
<td class="text-center" nowrap="nowrap">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo '
<td class="text-right" nowrap="nowrap">
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
if ($riga->sconto > 0) {
$text = discountInfo($riga, false);
@ -161,13 +177,13 @@ foreach ($righe as $riga) {
// Imponibile
echo '
<td class="text-right" nowrap="nowrap">
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
</td>';
// Iva
echo '
<td class="text-center" nowrap="nowrap">
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_importi).'
</td>';
}
} else {

View File

@ -54,7 +54,7 @@ if ($options['pricing']) {
echo "
<tr>
<td class='cell-padded text-right'>
".moneyFormat($totale_imponibile, 2).'
".moneyFormat($totale_imponibile, $d_totali).'
</td>
</tr>';
@ -68,7 +68,7 @@ if ($options['pricing']) {
<tr>
<td class='cell-padded text-right'>
".moneyFormat($totale_iva, 2).'
".moneyFormat($totale_iva, $d_totali).'
</td>
</tr>';
@ -82,7 +82,7 @@ if ($options['pricing']) {
<tr>
<td class='cell-padded text-right'>
".moneyFormat($totale, 2).'
".moneyFormat($totale, $d_totali).'
</td>
</tr>';
@ -97,7 +97,7 @@ if ($options['pricing']) {
<tr>
<td class='cell-padded text-right'>
".moneyFormat($sconto_finale, 2).'
".moneyFormat($sconto_finale, $d_totali).'
</td>
</tr>';
@ -111,7 +111,7 @@ if ($options['pricing']) {
<tr>
<td class='cell-padded text-right'>
".moneyFormat($netto_a_pagare, 2).'
".moneyFormat($netto_a_pagare, $d_totali).'
</td>
</tr>';
}

View File

@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
use Modules\DDT\DDT;
$documento = DDT::find($id_record);
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$id_cliente = $documento['idanagrafica'];
$id_sede = $record['idsede_partenza'];

View File

@ -17,8 +17,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Interventi\Intervento;
include_once __DIR__.'/../../core.php';
$v_iva = [];
@ -53,6 +51,26 @@ echo "
// Righe documento
$righe = $documento->getRighe();
$num = 0;
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
$riferimenti = [];
$id_rif = [];
foreach ($righe as $riga) {
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
if (!empty($riferimento)) {
if (!array_key_exists($riferimento, $riferimenti)) {
$riferimenti[$riferimento] = [];
}
if (!in_array($riga->id, $riferimenti[$riferimento])) {
$id_rif[] = $riga->id;
$riferimenti[$riferimento][] = $riga->id;
}
}
}
}
foreach ($righe as $riga) {
++$num;
$r = $riga->toArray();
@ -62,90 +80,67 @@ foreach ($righe as $riga) {
$v_iva[$r['desc_iva']] = sum($v_iva[$r['desc_iva']], $riga->iva);
$v_totale[$r['desc_iva']] = sum($v_totale[$r['desc_iva']], $riga->totale_imponibile);
// Descrizione della riga
$descrizione = $riga->descrizione;
echo '
<tr>
<td class="text-center" style="vertical-align: middle">';
// Aggiunta riferimento più profondo per DDT attraverso Interventi
if ($riga->hasOriginalComponent() && $riga->original_document_type == Intervento::class) {
$riga_origine = $riga->getOriginalComponent();
$text = '';
if ($riga_origine->hasOriginalComponent()) {
$riferimento = $riga_origine->getOriginalComponent()
->getDocument()->getReference();
foreach ($riferimenti as $key => $riferimento) {
if (in_array($riga->id, $riferimento)) {
if ($riga->id === $riferimento[0]) {
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
}
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
if (!empty($rif2)) {
$text .= '<b>'.$rif2[0].'</b>';
}
$text .= '<b>'.$key.'</b></td><td></td><td></td><td></td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
$descrizione .= "\n".tr('Rif. _DOCUMENT_', [
'_DOCUMENT_' => strtolower($riferimento),
]);
echo '
</td>
<td>
'.nl2br($text);
}
}
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
$autofill->count($r['descrizione']);
}
echo '
<tr>';
echo '
<td class="text-center" style="vertical-align: middle">
'.$num.'
</td>';
echo '
<td>
'.nl2br(strip_tags($descrizione));
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
echo $num.'
</td>
<td>'.$r['descrizione'];
} else {
echo $num.'
</td>
<td>'.nl2br($r['descrizione']);
}
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->codice,
]);
echo '
<br><small>'.$text.'</small>';
$autofill->count($text, true);
echo '<br><small>'.$riga->codice.'</small>';
} else {
echo '-';
}
if ($riga->isArticolo()) {
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode(', ', $seriali);
echo '
<br><small>'.$text.'</small>';
<small>'.$text.'</small>';
$autofill->count($text, true);
}
}
// Aggiunta dei riferimenti ai documenti
if (!empty($record['ref_documento'])) {
$data = $dbo->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti WHERE id = ".prepare($record['ref_documento']));
$text = tr('Rif. fattura _NUM_ del _DATE_', [
'_NUM_' => $data[0]['numero'],
'_DATE_' => Translator::dateToLocale($data[0]['data']),
]);
echo '
<br><small>'.$text.'</small>';
$autofill->count($text, true);
}
// Aggiunta dei riferimenti ai documenti
/*
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
$ref = $riga->getOriginal()->getDcocument()->getReference();
if (!empty($riga->getOriginal()->getDcocument()->numero_cliente)) {
$ref .= '<br>'.tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => 'Rif. Vs. ordine cliente',
'_NUM_' => $riga->getOriginalComponent()->getDocument()->numero_cliente,
'_DATE_' => dateFormat($riga->getOriginalComponent()->getDocument()->data_cliente),
]);
}
if (!empty($ref)) {
echo '
<br><small>'.$ref.'</small>';
$autofill->count($ref, true);
}
}*/
// Informazioni su CIG, CUP, ...
if ($riga->hasOriginalComponent()) {
$documento_originale = $riga->getOriginalComponent()->getDocument();
@ -169,18 +164,18 @@ foreach ($righe as $riga) {
}
echo '
</td>';
</td>';
if (!$riga->isDescrizione()) {
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
</td>';
// Prezzo unitario
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
if ($riga->sconto > 0) {
$text = discountInfo($riga, false);
@ -197,13 +192,13 @@ foreach ($righe as $riga) {
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? ($riga->totale_imponibile + $riga->iva) : $riga->totale_imponibile).'
'.moneyFormat($prezzi_ivati ? ($riga->totale_imponibile + $riga->iva) : $riga->totale_imponibile, $d_importi).'
</td>';
// Iva
echo '
<td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
</td>';
} else {
echo '

View File

@ -83,7 +83,7 @@ if (!empty($rs2)) {
".(($rs2[$i]['pagato'] == $rs2[$i]['da_pagare']) ? '<small>PAGATO</small>' : '')."
</td>
<td style='width:15%;' class='text-right'>
<small>".moneyFormat($rs2[$i]['da_pagare'], 2).'</small>
<small>".moneyFormat($rs2[$i]['da_pagare'], $d_totali).'</small>
</td>
<td style=\'width:15%;\'>
<small>'.$pagamento.'</small>
@ -130,11 +130,11 @@ if (!empty($v_iva)) {
</td>
<td class='text-right'>
<small>".moneyFormat($v_totale[$desc_iva], 2)."</small>
<small>".moneyFormat($v_totale[$desc_iva], $d_totali)."</small>
</td>
<td class='text-right'>
<small>".moneyFormat($v_iva[$desc_iva], 2).'</small>
<small>".moneyFormat($v_iva[$desc_iva], $d_totali).'</small>
</td>
</tr>';
}
@ -190,28 +190,28 @@ echo "
<tr>
<td class='cell-padded text-center'>
".moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
".moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'
</td>';
if ($show_sconto) {
echo "
<td class='cell-padded text-center'>
".moneyFormat(abs($sconto), 2)."
".moneyFormat(abs($sconto), $d_totali)."
</td>
<td class='cell-padded text-center'>
".moneyFormat($totale_imponibile, 2).'
".moneyFormat($totale_imponibile, $d_totali).'
</td>';
}
echo "
<td class='cell-padded text-center'>
".moneyFormat($totale_iva, 2)."
".moneyFormat($totale_iva, $d_totali)."
</td>
<td class='cell-padded text-center'>
".moneyFormat($totale, 2).'
".moneyFormat($totale, $d_totali).'
</td>
</tr>';

View File

@ -23,6 +23,9 @@ use Modules\Fatture\Fattura;
$documento = Fattura::find($id_record);
$banca = $documento->getBanca();
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
// Lettura info fattura
$record = $dbo->fetchOne('SELECT *,

View File

@ -21,6 +21,10 @@ use Carbon\Carbon;
include_once __DIR__.'/../../core.php';
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
/*
Dati intervento
*/
@ -147,6 +151,25 @@ echo '
$righe = $documento->getRighe();
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
$riferimenti = [];
$id_rif = [];
foreach ($righe as $riga) {
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
if (!empty($riferimento)) {
if (!array_key_exists($riferimento, $riferimenti)) {
$riferimenti[$riferimento] = [];
}
if (!in_array($riga->id, $riferimenti[$riferimento])) {
$id_rif[] = $riga->id;
$riferimenti[$riferimento][] = $riga->id;
}
}
}
}
if (!$righe->isEmpty()) {
echo '
<table class="table table-bordered">
@ -183,36 +206,60 @@ if (!$righe->isEmpty()) {
if ($riga->um == 'ore') {
$qta = Translator::numberToHours($riga->qta);
} else {
$qta = Translator::numberToLocale($riga->qta, 'qta');
$qta = Translator::numberToLocale($riga->qta, $d_qta);
}
} else {
$qta = Translator::numberToLocale($riga->qta, 'qta');
$qta = Translator::numberToLocale($riga->qta, $d_qta);
}
// Articolo
echo '
<tr>
<td>
'.nl2br(strip_tags($riga->descrizione));
<tr>
<td>';
$text = '';
foreach ($riferimenti as $key => $riferimento) {
if (in_array($riga->id, $riferimento)) {
if ($riga->id === $riferimento[0]) {
$riga_ordine = $riga->getOriginalComponent()->getDocument();
$text = '<b>'.$key.'</b><br>';
if ($options['pricing']) {
$text = $text.'</td><td></td><td>';
}
$text = $text.'</td><td></td></tr><tr><td>';
echo nl2br($text);
}
}
$riga['descrizione'] = str_replace('Rif. '.strtolower($key), '', $riga['descrizione']);
}
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
echo $riga['descrizione'];
} else {
echo nl2br($riga['descrizione']);
}
if ($riga->isArticolo()) {
// Codice articolo
$text = tr('COD. _COD_', [
'_COD_' => $riga->codice,
]);
echo '
<br><small>'.$text.'</small>';
echo nl2br('<br><small>'.$riga->codice.'</small>');
}
if ($riga->isArticolo()) {
// Seriali
$seriali = $riga->serials;
if (!empty($seriali)) {
$text = tr('SN').': '.implode(', ', $seriali);
echo '
<br><small>'.$text.'</small>';
<small>'.$text.'</small>';
$autofill->count($text, true);
}
}
echo '
</td>';
</td>';
// Quantità
echo '
@ -223,7 +270,7 @@ if (!$righe->isEmpty()) {
// Prezzo unitario
echo '
<td class="text-center">
'.($options['pricing'] ? moneyFormat($riga->prezzo_unitario_corrente) : '-');
'.($options['pricing'] ? moneyFormat($riga->prezzo_unitario_corrente, $d_importi) : '-');
if ($options['pricing'] && $riga->sconto > 0) {
$text = discountInfo($riga, false);
@ -238,7 +285,7 @@ if (!$righe->isEmpty()) {
// Prezzo totale
echo '
<td class="text-center">
'.($options['pricing'] ? Translator::numberToLocale($riga->importo) : '-').'
'.($options['pricing'] ? Translator::numberToLocale($riga->importo, $d_importi) : '-').'
</td>
</tr>';
}
@ -255,7 +302,7 @@ if (!$righe->isEmpty()) {
</td>
<th class="text-center">
<b>'.moneyFormat($righe->sum('importo'), 2).'</b>
<b>'.moneyFormat($righe->sum('importo'), $d_totali).'</b>
</th>
</tr>';
}
@ -335,7 +382,7 @@ foreach ($sessioni as $i => $sessione) {
if (setting('Formato ore in stampa') == 'Sessantesimi') {
$ore_totali = Translator::numberToHours($documento->ore_totali);
} else {
$ore_totali = Translator::numberToLocale($documento->ore_totali, 2);
$ore_totali = Translator::numberToLocale($documento->ore_totali, $d_totali);
}
echo '
@ -348,7 +395,7 @@ echo '
if ($options['pricing']) {
echo '
<td colspan="3" class="text-center">
<small>'.tr('Totale manodopera').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_manodopera'), 2).'</b>
<small>'.tr('Totale manodopera').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_manodopera'), $d_totali).'</b>
</td>';
} else {
echo '
@ -376,14 +423,14 @@ echo '
echo '
<tr>
<td class="text-center">
<small>'.tr('Km percorsi').':</small><br/><b>'.Translator::numberToLocale($documento->km_totali, 2).'</b>
<small>'.tr('Km percorsi').':</small><br/><b>'.Translator::numberToLocale($documento->km_totali, $d_qta).'</b>
</td>';
// Costo trasferta
if ($options['pricing']) {
echo '
<td class="text-center">
<small>'.tr('Costi di trasferta').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_viaggio'), 2).'</b>
<small>'.tr('Costi di trasferta').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_viaggio'), $d_totali).'</b>
</td>';
} else {
echo '
@ -394,7 +441,7 @@ if ($options['pricing']) {
if ($options['pricing']) {
echo '
<td class="text-center" colspan="2" width="120px" >
<small>'.tr('Diritto di chiamata').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_diritto_chiamata'), 2).'</b>
<small>'.tr('Diritto di chiamata').':</small><br/><b>'.moneyFormat($sessioni->sum('prezzo_diritto_chiamata'), $d_totali).'</b>
</td>';
} else {
echo '
@ -421,7 +468,7 @@ if ($options['pricing']) {
</td>
<th class="text-center">
'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'
'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'
</th>
</tr>';
@ -434,7 +481,7 @@ if ($options['pricing']) {
</td>
<th class="text-center">
<b>'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, $d_totali).'</b>
</th>
</tr>';
@ -446,7 +493,7 @@ if ($options['pricing']) {
</td>
<th class="text-center">
<b>'.moneyFormat($totale_imponibile, 2).'</b>
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
</th>
</tr>';
}
@ -460,7 +507,7 @@ if ($options['pricing']) {
</td>
<th class="text-center">
<b>'.moneyFormat($totale_iva, 2).'</b>
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
</th>
</tr>';
@ -471,7 +518,7 @@ if ($options['pricing']) {
<b>'.tr('Totale intervento', [], ['upper' => true]).':</b>
</td>
<th class="text-center">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale, $d_totali).'</b>
</th>
</tr>';
}

View File

@ -24,6 +24,25 @@ $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
// Righe documento
$righe = $documento->getRighe();
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
$riferimenti = [];
$id_rif = [];
foreach ($righe as $riga) {
$riferimento = ($riga->getOriginalComponent() ? $riga->getOriginalComponent()->getDocument()->getReference() : null);
if (!empty($riferimento)) {
if (!array_key_exists($riferimento, $riferimenti)) {
$riferimenti[$riferimento] = [];
}
if (!in_array($riga->id, $riferimenti[$riferimento])) {
$id_rif[] = $riga->id;
$riferimenti[$riferimento][] = $riga->id;
}
}
}
}
$columns = 7;
$has_image = $righe->search(function ($item) {
@ -54,12 +73,6 @@ echo "
<tr>
<th class='text-center' style='width:4%'>".tr('#', [], ['upper' => true]).'</th>';
if ($documento->direzione == 'uscita') {
echo "
<th class='text-center' style='width:11%'>".tr('Codice', [], ['upper' => true])."</th>
<th class='text-center' style='width:11%'>".tr('Codice fornitore', [], ['upper' => true]).'</th>';
}
if ($has_image) {
echo "
<th class='text-center' style='width:20%'>".tr('Immagine', [], ['upper' => true]).'</th>';
@ -67,6 +80,14 @@ echo "
echo "
<th class='text-center'>".tr('Descrizione', [], ['upper' => true])."</th>
";
if ($documento->direzione == 'uscita') {
echo "
<th class='text-center' style='width:11%'>".tr('Codice', [], ['upper' => true])."</th>
<th class='text-center' style='width:11%'>".tr('Codice fornitore', [], ['upper' => true]).'</th>';
}
echo"
<th class='text-center' style='width:9%'>".tr('Q.tà', [], ['upper' => true]).'</th>';
if ($options['pricing']) {
@ -92,24 +113,73 @@ foreach ($righe as $riga) {
echo '
<tr>
<td class="text-center" style="vertical-align: middle">
'.$num.'
</td>';
<td class="text-center" style="vertical-align: middle">';
if ($has_image) {
if ($riga->isArticolo() && !empty($riga->articolo->image)) {
echo '
<td align="center">
<img src="'.$riga->articolo->image.'" style="max-height: 80px; max-width:120px">
</td>';
$text = '';
$autofill->set(5);
} else {
echo '
<td></td>';
foreach ($riferimenti as $key => $riferimento) {
if (in_array($riga->id, $riferimento)) {
if ($riga->id === $riferimento[0]) {
$riga_ordine = $database->fetchOne('SELECT numero_cliente, data_cliente FROM or_ordini WHERE id = '.prepare($riga->idordine));
if (!empty($riga_ordine['numero_cliente']) && !empty($riga_ordine['data_cliente'])) {
$text = $text.'<b>Ordine n. '.$riga_ordine['numero_cliente'].' del '.Translator::dateToLocale($riga_ordine['data_cliente']).'</b><br>';
}
$r['descrizione'] = str_replace('Rif. '.strtolower($key), '', $r['descrizione']);
preg_match("/Rif\.(.*)/s", $r['descrizione'], $rif2);
$r['descrizione'] = str_replace('Rif.'.strtolower($rif2[1]), '', $r['descrizione']);
if (!empty($rif2)) {
$text .= '<b>'.$rif2[0].'</b>';
}
$text .= '<b>'.$key.'</b></td>';
if ($options['pricing']) {
$text .= '
<td></td>
<td></td>
<td></td>';
}
$text .= '<td></td><td></td></tr><tr><td class="text-center" nowrap="nowrap" style="vertical-align: middle">';
echo '
</td>';
if ($has_image) {
echo '
<td></td>';
}
echo'
<td>
'.nl2br($text);
}
}
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
$autofill->count($r['descrizione']);
}
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
echo $num.'</td>';
if ($has_image) {
if ($riga->isArticolo() && !empty($riga->articolo->image)) {
echo '
<td align="center">
<img src="'.$riga->articolo->image.'" style="max-height: 80px; max-width:120px">
</td>';
} else {
echo '
<td></td>';
}
}
echo'
<td>'.$r['descrizione'];
} else {
echo $num.'
</td>
<td>'.nl2br($r['descrizione']);
}
if ($documento->direzione == 'uscita') {
echo '
<td class="text-center" style="vertical-align: middle">
@ -120,10 +190,6 @@ foreach ($righe as $riga) {
</td>';
}
echo '
<td>
'.nl2br($r['descrizione']);
if ($riga->isArticolo()) {
if ($documento->direzione == 'entrata' && !$options['hide-item-number']) {
// Codice articolo
@ -161,14 +227,14 @@ foreach ($righe as $riga) {
echo '
<td class="text-center">
'.Translator::numberToLocale(abs($qta), 'qta').' '.$um.'
'.Translator::numberToLocale(abs($qta), $d_qta).' '.$um.'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
if ($riga->sconto > 0) {
$text = discountInfo($riga, false);
@ -185,13 +251,13 @@ foreach ($righe as $riga) {
// Imponibile
echo '
<td class="text-right">
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).'
'.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile, $d_importi).'
</td>';
// Iva
echo '
<td class="text-center">
'.Translator::numberToLocale($riga->aliquota->percentuale, 0).'
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
</td>';
}
@ -246,7 +312,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
</th>
</tr>';
@ -259,7 +325,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, $d_totali).'</b>
</th>
</tr>';
@ -271,7 +337,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_imponibile, 2).'</b>
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
</th>
</tr>';
}
@ -284,7 +350,7 @@ if ($options['pricing']) {
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale_iva, 2).'</b>
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
</th>
</tr>';
@ -295,7 +361,7 @@ if ($options['pricing']) {
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale, $d_totali).'</b>
</th>
</tr>';
@ -307,7 +373,7 @@ if ($options['pricing']) {
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($sconto_finale, 2).'</b>
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
</th>
</tr>';
@ -318,7 +384,7 @@ if ($options['pricing']) {
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-right">
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
</th>
</tr>';
}

View File

@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
use Modules\Ordini\Ordine;
$documento = Ordine::find($id_record);
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$id_cliente = $documento['idanagrafica'];

View File

@ -35,7 +35,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Totale consuntivo (no iva)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($somma_totale_imponibile).'</b>
<b>'.moneyFormat($somma_totale_imponibile, $d_totali).'</b>
</th>
</tr>';
@ -46,7 +46,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Budget (no IVA)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($budget).'</b>
<b>'.moneyFormat($budget, $d_totali).'</b>
</th>
</tr>';
@ -57,7 +57,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Rapporto budget/spesa (no IVA)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($rapporto).'</b>
<b>'.moneyFormat($rapporto, $d_totali).'</b>
</th>
</tr>';

View File

@ -23,6 +23,9 @@ use Modules\Ordini\Ordine;
$documento = Ordine::find($id_record);
$records = $documento->interventi;
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$id_cliente = $documento['idanagrafica'];
$id_sede = $documento['idsede'];

View File

@ -257,14 +257,14 @@ foreach ($righe as $key => $riga) {
if (!$riga->isDescrizione()) {
echo '
<td class="text-center" style="vertical-align: middle" >
'.Translator::numberToLocale(abs($riga->qta), 'qta').' '.$r['um'].'
'.Translator::numberToLocale(abs($riga->qta), $d_qta).' '.$r['um'].'
</td>';
if ($options['pricing']) {
// Prezzo unitario
echo '
<td class="text-right" style="vertical-align: middle">
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario);
'.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario, $d_importi);
if ($riga->sconto != 0) {
$text = discountInfo($riga, false);
@ -281,14 +281,14 @@ foreach ($righe as $key => $riga) {
// Iva
echo '
<td class="text-center" style="vertical-align: middle">
'.Translator::numberToLocale($riga->aliquota->percentuale, 2).'
'.Translator::numberToLocale($riga->aliquota->percentuale, $d_qta).'
</td>';
}
// Imponibile
echo '
<td class="text-right" style="vertical-align: middle" >
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile)).'
</td>';
<td class="text-right" style="vertical-align: middle" >
'.(($options['hide-total'] || $prezzi_ivati) ? moneyFormat($riga->totale, $d_importi) : moneyFormat($riga->totale_imponibile, $d_importi)).'
</td>';
}
} else {
echo '
@ -319,7 +319,7 @@ foreach ($righe as $key => $riga) {
<b>'.tr('Subtotale', [], ['upper' => true]).':</b>
</td>
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
'.moneyFormat($subtotale_gruppo, 2).'
'.moneyFormat($subtotale_gruppo, $d_totali).'
</td>
</tr>';
if (!$options['no-iva']) {
@ -329,7 +329,7 @@ foreach ($righe as $key => $riga) {
<b>'.tr('Iva', [], ['upper' => true]).':</b>
</td>
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
'.moneyFormat($iva_gruppo, 2).'
'.moneyFormat($iva_gruppo, $d_totali).'
</td>
</tr>
<tr>
@ -337,7 +337,7 @@ foreach ($righe as $key => $riga) {
<b>'.tr('Subtotale ivato', [], ['upper' => true]).':</b>
</td>
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($subtotale_gruppo + $iva_gruppo, 2).'</b>
<b>'.moneyFormat($subtotale_gruppo + $iva_gruppo, $d_totali).'</b>
</td>
</tr>';
}
@ -372,7 +372,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? ($options['no-iva'] ? 1 : 2) : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, 2).'</b>
<b>'.moneyFormat($show_sconto ? $imponibile : $totale_imponibile, $d_totali).'</b>
</th>
</tr>';
@ -385,7 +385,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($sconto, 2).'</b>
<b>'.moneyFormat($sconto, $d_totali).'</b>
</th>
</tr>';
@ -397,7 +397,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($totale_imponibile, 2).'</b>
<b>'.moneyFormat($totale_imponibile, $d_totali).'</b>
</th>
</tr>';
}
@ -411,7 +411,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($totale_iva, 2).'</b>
<b>'.moneyFormat($totale_iva, $d_totali).'</b>
</th>
</tr>';
@ -422,7 +422,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
<b>'.tr('Totale documento', [], ['upper' => true]).':</b>
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($totale, 2).'</b>
<b>'.moneyFormat($totale, $d_totali).'</b>
</th>
</tr>';
@ -434,7 +434,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
<b>'.tr('Sconto in fattura', [], ['upper' => true]).':</b>
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($sconto_finale, 2).'</b>
<b>'.moneyFormat($sconto_finale, $d_totali).'</b>
</th>
</tr>';
@ -445,7 +445,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
</td>
<th colspan="'.($options['show-only-total'] ? (($has_image) ? 2 : 1) : (($has_image) ? 3 : 2)).'" class="text-right">
<b>'.moneyFormat($netto_a_pagare, 2).'</b>
<b>'.moneyFormat($netto_a_pagare, $d_totali).'</b>
</th>
</tr>';
}

View File

@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
use Modules\Preventivi\Preventivo;
$documento = Preventivo::find($id_record);
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$id_cliente = $documento['idanagrafica'];

View File

@ -23,6 +23,10 @@ $budget = get_imponibile_preventivo($id_record);
$somma_totale_imponibile = get_totale_interventi_preventivo($id_record);
$rapporto = floatval($budget) - floatval($somma_totale_imponibile) - $documento->provvigione;
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_totali = (int) setting('Cifre decimali per importi in stampa');
$d_totali = (int) setting('Cifre decimali per totali in stampa');
if ($pricing && empty($options['dir'])) {
// Totale imponibile
echo '
@ -35,7 +39,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Totale consuntivo (no iva)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($somma_totale_imponibile).'</b>
<b>'.moneyFormat($somma_totale_imponibile, $d_totali).'</b>
</th>
</tr>';
@ -46,7 +50,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Budget (no IVA)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($budget).'</b>
<b>'.moneyFormat($budget, $d_totali).'</b>
</th>
</tr>';
@ -57,7 +61,7 @@ if ($pricing && empty($options['dir'])) {
<b>'.tr('Rapporto budget/spesa (no IVA)', [], ['upper' => true]).':</b>
</td>
<th colspan="2" class="text-center">
<b>'.moneyFormat($rapporto).'</b>
<b>'.moneyFormat($rapporto, $d_totali).'</b>
</th>
</tr>';

View File

@ -19,6 +19,8 @@
include_once __DIR__.'/../../core.php';
$d_totali = (int) setting('Cifre decimali per totali in stampa');
$somma_ore = sum($somma_ore);
$somma_imponibile = sum($somma_imponibile);
$somma_sconto = sum($somma_sconto);
@ -30,7 +32,7 @@ $somma_km = sum($somma_km);
if (setting('Formato ore in stampa') == 'Sessantesimi') {
$somma_ore = Translator::numberToHours($somma_ore);
} else {
$somma_ore = Translator::numberToLocale($somma_ore, 2);
$somma_ore = Translator::numberToLocale($somma_ore, $d_qta);
}
echo '
@ -38,16 +40,12 @@ echo '
<th width="5%" style="border-right: 0"></th>
<th class="text-right" style="border-left: 0;">
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</th>';
if (get('id_print') != 24) {
echo '
<th class="text-center">'.($somma_km).'</td>';
}
echo '
</th>
<th class="text-center">'.($somma_km).'</td>
<th class="text-center">'.($pricing ? $somma_ore : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_imponibile, 2) : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_sconto, 2) : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_imponibile, 2) : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_imponibile, $d_totali) : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_sconto, $d_totali) : '-').'</th>
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_imponibile, $d_totali) : '-').'</th>
</tr>
<tr>
@ -55,8 +53,8 @@ echo '
<th class="text-right" style="border-left: 0;">
<b>'.tr('Iva', [], ['upper' => true]).':</b>
</th>
<th colspan="'.(get('id_print') != 24 ? 4 : 3).'"></th>
<th class="text-center">'.($pricing ? moneyFormat($somma_iva, 2) : '-').'</th>
<th colspan="4"></th>
<th class="text-center">'.($pricing ? moneyFormat($somma_iva, $d_totali) : '-').'</th>
</tr>
<tr>
@ -64,8 +62,8 @@ echo '
<th class="text-right" style="border-left: 0;">
<b>'.tr('Totale Ivato', [], ['upper' => true]).':</b>
</th>
<th colspan="'.(get('id_print') != 24 ? 4 : 3).'"></th>
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_ivato, 2) : '-').'</th>
<th colspan="4"></th>
<th class="text-center">'.($pricing ? moneyFormat($somma_totale_ivato, $d_totali) : '-').'</th>
</tr>
</tbody>
</table>';

View File

@ -22,6 +22,9 @@ include_once __DIR__.'/../../core.php';
use Modules\Interventi\Intervento;
use Modules\Iva\Aliquota;
$d_qta = (int) setting('Cifre decimali per quantità in stampa');
$d_importi = (int) setting('Cifre decimali per importi in stampa');
$intervento = Intervento::find($record['id']);
$sessioni = $intervento->sessioni;
$iva_predefinita = floatval(Aliquota::find(setting('Iva predefinita'))->percentuale);
@ -74,19 +77,15 @@ echo '
if (setting('Formato ore in stampa') == 'Sessantesimi') {
$ore = Translator::numberToHours($ore);
} else {
$ore = Translator::numberToLocale($ore, 2);
}
echo '
</td>';
if (get('id_print') != 24) {
echo '
<td class="text-center">'.($km).'</td>';
$ore = Translator::numberToLocale($ore, $d_qta);
}
echo '
</td>
<td class="text-center">'.($pricing ? $km : '-').'</td>
<td class="text-center">'.($pricing ? $ore : '-').'</td>
<td class="text-center">'.($pricing ? moneyFormat($imponibile, 2) : '-').'</td>
<td class="text-center">'.($pricing && empty($options['dir']) ? moneyFormat($sconto, 2) : '-').'</td>
<td class="text-center">'.($pricing ? moneyFormat($totale_imponibile, 2) : '-').'</td>
<td class="text-center">'.($pricing ? moneyFormat($imponibile, $d_importi) : '-').'</td>
<td class="text-center">'.($pricing && empty($options['dir']) ? moneyFormat($sconto, $d_importi) : '-').'</td>
<td class="text-center">'.($pricing ? moneyFormat($totale_imponibile, $d_importi) : '-').'</td>
</tr>';
// Sessioni
@ -133,8 +132,8 @@ if (!$righe->isEmpty()) {
<td style="border-top: 0; border-bottom: 0;"></td>
<td colspan="'.(get('id_print') != 24 ? 3 : 2).'"><small>'.$riga->descrizione.'</small></td>
<td class="text-center"><small>'.$riga->qta.' '.$riga->um.'</small></td>
<td class="text-center"><small>'.($pricing ? moneyFormat($prezzo) : '-').'</small></td>
<td class="text-center"><small>'.($pricing ? moneyFormat($totale) : '-').'</small></td>
<td class="text-center"><small>'.($pricing ? moneyFormat($prezzo, $d_importi) : '-').'</small></td>
<td class="text-center"><small>'.($pricing ? moneyFormat($totale, $d_importi) : '-').'</small></td>
</tr>';
}
}

View File

@ -675,8 +675,8 @@ ALTER TABLE `or_righe_ordini` CHANGE `sconto_unitario` `sconto_unitario` decimal
ALTER TABLE `or_righe_ordini` CHANGE `qta` `qta` decimal(12, 6) NOT NULL;
ALTER TABLE `or_righe_ordini` CHANGE `qta_evasa` `qta_evasa` decimal(12, 6) NOT NULL;
UPDATE `zz_settings` SET `tipo` = 'list[1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per importi';
UPDATE `zz_settings` SET `tipo` = 'list[1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per quantità';
UPDATE `zz_settings` SET `tipo` = 'list[2,3,4,5]' WHERE `nome` = 'Cifre decimali per importi';
UPDATE `zz_settings` SET `tipo` = 'list[0,1,2,3,4,5]' WHERE `nome` = 'Cifre decimali per quantità';
-- Aggiunta percentuale combinata in listini
ALTER TABLE `mg_listini` ADD `prc_combinato` VARCHAR(255);

View File

@ -90,4 +90,17 @@ INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`
(NULL, 'Stampa giacenza', 'print', (SELECT `id` FROM `zz_modules` WHERE name='Automezzi'), 'controller_top', 'col-md-4', '', '#45a9f1', 'fa fa-truck', '', 'if( confirm(\'Stampare la giacenza attuale sugli automezzi?\') ){ window.open(\'pdfgen.php?id_print=53&search_targa=\'+$(\'#th_Targa input\').val()+\'&search_nome=\'+$(\'#th_Nome input\').val()); }', 'javascript', '', 'Stampa giacenza', '1', '1', NULL);
-- Aggiunta flag rappresentante fiscale per sede
ALTER TABLE `an_sedi` ADD `is_rappresentante_fiscale` BOOLEAN NULL DEFAULT FALSE;
ALTER TABLE `an_sedi` ADD `is_rappresentante_fiscale` BOOLEAN NULL DEFAULT FALSE;
-- Aggiunte impostazioni per definire il numero di decimali in stampa
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per importi in stampa", '2', 'list[0,1,2,3,4,5]', 1, 'Generali', '35', 'Definisce il numero di decimali per gli importi nei template di stampa');
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per quantità in stampa", '0', 'list[0,1,2,3,4,5]', 1, 'Generali', '36', 'Definisce il numero di decimali per le quantità nei template di stampa');
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ("Cifre decimali per totali in stampa", '2', 'list[0,1,2]', 1, 'Generali', '37', 'Definisce il numero di decimali per i totali nei template di stampa');
-- Fix per vista modulo campi personalizzati
UPDATE `zz_modules` SET `options` = 'SELECT\r\n |select|\r\nFROM\r\n `zz_fields`\r\n LEFT JOIN `zz_modules` ON `zz_modules`.`id` = `zz_fields`.`id_module`\r\n LEFT JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_fields`.`id_plugin`\r\nWHERE\r\n 1=1\r\nHAVING\r\n 2=2' WHERE `zz_modules`.`name` = 'Campi personalizzati';
UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF(emails IS NOT NULL, \'fa fa-envelope text-success\', \'\')' WHERE `zz_modules`.`name` = 'Fatture di vendita' AND `zz_views`.`name` = 'icon_Inviata';
-- Miglioria query modulo interventi
UPDATE `zz_modules` SET `options` = 'SELECT\r\n |select|\r\nFROM\r\n `in_interventi`\r\n LEFT JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_intervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `idintervento`, SUM(`prezzo_unitario`*`qta`-`sconto`) AS `ricavo_righe`, SUM(`costo_unitario`*`qta`) AS `costo_righe` FROM `in_righe_interventi` GROUP BY `idintervento`) AS `righe` ON `righe`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento`\r\n LEFT JOIN `an_referenti` ON `in_interventi`.`idreferente` = `an_referenti`.`id`\r\n LEFT JOIN (SELECT `an_sedi`.`id`, CONCAT(`an_sedi`.`nomesede`, \'<br />\',IF(`an_sedi`.`telefono`!=\'\',CONCAT(`an_sedi`.`telefono`,\'<br />\'),\'\'),IF(`an_sedi`.`cellulare`!=\'\',CONCAT(`an_sedi`.`cellulare`,\'<br />\'),\'\'),`an_sedi`.`citta`,IF(`an_sedi`.`indirizzo`!=\'\',CONCAT(\' - \',`an_sedi`.`indirizzo`),\'\')) AS `info` FROM `an_sedi`) AS `sede_destinazione` ON `sede_destinazione`.`id` = `in_interventi`.`idsede_destinazione`\r\n LEFT JOIN (SELECT GROUP_CONCAT(DISTINCT `co_documenti`.`numero_esterno` SEPARATOR \', \') AS `info`, `co_righe_documenti`.`original_document_id` AS `idintervento` FROM `co_documenti` INNER JOIN `co_righe_documenti` ON `co_documenti`.`id` = `co_righe_documenti`.`iddocumento` WHERE `original_document_type` = \'Modules\\\\Interventi\\\\Intervento\' GROUP BY `idintervento`, `original_document_id`) AS `fattura` ON `fattura`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `in_interventi_tecnici_assegnati`.`id_intervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS `nomi` FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_tecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `id_intervento`) AS `tecnici_assegnati` ON `in_interventi`.`id` = `tecnici_assegnati`.`id_intervento`\r\n LEFT JOIN (SELECT `in_interventi_tecnici`.`idintervento`, GROUP_CONCAT( DISTINCT `ragione_sociale` SEPARATOR \', \') AS `nomi` FROM `an_anagrafiche` INNER JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` GROUP BY `idintervento`) AS `tecnici` ON `in_interventi`.`id` = `tecnici`.`idintervento`\r\n LEFT JOIN (SELECT COUNT(id) as emails, em_emails.id_record FROM em_emails INNER JOIN zz_operations ON zz_operations.id_email = em_emails.id WHERE id_module IN(SELECT id FROM zz_modules WHERE name = \'Interventi\') AND `zz_operations`.`op` = \'send-email\' GROUP BY em_emails.id_record) AS `email` ON `email`.`id_record` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT GROUP_CONCAT(CONCAT(`matricola`, IF(`nome` != \'\', CONCAT(\' - \', `nome`), \'\')) SEPARATOR \'<br />\') AS `descrizione`, `my_impianti_interventi`.`idintervento` FROM `my_impianti` INNER JOIN `my_impianti_interventi` ON `my_impianti`.`id` = `my_impianti_interventi`.`idimpianto` GROUP BY `my_impianti_interventi`.`idintervento`) AS `impianti` ON `impianti`.`idintervento` = `in_interventi`.`id`\r\n LEFT JOIN (SELECT `co_contratti`.`id`, CONCAT(`co_contratti`.`numero`, \' del \', DATE_FORMAT(`data_bozza`, \'%d/%m/%Y\')) AS `info` FROM `co_contratti`) AS `contratto` ON `contratto`.`id` = `in_interventi`.`id_contratto`\r\n LEFT JOIN (SELECT `co_preventivi`.`id`, CONCAT(`co_preventivi`.`numero`, \' del \', DATE_FORMAT(`data_bozza`, \'%d/%m/%Y\')) AS `info` FROM `co_preventivi`) AS `preventivo` ON `preventivo`.`id` = `in_interventi`.`id_preventivo`\r\n LEFT JOIN (SELECT `or_ordini`.`id`, CONCAT(`or_ordini`.`numero`, \' del \', DATE_FORMAT(`data`, \'%d/%m/%Y\')) AS `info` FROM `or_ordini`) AS `ordine` ON `ordine`.`id` = `in_interventi`.`id_ordine`\r\n LEFT JOIN `in_tipiintervento` ON `in_interventi`.`idtipointervento` = `in_tipiintervento`.`idtipointervento`\r\nLEFT JOIN( SELECT zz_files.* FROM zz_files INNER JOIN zz_modules ON zz_files.id_module = zz_modules.id WHERE zz_modules.name = \'Interventi\' ) AS zz_files ON zz_files.id_record = in_interventi.id\r\nWHERE \r\n 1=1 |segment(`in_interventi`.`id_segment`)| |date_period(`orario_inizio`,`data_richiesta`)|\r\nGROUP BY \r\n `in_interventi`.`id`\r\nHAVING \r\n 2=2\r\nORDER BY \r\n IFNULL(`orario_fine`, `data_richiesta`) DESC ' WHERE `zz_modules`.`name` = 'Interventi';

1
update/2_4_53.php Normal file
View File

@ -0,0 +1 @@
UPDATE `zz_settings` SET `zz_settings`.`nome` = 'Visualizza riferimento su ogni riga in stampa', `help` = 'Se disabilitato, raggruppa il riferimento ai documenti collegati in un\'unica riga, se abilitato riporta i riferimenti ai documenti in ogni riga.' WHERE `zz_settings`.`nome` = "Riferimento dei documenti nelle stampe";

2
update/2_4_53.sql Normal file
View File

@ -0,0 +1,2 @@
-- Correzioni Automezzi
UPDATE `zz_views` SET `query` = 'IFNULL(an_sedi.nome,an_sedi.nomesede)', `order` = '1' WHERE `zz_views`.`name` = 'Nome' AND `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Automezzi');

View File

@ -15,6 +15,7 @@ return [
'an_tipianagrafiche_anagrafiche',
'an_zone',
'an_pagamenti_anagrafiche',
'an_sedi_tecnici',
'co_banche',
'co_contratti',
'co_dichiarazioni_intento',