diff --git a/.gitignore b/.gitignore index 4f9e9cea7..3641ae77a 100755 --- a/.gitignore +++ b/.gitignore @@ -79,9 +79,9 @@ backup/* custom/ files/* !files/.htaccess -!files/my_impianti/ -files/my_impianti/* -!files/my_impianti/componente.ini +!files/impianti/ +files/impianti/* +!files/impianti/componente.ini tmp/ config.inc.php database.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index b316c1fde..781487eb0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +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.18 ()](#2418-) +- [2.4.17.1 (2020-09-18)](#24171-2020-09-18) - [2.4.17 (2020-08-24)](#2417-2020-08-24) - [2.4.16 (2020-07-28)](#2416-2020-07-28) - [2.4.15 (2020-05-01)](#2415-2020-05-01) @@ -27,6 +29,63 @@ 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.18 () + +### Aggiunto (Added) + - Sidebar per la gestione grafica dei Plugin all'interno dei record per i Moduli + - Sistema di cron di base per la gestione di operazioni ricorrenti (`cron.php`) + - Avviso su conflitti di occupazione per i Tecnici in **Attività** + - Plugin *Dettagli* per il modulo **Articoli**, finalizzato alla gestione dei prezzi di acquisto e vendita per *Anagrafica* e *Quantità* del Documento + - Modulo **Giacenze sedi** per visualizzare le giacenze in specifiche *Sedi* dell'*Anagrafica* Azienda + - Sistema di controllo sull'integrità strutturale del database, per utilizzo da parte di tecnici dedicati + - Numerazione righe nella stampa **Ordini** + - Azione di gruppo sul modulo **Anagrafiche** per calcolare la posizione geografica sulla base della Sede legale (richiede Google Maps abilitato) + - *Copyright notice* su tutti i file del progetto + - Possibilità di indicare lo stato alla creazione dei Documenti nella procedura di importazione + - Traduzione di base per il Tedesco (Germania) + - Supporto interno all'importazione verso **Preventivi** e **Contratti** + +### Modificato (Changed) + - Integrazione completa del nuovo sistema per la gestione delle impostazioni dei select (`select-options`) + - Miglioramento della grafica di integrazione con Google Maps per **Attività** e **Anagrafiche** + - Miglioramento del sistema di importazione FE in relazione alla gestione dei riferimenti a **Ordini** e **DDT**, con introduzione di una ricerca di base per l'autocompletamento + - Caricamento AJAX delle righe dei Documenti + - Introduzione numero rata in Rate contrattuali + - Visualizzazione completa delle date di lavorazione nella stampa delle **Attività** (#828) + - Modifica sovrapposizione eventi in **Dashboard** + - Modifica della gestione JS dei campi numerici, ora basata sulla libreria [AutoNumeric](http://autonumeric.org/) + - Modifica del sistema di riferimenti tra Documenti per includere il codice relativo nella Descrizione delle righe relative (con deprecazione dell'Impostazione "Riferimento dei documenti nelle stampe") { + - Modifica del sistema di riferimenti tra Documenti per includere il codice relativo nella *Descrizione* delle righe relative (con deprecazione dell'*Impostazione* "Riferimento dei documenti nelle stampe") + - Miglioramento elenco *Promemoria* in **Dashboard**, per visualizzare il *Tecnico* relativo + +### Fixed + - Correzione del numero delle righe sui Documenti a seguito di un riordinamento + - Fix segno marca da bollo su *Nota di credito* + - Fix selezione data sbagliata per vista mensile in Dashboard + - Fix per aggiornamento indicato negli Hook anche a seguito del completamento + - Correzione per l'eliminazione delle *Sedi* + - Fix problema delle statistiche in **Stato dei servizi** + - Fix visualizzazione sconto ivato sulla base dell'utilizzo dei Prezzi ivati + - Fix visibilità per i checkbox standard del browser + - Fix creazione di articoli duplicati da importazione FE (#870) + - Correzioni per l'impostazione di *Categoria* e *Sottocategoria* dalla procedura di importazione CSV **Articoli** + - Fix link interno al plugin *Impianti del cliente* + - Correzioni sulla procedura di duplicazione **Attività** + +## 2.4.17.1 (2020-09-18) + +### Fixed + - Fix query aggiornamento data movimento per registrazioni in **Prima Nota** + - Fix apretura pop-up di inserimento / modifica righe nelle varie schermate + - Fix per idconto righe fattura da fatturazione in bulk + - Fix calcolo quantità impegnata + - Fix nome funzione duplicata durante aggiornamento 2.4.17 + - Fix Api per recupero delle sessioni di lavoro delle Attività in funzione dei mesi i mesi definiti nello storico + - Fix allegati **Impianti** non trovati + - Fix creazione / modifica componenti e componenti **Impianti** non trovati + - Fix su calcolo movimenti in caso di insoluto + - Fix raggruppamento movimenti composti + ## 2.4.17 (2020-08-24) ### Aggiunto (Added) @@ -55,7 +114,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k ### Fixed - Fix della duplicazione di Fattura, che in alcuni casi non rimuoveva lo stato FE originale - Fix della procedura di duplicazione di gruppo per le **Attività** - - Risoluzione bug nella modifica manuale della **Prima Note** risalente a versioni <= 2.4.11 (#864) + - Risoluzione bug nella modifica manuale della **Prima Nota** risalente a versioni <= 2.4.11 (#864) - Fix dell'ordinamento per i conti primari del **Piano dei conti**, con correzione dei totali di riepilogo relativi - Correzione sui tooltip bloccati sui pulsanti disabilitati diff --git a/actions.php b/actions.php index b69535026..97534a6e2 100755 --- a/actions.php +++ b/actions.php @@ -30,7 +30,7 @@ if (empty($structure) || empty($structure['enabled'])) { die(tr('Accesso negato')); } -$upload_dir = DOCROOT.'/'.Uploads::getDirectory($id_module, $id_plugin); +$upload_dir = base_dir().'/'.Uploads::getDirectory($id_module, $id_plugin); $database->beginTransaction(); @@ -87,7 +87,7 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') { } } - redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : '')); + redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : '')); } } @@ -273,13 +273,13 @@ elseif (post('op') == 'send-email') { flash()->error(tr('Errore durante l\'invio email! Verifica i parametri dell\'account SMTP utilizzato.')); } } elseif (filter('op') == 'aggiorna_colonne') { - include_once DOCROOT.'/include/colonne.php'; + include_once base_dir().'/include/colonne.php'; } elseif (filter('op') == 'visualizza_riferimenti') { - include_once DOCROOT.'/include/riferimenti/riferimenti.php'; + include_once base_dir().'/include/riferimenti/riferimenti.php'; } elseif (filter('op') == 'visualizza_righe_riferimenti') { - include_once DOCROOT.'/include/riferimenti/righe_riferimenti.php'; + include_once base_dir().'/include/riferimenti/righe_riferimenti.php'; } elseif (filter('op') == 'visualizza_righe_documento') { - include_once DOCROOT.'/include/riferimenti/righe_documento.php'; + include_once base_dir().'/include/riferimenti/righe_documento.php'; } elseif (filter('op') == 'salva_riferimento_riga') { $database->insert('co_riferimenti_righe', [ 'source_type' => filter('source_type'), @@ -336,7 +336,7 @@ if ($structure->permission == 'rw') { $bulk = empty($bulk) ? [] : $bulk; if (in_array(post('op'), array_keys($bulk))) { - redirect(ROOTDIR.'/controller.php?id_module='.$id_module, 'js'); + redirect(base_path().'/controller.php?id_module='.$id_module, 'js'); } else { // Esecuzione delle operazioni del modulo include $structure->filepath('actions.php'); diff --git a/add.php b/add.php index 7535b9eb6..f634ba663 100755 --- a/add.php +++ b/add.php @@ -20,7 +20,7 @@ include_once __DIR__.'/core.php'; // Inclusione elementi fondamentali del modulo -include $docroot.'/actions.php'; +include base_dir().'/actions.php'; // Controllo dei permessi if (empty($id_plugin)) { diff --git a/ajax.php b/ajax.php index 02aeac754..c1384ccb4 100755 --- a/ajax.php +++ b/ajax.php @@ -72,7 +72,7 @@ switch (filter('op')) { break; case 'checklists': - include DOCROOT.'/plugins/checks.php'; + include base_dir().'/plugins/checks.php'; break; diff --git a/ajax_dataload.php b/ajax_dataload.php index 3d8a45e04..3753e2a00 100755 --- a/ajax_dataload.php +++ b/ajax_dataload.php @@ -22,11 +22,13 @@ include_once __DIR__.'/core.php'; use Util\Query; // Informazioni fondamentali -$columns = filter('columns'); -$order = filter('order')[0]; +$columns = (array) filter('columns'); +$order = filter('order') ? filter('order')[0] : []; $draw_numer = intval(filter('draw')); -$order['column'] = $order['column'] - 1; +if (!empty(filter('order'))) { + $order['column'] = $order['column'] - 1; +} array_shift($columns); $total = Util\Query::readQuery($structure); @@ -76,7 +78,7 @@ if (!empty($query)) { // Allineamento delle righe $align = []; - $row = $rows[0] ?: []; + $row = isset($rows[0]) ? $rows[0] : []; foreach ($row as $field => $value) { $value = trim($value); @@ -93,6 +95,13 @@ if (!empty($query)) { // Creazione della tabella foreach ($rows as $i => $r) { + // Evitare risultati con ID a null + // Codice non applicabile in ogni caso: sulla base dei permessi, ID può non essere impostato + /* + if (empty($r['id'])) { + continue; + }*/ + $result = [ 'id' => $r['id'], '', // Colonna ID @@ -157,7 +166,7 @@ if (!empty($query)) { $id_record = $r['id']; $hash = ''; - $id_module = $r['_link_module_'] ?: $id_module; + $id_module = !empty($r['_link_module_']) ? $r['_link_module_'] : $id_module; if (!empty($r['_link_record_'])) { $id_record = $r['_link_record_']; $hash = !empty($r['_link_hash_']) ? '#'.$r['_link_hash_'] : ''; @@ -166,11 +175,11 @@ if (!empty($query)) { // Link per i moduli if (empty($id_plugin)) { - $column['data-link'] = $rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; + $column['data-link'] = base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; } // Link per i plugin else { - $column['data-link'] = $rootdir.'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; + $column['data-link'] = base_path().'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; $column['data-type'] = 'dialog'; } @@ -182,8 +191,8 @@ if (!empty($query)) { $attributes[] = $key.'="'.$val.'"'; } - // Replace rootdir per le query - $value = str_replace('ROOTDIR', ROOTDIR, $value); + // Replace base_link() per le query + $value = str_replace('base_link()', base_path(), $value); $result[] = str_replace('|attr|', implode(' ', $attributes), '
'.$value.'
'); } diff --git a/ajax_select.php b/ajax_select.php index 166fc9e29..ea0f20a45 100755 --- a/ajax_select.php +++ b/ajax_select.php @@ -27,7 +27,7 @@ if (!isset($resource)) { // Opzioni di selezione sugli elementi $options = filter('options') ?: []; - $options_compatibility = $_SESSION['superselect'] ?: []; + $options_compatibility = session_get('superselect', []); $options = array_merge($options_compatibility, $options); // Preselezione su $elements dichiarato da file precedente diff --git a/assets/src/css/style.css b/assets/src/css/style.css index 58d55b08c..095e7f9e5 100755 --- a/assets/src/css/style.css +++ b/assets/src/css/style.css @@ -1041,6 +1041,10 @@ div.tip { background: #222222; } +.decimal-number { + text-align: right; +} + /* Loading specificato per un div */ .local-loader { position: relative; diff --git a/assets/src/js/functions/functions.js b/assets/src/js/functions/functions.js index b401d10c1..69178d27d 100755 --- a/assets/src/js/functions/functions.js +++ b/assets/src/js/functions/functions.js @@ -16,12 +16,21 @@ * along with this program. If not, see . */ -// Modal +/** + * Modal gestito da versioni precedenti. + * @param title + * @param href + * @param init_modal + */ function launch_modal(title, href, init_modal) { openModal(title, href); } -// Modal +/** + * Modal. + * @param title + * @param href + */ function openModal(title, href) { // Fix - Select2 does not function properly when I use it inside a Bootstrap modal. $.fn.modal.Constructor.prototype.enforceFocus = function () { @@ -73,6 +82,11 @@ function openModal(title, href) { } } +/** + * + * @param event + * @param link + */ function openLink(event, link) { if (event.ctrlKey) { window.open(link); @@ -103,7 +117,9 @@ function getUrlVars() { }); } -// Data e ora (orologio) +/** + * Data e ora (orologio) + */ function clock() { $('#datetime').html(moment().formatPHP(globals.timestamp_format)); setTimeout('clock()', 1000); @@ -143,33 +159,6 @@ function session_keep_alive() { $.get(globals.rootdir + '/core.php'); } -/** - * Funzione per gestire i contatori testuali nel formato x/total. - * Viene dato un id del campo da verificare come input, viene letto il testo nella forma [0-9]/[0-9] e viene fatto - * il replate del primo numero in base a quanti elementi sono stati trovati (valore passato per parametro) - */ -function update_counter(id, new_value) { - new_text = $('#' + id).html(); - - // Estraggo parte numerica (formato x/total) - pattern = /([^0-9]+)([0-9]+)\/([0-9]+)([^0-9]+)/; - new_text = new_text.replace(pattern, "$1" + new_value + "/$3$4"); - - // Estraggo totale (parte numerica dopo lo slash /) - matches = pattern.exec(new_text); - total = matches[3]; - - $('#' + id).html(new_text); - - if (new_value == total) { - $('#' + id).removeClass('btn-warning').removeClass('btn-danger').addClass('btn-success'); - } else if (new_value == 0) { - $('#' + id).removeClass('btn-warning').removeClass('btn-success').addClass('btn-danger'); - } else { - $('#' + id).removeClass('btn-success').removeClass('btn-danger').addClass('btn-warning'); - } -} - function setContrast(backgroundcolor) { var rgb = []; var bg = String(backgroundcolor); @@ -237,9 +226,7 @@ function message(element) { confirmButtonText: button, confirmButtonClass: btn_class, onOpen: function () { - start_superselect(); - start_inputmask(); - start_datepickers(); + restart_inputs(); }, preConfirm: function () { $form = $('#swal-form'); @@ -468,8 +455,10 @@ function prepareForm(form) { } } +/** + * Visualizzazione dei messaggi attivi tramite toastr. + */ function renderMessages() { - // Visualizzazione messaggi $.ajax({ url: globals.rootdir + '/ajax.php', type: 'get', @@ -522,14 +511,17 @@ function restart_inputs() { start_datepickers(); start_inputmask(); + initNumbers(); start_superselect(); // Autosize per le textarea autosize($('.autosize')); } +/** + * Messaggio di avviso salvataggio a comparsa sulla destra solo nella versione a desktop intero + */ function alertPush() { - // Messaggio di avviso salvataggio a comparsa sulla destra solo nella versione a desktop intero if ($(window).width() > 1023) { var i = 0; @@ -559,6 +551,13 @@ function alertPush() { }); } +/** + * + * @param button + * @param form + * @param data + * @returns {Promise} + */ function salvaForm(button, form, data = {}) { return new Promise(function (resolve, reject) { // Caricamento visibile nel pulsante diff --git a/assets/src/js/functions/numbers.js b/assets/src/js/functions/numbers.js new file mode 100644 index 000000000..2b0d3371b --- /dev/null +++ b/assets/src/js/functions/numbers.js @@ -0,0 +1,59 @@ +/* + * OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione + * Copyright (C) DevCode s.n.c. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * Funzione per inizializzare i campi di input numerici per la gestione integrata del formato impostato per il gestionale. + */ +function initNumbers() { + let inputs = $('.decimal-number').not('.bound'); + + for (const input of inputs) { + let $input = $(input); + + if (AutoNumeric.isManagedByAutoNumeric(input)) { + continue; + } + + let min = $input.attr('min-value') && $input.attr('min-value') !== "undefined" ? $input.attr('min-value') : null; + let max = $input.attr('max-value') && $input.attr('max-value') !== "undefined" ? $input.attr('max-value') : null; + + let decimals = $input.attr('decimals') ? $input.attr('decimals') : globals.cifre_decimali; + + let autonumeric = new AutoNumeric(input, { + caretPositionOnFocus: "decimalLeft", + allowDecimalPadding: true, + currencySymbolPlacement: "s", + negativePositiveSignPlacement: "p", + decimalCharacter: globals.decimals, + decimalCharacterAlternative: ".", + digitGroupSeparator: globals.thousands, + emptyInputBehavior: min ? min : "zero", + overrideMinMaxLimits: "ignore", + modifyValueOnWheel: false, + outputFormat: "string", + unformatOnSubmit: true, + watchExternalChanges: true, + minimumValue: min ? min : "-10000000000000", + maximumValue: max ? max : "10000000000000", + decimalPlaces: decimals, + }); + + $input.data("autonumeric", autonumeric) + .addClass('bound'); + } +} diff --git a/assets/src/js/functions/prototypes.js b/assets/src/js/functions/prototypes.js index 85390394f..1e91e7c97 100755 --- a/assets/src/js/functions/prototypes.js +++ b/assets/src/js/functions/prototypes.js @@ -39,6 +39,6 @@ Number.prototype.toLocale = function () { jQuery.fn.scrollTo = function (elem, speed) { $(this).animate({ scrollTop: $(this).scrollTop() - $(this).offset().top + $(elem).offset().top - }, speed == undefined ? 1000 : speed); + }, speed === undefined ? 1000 : speed); return this; }; diff --git a/assets/src/js/functions/select.js b/assets/src/js/functions/select.js index 7be6e6ae0..8d0d0874d 100755 --- a/assets/src/js/functions/select.js +++ b/assets/src/js/functions/select.js @@ -118,6 +118,7 @@ function selectBackground(data, container) { return data.text; } + /** * Reimposta i contenuti di un diff --git a/include/common/importa.php b/include/common/importa.php index 4b848b476..2816900d4 100755 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -42,7 +42,7 @@ if (empty($righe)) { return; } -$link = !empty($documento_finale) ? ROOTDIR.'/editor.php?id_module='.$final_module['id'].'&id_record='.$documento_finale->id : ROOTDIR.'/controller.php?id_module='.$final_module['id']; +$link = !empty($documento_finale) ? base_path().'/editor.php?id_module='.$final_module['id'].'&id_record='.$documento_finale->id : base_path().'/controller.php?id_module='.$final_module['id']; echo '
@@ -246,64 +246,69 @@ echo ' - - - - - '; + + + + + + '; if (!empty($options['serials'])) { echo ' - '; + '; } echo ' - '; + + + '; foreach ($righe as $i => $riga) { // Descrizione echo ' - - + '; + '; // Q.tà rimanente echo ' - '; + '; // Q.tà da evadere echo ' - '; + '; echo ' - '; + '.numberFormat($riga->totale_imponibile).' + '.numberFormat($riga->iva).' + '; // Seriali if (!empty($options['serials'])) { echo ' - '; + '; } echo ' - '; + '; } // Totale echo ' + +
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').'
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').''.tr('Seriali').''.tr('Seriali').'
- - - - '; +
+ + + + + + '; // Checkbox - da evadere? echo ' - '; + '; $descrizione = ($riga->isArticolo() ? $riga->articolo->codice.' - ' : '').$riga['descrizione']; echo ' '.nl2br($descrizione); echo ' - - '.numberFormat($riga['qta_rimanente']).' - + '.numberFormat($riga['qta_rimanente']).' + - {[ "type": "number", "name": "qta_da_evadere['.$riga['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$riga['qta_rimanente'].'", "decimals": "qta", "min-value": "0", "extra": "'.(($riga['is_descrizione']) ? 'readonly' : '').' onkeyup=\"ricalcola_subtotale_riga('.$i.');\"" ]} - + {[ "type": "number", "name": "qta_da_evadere['.$riga['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$riga['qta_rimanente'].'", "decimals": "qta", "min-value": "0", "extra": "'.(($riga['is_descrizione']) ? 'readonly' : '').' onkeyup=\"ricalcolaTotaleRiga('.$i.');\"" ]} + - '.moneyFormat($riga->totale).'
+
+ '.moneyFormat($riga->totale).'
- '.numberFormat($riga->totale_imponibile).' + '.numberFormat($riga->iva).' -
'; + '; if (!empty($riga['abilita_serial'])) { $serials = $riga->serials; @@ -318,7 +323,7 @@ foreach ($righe as $i => $riga) { if (!empty($serials)) { echo ' - {[ "type": "select", "name": "serial['.$riga['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": '.json_encode($list).', "value": "'.implode(',', $serials).'", "extra": "data-maximum=\"'.intval($riga['qta_rimanente']).'\"" ]}'; + {[ "type": "select", "name": "serial['.$riga['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": '.json_encode($list).', "value": "'.implode(',', $serials).'", "extra": "data-maximum=\"'.intval($riga['qta_rimanente']).'\"" ]}'; } } @@ -327,15 +332,17 @@ foreach ($righe as $i => $riga) { } echo ' -
'.tr('Totale').': @@ -347,6 +354,22 @@ echo '
'; +echo ' +'; + echo ' @@ -362,95 +385,160 @@ echo ' echo ' '; -?> - +echo ' +ricalcolaTotale(); +'; diff --git a/include/common/riga.php b/include/common/riga.php index 607b0cef4..786019cb3 100755 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -33,7 +33,7 @@ echo ' // Quantità echo '
- {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "/ '.numberFormat($result['max_qta'], 'qta').' "' : '').', "min-value": "'.Translator::numberToLocale($result['qta_evasa']).'" ]} + {[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "/ '.numberFormat($result['max_qta'], 'qta').' "' : '').', "min-value": "'.$result['qta_evasa'].'" ]}
'; // Unità di misura diff --git a/include/init/configuration.php b/include/init/configuration.php index 094384845..2abbd4d6c 100755 --- a/include/init/configuration.php +++ b/include/init/configuration.php @@ -115,7 +115,7 @@ if (post('db_host') !== null) { // Creazione della configurazione if ($dbo->isConnected()) { - $new_config = file_get_contents(DOCROOT.'/config.example.php'); + $new_config = file_get_contents(base_dir().'/config.example.php'); $decimals = post('decimal_separator'); $thousands = post('thousand_separator'); @@ -149,14 +149,14 @@ if (post('db_host') !== null) {

'.tr('Sembra che non ci siano i permessi di scrittura sul file _FILE_', [ '_FILE_' => 'config.inc.php', ]).'

- +
;
- '.tr('Torna indietro').' + '.tr('Torna indietro').'

@@ -184,9 +184,9 @@ if (post('db_host') !== null) { "dir" : "ltr", "lang" : "it-IT", "name" : "OpenSTAManager", - "scope" : "'.ROOTDIR.'", + "scope" : "'.base_path().'", "display" : "fullscreen", - "start_url" : "'.ROOTDIR.'", + "start_url" : "'.base_path().'", "short_name" : "OSM", "theme_color" : "transparent", "description" : "OpenSTAManager", @@ -203,7 +203,7 @@ if (post('db_host') !== null) { }'; file_put_contents('manifest.json', $manifest); - redirect(ROOTDIR.'/index.php'); + redirect(base_path().'/index.php'); exit(); } } @@ -219,7 +219,7 @@ if ((file_exists('config.inc.php') || $valid_config) && !$dbo->isConnected()) {

'.tr("Si è verificato un'errore durante la connessione al database").'.

'.tr('Controllare di aver inserito correttamente i dati di accesso, e che il database atto ad ospitare i dati del gestionale sia esistente').'.

- '.tr('Riprova').' + '.tr('Riprova').'
'; } @@ -240,7 +240,7 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) { '_FILE_' => 'config.inc.php', ]).'.

'.tr("Nel caso il problema persista, rivolgersi all'assistenza ufficiale").'.

- '.tr('Riprova').' + '.tr('Riprova').' '; } @@ -295,7 +295,7 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) { $("#test").prop("disabled", true); $("#install").prop("disabled", true); $(this).closest("form").ajaxSubmit({ - url: "'.$rootdir.'/index.php", + url: "'.base_path().'/index.php", data: { test: 1, }, diff --git a/include/init/init.php b/include/init/init.php index 6eb2937a8..e1226ca73 100755 --- a/include/init/init.php +++ b/include/init/init.php @@ -66,7 +66,7 @@ if (post('action') == 'init') { if (!$has_azienda) { Filter::set('post', 'op', 'add'); $id_module = Modules::get('Anagrafiche')['id']; - include DOCROOT.'/modules/anagrafiche/actions.php'; + include base_dir().'/modules/anagrafiche/actions.php'; // Logo stampe if (!empty($_FILES) && !empty($_FILES['blob']['name'])) { @@ -114,7 +114,7 @@ if (post('action') == 'init') { } } - redirect(ROOTDIR, 'js'); + redirect(base_path(), 'js'); exit(); } @@ -143,15 +143,15 @@ if (!$has_user) {
- {[ "type": "text", "label": "'.tr('Username').'", "name": "admin_username", "value": "'.$osm_password.'", "placeholder": "'.tr("Digita l'username dell'amministratore").'", "required": 1 ]} + {[ "type": "text", "label": "'.tr('Username').'", "name": "admin_username", "value": "", "placeholder": "'.tr("Digita l'username dell'amministratore").'", "required": 1 ]}
- {[ "type": "password", "label": "'.tr('Password').'", "id": "password", "name": "admin_password", "value": "'.$osm_password.'", "placeholder": "'.tr("Digita la password dell'amministratore").'", "required": 1, "strength": "#config" ]} + {[ "type": "password", "label": "'.tr('Password').'", "id": "password", "name": "admin_password", "value": "", "placeholder": "'.tr("Digita la password dell'amministratore").'", "required": 1, "strength": "#config" ]}
- {[ "type": "email", "label": "'.tr('Email').'", "name": "admin_email", "value": "'.$osm_email.'", "placeholder": "'.tr("Digita l'indirizzo email dell'amministratore").'", "required": 1 ]} + {[ "type": "email", "label": "'.tr('Email').'", "name": "admin_email", "value": "", "placeholder": "'.tr("Digita l'indirizzo email dell'amministratore").'", "required": 1 ]}
@@ -172,7 +172,7 @@ if (!$has_azienda) { $readonly_tipo = true; ob_start(); - include DOCROOT.'/modules/anagrafiche/add.php'; + include base_dir().'/modules/anagrafiche/add.php'; $anagrafica = ob_get_clean(); echo str_replace('', '', $anagrafica); @@ -258,7 +258,7 @@ echo ' $("button[type=submit]").not("#config").remove(); }); - + '; include_once App::filepath('include|custom|', 'bottom.php'); diff --git a/include/init/requirements.php b/include/init/requirements.php index 8498da7ec..b1ed7dff2 100755 --- a/include/init/requirements.php +++ b/include/init/requirements.php @@ -145,7 +145,7 @@ $dirs = [ $directories = []; foreach ($dirs as $name => $description) { - $status = is_writable($docroot.DIRECTORY_SEPARATOR.$name); + $status = is_writable(base_dir().DIRECTORY_SEPARATOR.$name); $directories[] = [ 'name' => $name, diff --git a/include/init/update.php b/include/init/update.php index 37e9ebd5e..8462feda0 100755 --- a/include/init/update.php +++ b/include/init/update.php @@ -104,7 +104,7 @@ if (filter('action') == 'do_update') { } echo ' - + '.tr('Continua').' '; } @@ -125,7 +125,7 @@ if (filter('action') == 'do_update') {

'.tr("E' attualmente in corso la procedura di aggiornamento del software, e pertanto siete pregati di attendere fino alla sua conclusione").'.

'.tr("Nel caso il problema persista, rivolgersi all'amministratore o all'assistenza ufficiale").'.

- '.tr('Riprova').' + '.tr('Riprova').'
'; @@ -202,7 +202,7 @@ if (filter('action') == 'do_update') { foreach ($updates as $update) { if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) { - $queries = readSQLFile(DOCROOT.$update['directory'].$update['filename'].'.sql', ';'); + $queries = readSQLFile(base_dir().$update['directory'].$update['filename'].'.sql', ';'); $total += count($queries); if (intval($update['done']) > 1) { diff --git a/include/manager.php b/include/manager.php index d5075fdce..038bd776b 100755 --- a/include/manager.php +++ b/include/manager.php @@ -176,7 +176,7 @@ if (!empty($type) && $type != 'menu' && $type != 'custom') { foreach ($bulk as $key => $value) { $text = is_array($value) ? $value['text'] : $value; - $data = is_array($value) ? $value['data'] : []; + $data = is_array($value['data']) ? $value['data'] : []; $extra = []; foreach ($data as $k => $v) { $extra[] = 'data-'.$k.'="'.prepareToField(\HTMLBuilder\HTMLBuilder::replace($v)).'"'; diff --git a/include/riferimenti/riferimenti.php b/include/riferimenti/riferimenti.php index 24077c153..d0150ce5d 100644 --- a/include/riferimenti/riferimenti.php +++ b/include/riferimenti/riferimenti.php @@ -48,7 +48,7 @@ echo ' '; $documenti_disponibili = collect(); -$direzione_richiesta = $source->parent->direzione == 'entrata' ? 'uscita' : 'entrata'; +$direzione_richiesta = $source->getDocument()->direzione == 'entrata' ? 'uscita' : 'entrata'; // Individuazione DDT disponibili $ddt = DDT::whereHas('stato', function ($query) { diff --git a/include/riferimenti/righe_riferimenti.php b/include/riferimenti/righe_riferimenti.php index 35cd9bd63..6ba5ea477 100644 --- a/include/riferimenti/righe_riferimenti.php +++ b/include/riferimenti/righe_riferimenti.php @@ -55,7 +55,7 @@ if (!$riferimenti->isEmpty()) { '.$riferimento->target->descrizione.'
- '.reference($riferimento->target->parent).' + '.reference($riferimento->target->getDocument()).' '; diff --git a/include/src/Components/MorphTrait.php b/include/src/Components/MorphTrait.php deleted file mode 100755 index 37216ff4e..000000000 --- a/include/src/Components/MorphTrait.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace Common\Components; - -use Common\RowReference; - -trait MorphTrait -{ - protected $original_model = null; - - public function hasOriginal() - { - return !empty($this->original_type) && !empty($this->getOriginal()); - } - - public function getOriginal() - { - if (!isset($this->original_model) && !empty($this->original_type)) { - $class = $this->original_type; - - $this->original_model = $class::find($this->original_id); - } - - return $this->original_model; - } - - public function referenceSources() - { - $class = get_class($this); - - return $this->hasMany(RowReference::class, 'target_id') - ->where('target_type', $class); - } - - public function referenceTargets() - { - $class = get_class($this); - - return $this->hasMany(RowReference::class, 'source_id') - ->where('source_type', $class); - } -} diff --git a/include/top.php b/include/top.php index c072e5b0c..6a15baa6e 100755 --- a/include/top.php +++ b/include/top.php @@ -38,9 +38,9 @@ echo ' '; -if (file_exists(DOCROOT.'/manifest.json')) { +if (file_exists(base_dir().'/manifest.json')) { echo ' - '; + '; } // CSS @@ -166,7 +166,7 @@ if (Auth::check()) { }, }; globals = { - rootdir: "'.$rootdir.'", + rootdir: "'.base_path().'", js: "'.$paths['js'].'", css: "'.$paths['css'].'", img: "'.$paths['img'].'", @@ -209,7 +209,7 @@ if (Auth::check()) { echo ' diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index c810c32a0..cfaeaffe5 100755 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -27,20 +27,20 @@ echo '
'; if (empty($_GET['movimentazione_completa'])) { echo ' - + '.tr('Mostra tutti i movimenti').' '; } else { echo ' - + '.tr('Mostra gli ultimi 20 movimenti').' '; } echo ' - + '.tr('Visualizza dettagli').' '; diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index a073f0e3b..0ff907f31 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -19,7 +19,8 @@ namespace Modules\Articoli; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Modules; use Modules\Interventi\Components\Articolo as ArticoloIntervento; @@ -30,6 +31,7 @@ use Uploads; class Articolo extends Model { + use SimpleModelTrait; use SoftDeletes; use RecordTrait; @@ -41,7 +43,7 @@ class Articolo extends Model public static function build($codice, $nome, Categoria $categoria = null, Categoria $sottocategoria = null) { - $model = parent::build(); + $model = new static(); $model->codice = $codice; $model->descrizione = $nome; @@ -160,7 +162,7 @@ class Articolo extends Model $image = $directory.$this->immagine; $image_thumbnail = $directory.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension']; - $url = file_exists(DOCROOT.$image_thumbnail) ? ROOTDIR.$image_thumbnail : ROOTDIR.$image; + $url = file_exists(base_dir().$image_thumbnail) ? base_path().$image_thumbnail : base_path().$image; return $url; } diff --git a/modules/articoli/src/Categoria.php b/modules/articoli/src/Categoria.php index acb5cb735..c3c82b430 100755 --- a/modules/articoli/src/Categoria.php +++ b/modules/articoli/src/Categoria.php @@ -19,11 +19,13 @@ namespace Modules\Articoli; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Traits\HierarchyTrait; class Categoria extends Model { + use SimpleModelTrait; use HierarchyTrait; protected $table = 'mg_categorie'; @@ -31,7 +33,7 @@ class Categoria extends Model public static function build($nome) { - $model = parent::build(); + $model = new static(); $model->nome = $nome; $model->save(); diff --git a/modules/articoli/src/Movimento.php b/modules/articoli/src/Movimento.php index 184c9b1bb..0c8ecdc9a 100755 --- a/modules/articoli/src/Movimento.php +++ b/modules/articoli/src/Movimento.php @@ -19,9 +19,10 @@ namespace Modules\Articoli; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; -/** +/* * Classe dedicata alla gestione dei movimenti di magazzino degli articoli. * * Alcuni appunti sull'utilizzo dei campi *idsede_azienda* e *idsede_controparte* @@ -32,12 +33,14 @@ use Common\Model; */ class Movimento extends Model { + use SimpleModelTrait; + protected $document; protected $table = 'mg_movimenti'; public static function build(Articolo $articolo, $qta, $descrizone, $data, $document = null) { - $model = parent::build(); + $model = new static(); $model->articolo()->associate($articolo); diff --git a/modules/articoli/widgets/stampa_inventario.php b/modules/articoli/widgets/stampa_inventario.php index b67187cc6..4be08cef1 100755 --- a/modules/articoli/widgets/stampa_inventario.php +++ b/modules/articoli/widgets/stampa_inventario.php @@ -23,7 +23,7 @@ include_once __DIR__.'/../../../core.php'; $id_print = $dbo->fetchOne('SELECT zz_prints.id FROM zz_prints INNER JOIN zz_modules ON zz_prints.id_module=zz_modules.id WHERE zz_modules.name="Articoli" AND zz_prints.name="Inventario magazzino"')['id']; echo ' -
+
diff --git a/modules/backups/edit.php b/modules/backups/edit.php index 82159d35f..ad21f1787 100755 --- a/modules/backups/edit.php +++ b/modules/backups/edit.php @@ -50,7 +50,7 @@ if (!is_writable($backup_dir) || !is_readable($backup_dir)) { echo '

'.tr('Il backup è molto importante perché permette di creare una copia della propria installazione e relativi dati per poterla poi ripristinare in seguito a errori, cancellazioni accidentali o guasti hardware').'.

'; -if (starts_with($backup_dir, DOCROOT)) { +if (starts_with($backup_dir, base_dir())) { echo '
'.tr('Per motivi di sicurezza si consiglia di modificare il percorso della cartella di backup al di fuori della cartella di OSM, possibilmente in una unità esterna').'. @@ -212,7 +212,7 @@ if (file_exists($backup_dir)) { loadSize("'.$id.'", "c-'.$id.'"); - '.tr('Scarica').' + '.tr('Scarica').'
diff --git a/modules/categorie_articoli/row-list.php b/modules/categorie_articoli/row-list.php index 3d67c8ca8..473c79e20 100755 --- a/modules/categorie_articoli/row-list.php +++ b/modules/categorie_articoli/row-list.php @@ -29,7 +29,7 @@ foreach ($subcategorie as $sub) { '.$sub['colore'].' '.$sub['nota'].' - + diff --git a/modules/categorie_documenti/src/Categoria.php b/modules/categorie_documenti/src/Categoria.php index f3e8182ee..db9c55f27 100755 --- a/modules/categorie_documenti/src/Categoria.php +++ b/modules/categorie_documenti/src/Categoria.php @@ -19,18 +19,20 @@ namespace Modules\CategorieDocumentali; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Categoria extends Model { + use SimpleModelTrait; use SoftDeletes; protected $table = 'do_categorie'; public static function build($descrizione) { - $model = parent::build(); + $model = new static(); $model->descrizione = $descrizione; $model->save(); diff --git a/modules/checklists/src/Check.php b/modules/checklists/src/Check.php index 48d28b878..53468d796 100755 --- a/modules/checklists/src/Check.php +++ b/modules/checklists/src/Check.php @@ -19,7 +19,8 @@ namespace Modules\Checklists; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Models\Group; use Models\Module; use Models\Plugin; @@ -29,6 +30,7 @@ use Traits\HierarchyTrait; class Check extends Model { + use SimpleModelTrait; use HierarchyTrait; protected static $parent_identifier = 'id_parent'; @@ -46,7 +48,7 @@ class Check extends Model */ public static function build(User $user, $structure, $id_record, $content, $parent_id = null) { - $model = parent::build(); + $model = new static(); $model->user()->associate($user); $model->id_parent = $parent_id; diff --git a/modules/checklists/src/Checklist.php b/modules/checklists/src/Checklist.php index 6195322d7..98522aa3d 100755 --- a/modules/checklists/src/Checklist.php +++ b/modules/checklists/src/Checklist.php @@ -19,13 +19,16 @@ namespace Modules\Checklists; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Models\Module; use Models\Plugin; use Models\User; class Checklist extends Model { + use SimpleModelTrait; + protected $table = 'zz_checklists'; /** @@ -37,7 +40,7 @@ class Checklist extends Model */ public static function build($nome) { - $model = parent::build(); + $model = new static(); $model->name = $nome; $model->save(); diff --git a/modules/checklists/src/ChecklistItem.php b/modules/checklists/src/ChecklistItem.php index f7bbc910d..9089c11e4 100755 --- a/modules/checklists/src/ChecklistItem.php +++ b/modules/checklists/src/ChecklistItem.php @@ -19,11 +19,13 @@ namespace Modules\Checklists; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Traits\HierarchyTrait; class ChecklistItem extends Model { + use SimpleModelTrait; use HierarchyTrait; protected static $parent_identifier = 'id_parent'; @@ -39,7 +41,7 @@ class ChecklistItem extends Model */ public static function build(Checklist $checklist, $contenuto, $id_parent = null) { - $model = parent::build(); + $model = new static(); $model->checklist()->associate($checklist); $model->id_parent = $id_parent; diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index 10a87b48a..63b4059b0 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -121,7 +121,7 @@ switch (post('op')) { $righe = $contratto->getRighe(); foreach ($righe as $riga) { $new_riga = $riga->replicate(); - $new_riga->setParent($new); + $new_riga->setDocument($new); $new_riga->qta_evasa = 0; $new_riga->save(); diff --git a/modules/contratti/add_preventivo.php b/modules/contratti/add_preventivo.php index 179cc70cf..6ab4bdcb5 100644 --- a/modules/contratti/add_preventivo.php +++ b/modules/contratti/add_preventivo.php @@ -34,6 +34,7 @@ if (!empty($id_documento)) { 'button' => tr('Aggiungi'), 'documento' => $documento, 'documento_finale' => $documento_finale, + 'tipo_documento_finale' => Contratto::class, ]; echo App::load('importa.php', [], $options, true); diff --git a/modules/contratti/bulk.php b/modules/contratti/bulk.php index 702850cbf..38a91c449 100755 --- a/modules/contratti/bulk.php +++ b/modules/contratti/bulk.php @@ -92,6 +92,8 @@ switch (post('op')) { $qta = $riga->qta_rimanente; if ($qta > 0) { + //Fix per idconto righe fattura + $riga->idconto = $fattura->idconto; $copia = $riga->copiaIn($fattura, $qta); // Aggiornamento seriali dalla riga dell'ordine diff --git a/modules/contratti/crea_documento.php b/modules/contratti/crea_documento.php index a6376a11e..578c7c5c1 100644 --- a/modules/contratti/crea_documento.php +++ b/modules/contratti/crea_documento.php @@ -20,8 +20,10 @@ include_once __DIR__.'/../../core.php'; use Modules\Contratti\Contratto; +use Modules\Fatture\Fattura; $documento = Contratto::find($id_record); +$tipo_documento_finale = Fattura::class; $options = [ 'op' => 'add_documento', @@ -30,6 +32,7 @@ $options = [ 'button' => tr('Aggiungi'), 'create_document' => true, 'documento' => $documento, + 'tipo_documento_finale' => $tipo_documento_finale, ]; echo App::load('importa.php', [], $options, true); diff --git a/modules/contratti/edit.php b/modules/contratti/edit.php index ad4af3fdc..b54e61c18 100755 --- a/modules/contratti/edit.php +++ b/modules/contratti/edit.php @@ -237,7 +237,7 @@ if (!empty($rs)) { - @@ -289,7 +289,7 @@ if (!empty($rs)) { - diff --git a/modules/contratti/row-list.php b/modules/contratti/row-list.php index c333f3bbd..6319d51d2 100755 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -51,9 +51,9 @@ foreach ($righe as $riga) { '; // Aggiunta dei riferimenti ai documenti - if ($riga->hasOriginal()) { + if ($riga->hasOriginalComponent()) { echo ' - '.reference($riga->getOriginal()->parent, tr('Origine')).''; + '.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')).''; } // Descrizione diff --git a/modules/contratti/src/Components/Articolo.php b/modules/contratti/src/Components/Articolo.php index f94871339..35a7b28cd 100755 --- a/modules/contratti/src/Components/Articolo.php +++ b/modules/contratti/src/Components/Articolo.php @@ -20,26 +20,10 @@ namespace Modules\Contratti\Components; use Common\Components\Article; -use Modules\Articoli\Articolo as Original; -use Modules\Contratti\Contratto; class Articolo extends Article { use RelationTrait; - public $movimenta_magazzino = false; - protected $table = 'co_righe_contratti'; - - /** - * Crea un nuovo articolo collegato ad un contratto. - * - * @return self - */ - public static function build(Contratto $contratto, Original $articolo) - { - $model = parent::build($contratto, $articolo); - - return $model; - } } diff --git a/modules/contratti/src/Components/Descrizione.php b/modules/contratti/src/Components/Descrizione.php index 70da05f11..4e4614f75 100755 --- a/modules/contratti/src/Components/Descrizione.php +++ b/modules/contratti/src/Components/Descrizione.php @@ -20,23 +20,10 @@ namespace Modules\Contratti\Components; use Common\Components\Description; -use Modules\Contratti\Contratto; class Descrizione extends Description { use RelationTrait; protected $table = 'co_righe_contratti'; - - /** - * Crea una nuova riga collegata ad un contratto. - * - * @return self - */ - public static function build(Contratto $contratto) - { - $model = parent::build($contratto); - - return $model; - } } diff --git a/modules/contratti/src/Components/RelationTrait.php b/modules/contratti/src/Components/RelationTrait.php index d9f44166d..a14497eae 100755 --- a/modules/contratti/src/Components/RelationTrait.php +++ b/modules/contratti/src/Components/RelationTrait.php @@ -23,18 +23,18 @@ use Modules\Contratti\Contratto; trait RelationTrait { - public function getParentID() + public function getDocumentID() { return 'idcontratto'; } - public function parent() + public function document() { - return $this->belongsTo(Contratto::class, $this->getParentID()); + return $this->belongsTo(Contratto::class, $this->getDocumentID()); } public function contratto() { - return $this->parent(); + return $this->document(); } } diff --git a/modules/contratti/src/Components/Riga.php b/modules/contratti/src/Components/Riga.php index 9734b254d..3553883ad 100755 --- a/modules/contratti/src/Components/Riga.php +++ b/modules/contratti/src/Components/Riga.php @@ -20,23 +20,10 @@ namespace Modules\Contratti\Components; use Common\Components\Row; -use Modules\Contratti\Contratto; class Riga extends Row { use RelationTrait; protected $table = 'co_righe_contratti'; - - /** - * Crea una nuova riga collegata ad un contratto. - * - * @return self - */ - public static function build(Contratto $contratto) - { - $model = parent::build($contratto); - - return $model; - } } diff --git a/modules/contratti/src/Components/Sconto.php b/modules/contratti/src/Components/Sconto.php index a40efa1c0..3b112031e 100755 --- a/modules/contratti/src/Components/Sconto.php +++ b/modules/contratti/src/Components/Sconto.php @@ -20,23 +20,10 @@ namespace Modules\Contratti\Components; use Common\Components\Discount; -use Modules\Contratti\Contratto; class Sconto extends Discount { use RelationTrait; protected $table = 'co_righe_contratti'; - - /** - * Crea un nuovo sconto collegato ad un contratto. - * - * @return self - */ - public static function build(Contratto $contratto) - { - $model = parent::build($contratto); - - return $model; - } } diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php index 231967e0d..a97d36a53 100755 --- a/modules/contratti/src/Contratto.php +++ b/modules/contratti/src/Contratto.php @@ -21,7 +21,7 @@ namespace Modules\Contratti; use Carbon\Carbon; use Carbon\CarbonInterval; -use Common\Components\Description; +use Common\Components\Component; use Common\Document; use Modules\Anagrafiche\Anagrafica; use Modules\Interventi\Intervento; @@ -37,6 +37,11 @@ class Contratto extends Document use ReferenceTrait; use RecordTrait; + /** + * @var bool Disabilita movimentazione automatica + */ + public static $movimenta_magazzino = false; + protected $table = 'co_contratti'; /** @@ -58,7 +63,7 @@ class Contratto extends Document */ public static function build(Anagrafica $anagrafica, $nome) { - $model = parent::build(); + $model = new static(); $stato_documento = Stato::where('descrizione', 'Bozza')->first(); @@ -220,7 +225,7 @@ class Contratto extends Document * Effettua un controllo sui campi del documento. * Viene richiamato dalle modifiche alle righe del documento. */ - public function triggerEvasione(Description $trigger) + public function triggerEvasione(Component $trigger) { parent::triggerEvasione($trigger); diff --git a/modules/contratti/src/Stato.php b/modules/contratti/src/Stato.php index dcea1da30..8256cd693 100755 --- a/modules/contratti/src/Stato.php +++ b/modules/contratti/src/Stato.php @@ -19,10 +19,13 @@ namespace Modules\Contratti; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; class Stato extends Model { + use SimpleModelTrait; + protected $table = 'co_staticontratti'; public function preventivi() diff --git a/modules/dashboard/actions.php b/modules/dashboard/actions.php index 99049b018..abbf88edb 100755 --- a/modules/dashboard/actions.php +++ b/modules/dashboard/actions.php @@ -74,7 +74,7 @@ switch (filter('op')) { 'title' => 'Int. '.$sessione['codice'].' '.$sessione['cliente'].'
'.tr('Tecnici').': '.$sessione['nome_tecnico'].' '.(($sessione['have_attachments']) ? '' : ''), 'start' => $sessione['orario_inizio'], 'end' => $sessione['orario_fine'], - 'url' => ROOTDIR.'/editor.php?id_module='.$modulo_interventi->id.'&id_record='.$sessione['idintervento'], + 'url' => base_path().'/editor.php?id_module='.$modulo_interventi->id.'&id_record='.$sessione['idintervento'], 'backgroundColor' => $sessione['colore'], 'textColor' => color_inverse($sessione['colore']), 'borderColor' => ($sessione['colore_tecnico'] == '#FFFFFF') ? color_darken($sessione['colore_tecnico'], 100) : $sessione['colore_tecnico'], diff --git a/modules/dashboard/edit.php b/modules/dashboard/edit.php index 9b2d54a2a..5b8f8a547 100755 --- a/modules/dashboard/edit.php +++ b/modules/dashboard/edit.php @@ -31,10 +31,11 @@ echo '
- - @@ -602,7 +600,7 @@ if (!$block_edit) { echo ' '; @@ -612,7 +610,7 @@ if (!$block_edit) { $preventivi = $dbo->fetchArray($prev_query)[0]['tot']; echo ' '; @@ -622,7 +620,7 @@ if (!$block_edit) { $contratti = $dbo->fetchArray($contr_query)[0]['tot']; echo ' '; @@ -640,7 +638,7 @@ if (!$block_edit) { AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)'; $ddt = $dbo->fetchArray($ddt_query)[0]['tot']; echo ' - + Ddt '; @@ -648,7 +646,7 @@ if (!$block_edit) { $ordini_query = 'SELECT COUNT(*) AS tot FROM or_ordini WHERE idanagrafica='.prepare($record['idanagrafica']).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Accettato\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).') AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0)'; $ordini = $dbo->fetchArray($ordini_query)[0]['tot']; echo ' - + Ordine '; } diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index c57100b0a..e7b5e7b53 100755 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -65,8 +65,8 @@ foreach ($righe as $riga) { $extra_riga = ''; if (!$riga->isDescrizione()) { // Informazioni su CIG, CUP, ... - if ($riga->hasOriginal()) { - $documento_originale = $riga->getOriginal()->parent; + if ($riga->hasOriginalComponent()) { + $documento_originale = $riga->getOriginalComponent()->getDocument(); $num_item = $documento_originale['num_item']; $codice_cig = $documento_originale['codice_cig']; @@ -102,9 +102,9 @@ foreach ($righe as $riga) { '.$extra_riga; // Aggiunta dei riferimenti ai documenti - if ($riga->hasOriginal()) { + if ($riga->hasOriginalComponent()) { echo ' -
'.reference($riga->getOriginal()->parent, tr('Origine')); +
'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')); } echo ' diff --git a/modules/fatture/src/Components/Articolo.php b/modules/fatture/src/Components/Articolo.php index 8e1ede3ce..4b798b100 100755 --- a/modules/fatture/src/Components/Articolo.php +++ b/modules/fatture/src/Components/Articolo.php @@ -20,9 +20,10 @@ namespace Modules\Fatture\Components; use Common\Components\Article; -use Modules\Articoli\Articolo as Original; -use Modules\Fatture\Fattura; +/** + * @extends Article<\Modules\Fatture\Fattura> + */ class Articolo extends Article { use RelationTrait; @@ -30,21 +31,9 @@ class Articolo extends Article protected $table = 'co_righe_documenti'; protected $serialRowID = 'documento'; - /** - * Crea un nuovo articolo collegato ad una fattura. - * - * @return self - */ - public static function build(Fattura $fattura, Original $articolo) - { - $model = parent::build($fattura, $articolo); - - return $model; - } - public function movimenta($qta) { - if (!$this->movimenta_magazzino) { + if (!$this->parent->movimenta_magazzino) { return; } @@ -52,9 +41,9 @@ class Articolo extends Article // Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente // Movimentazione forzata per Note di credito/debito - if ($this->hasOriginal() && !$this->parent->isNota()) { - $original = $this->getOriginal(); - $movimenta = !$original->movimenta_magazzino; + if ($this->hasOriginalComponent() && !$this->getDocument()->isNota()) { + $original = $this->getOriginalComponent(); + $movimenta = !$original->getDocument()->movimenta_magazzino; } if ($movimenta) { diff --git a/modules/fatture/src/Components/Descrizione.php b/modules/fatture/src/Components/Descrizione.php index 5e5ce32f9..7e8e9c80a 100755 --- a/modules/fatture/src/Components/Descrizione.php +++ b/modules/fatture/src/Components/Descrizione.php @@ -20,23 +20,13 @@ namespace Modules\Fatture\Components; use Common\Components\Description; -use Modules\Fatture\Fattura; +/** + * @extends Description<\Modules\Fatture\Fattura> + */ class Descrizione extends Description { use RelationTrait; protected $table = 'co_righe_documenti'; - - /** - * Crea una nuova riga collegata ad una fattura. - * - * @return self - */ - public static function build(Fattura $fattura) - { - $model = parent::build($fattura); - - return $model; - } } diff --git a/modules/fatture/src/Components/RelationTrait.php b/modules/fatture/src/Components/RelationTrait.php index 3225afbfa..3c6309980 100755 --- a/modules/fatture/src/Components/RelationTrait.php +++ b/modules/fatture/src/Components/RelationTrait.php @@ -26,26 +26,26 @@ use Modules\Rivalse\RivalsaINPS; trait RelationTrait { - public function getParentID() + public function getDocumentID() { return 'iddocumento'; } - public function parent() + public function document() { - return $this->belongsTo(Fattura::class, $this->getParentID()); + return $this->belongsTo(Fattura::class, $this->getDocumentID()); } public function fattura() { - return $this->parent(); + return $this->document(); } public function getNettoAttribute() { $result = $this->totale - $this->ritenuta_acconto - $this->ritenuta_contributi; - if ($this->parent->split_payment) { + if ($this->getDocument()->split_payment) { $result = $result - $this->iva; } @@ -113,7 +113,7 @@ trait RelationTrait { if ($this->attributes['ritenuta_contributi']) { $result = $this->totale_imponibile; - $ritenuta = $this->parent->ritenutaContributi; + $ritenuta = $this->getDocument()->ritenutaContributi; $result = $result * $ritenuta->percentuale_imponibile / 100; diff --git a/modules/fatture/src/Components/Riga.php b/modules/fatture/src/Components/Riga.php index ba4259f1e..863fe70b5 100755 --- a/modules/fatture/src/Components/Riga.php +++ b/modules/fatture/src/Components/Riga.php @@ -20,23 +20,13 @@ namespace Modules\Fatture\Components; use Common\Components\Row; -use Modules\Fatture\Fattura; +/** + * @extends Row<\Modules\Fatture\Fattura> + */ class Riga extends Row { use RelationTrait; protected $table = 'co_righe_documenti'; - - /** - * Crea una nuova riga collegata ad una fattura. - * - * @return self - */ - public static function build(Fattura $fattura) - { - $model = parent::build($fattura); - - return $model; - } } diff --git a/modules/fatture/src/Components/Sconto.php b/modules/fatture/src/Components/Sconto.php index f0448cbd0..521a5a6be 100755 --- a/modules/fatture/src/Components/Sconto.php +++ b/modules/fatture/src/Components/Sconto.php @@ -20,23 +20,13 @@ namespace Modules\Fatture\Components; use Common\Components\Discount; -use Modules\Fatture\Fattura; +/** + * @extends Discount<\Modules\Fatture\Fattura> + */ class Sconto extends Discount { use RelationTrait; protected $table = 'co_righe_documenti'; - - /** - * Crea un nuovo sconto collegato ad una fattura. - * - * @return self - */ - public static function build(Fattura $fattura) - { - $model = parent::build($fattura); - - return $model; - } } diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index e470cdde9..8c47496cd 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -21,7 +21,7 @@ namespace Modules\Fatture; use Auth; use Carbon\Carbon; -use Common\Components\Description; +use Common\Components\Component; use Common\Document; use Illuminate\Database\Eloquent\Builder; use Modules\Anagrafiche\Anagrafica; @@ -87,7 +87,8 @@ class Fattura extends Document */ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment, $numero_esterno = null) { - $model = parent::build(); + $model = new static(); + $user = Auth::user(); $database = database(); @@ -426,7 +427,7 @@ class Fattura extends Document // Metodi generali - public function triggerComponent(Description $trigger) + public function triggerComponent(Component $trigger) { parent::triggerComponent($trigger); diff --git a/modules/fatture/src/Stato.php b/modules/fatture/src/Stato.php index 66628d0de..d60d282a7 100755 --- a/modules/fatture/src/Stato.php +++ b/modules/fatture/src/Stato.php @@ -19,10 +19,13 @@ namespace Modules\Fatture; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; class Stato extends Model { + use SimpleModelTrait; + protected $table = 'co_statidocumento'; public function fatture() diff --git a/modules/fatture/src/StatoFE.php b/modules/fatture/src/StatoFE.php index 704ea1b90..0576b7a78 100755 --- a/modules/fatture/src/StatoFE.php +++ b/modules/fatture/src/StatoFE.php @@ -19,10 +19,13 @@ namespace Modules\Fatture; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; class StatoFE extends Model { + use SimpleModelTrait; + public $incrementing = false; protected $table = 'fe_stati_documento'; protected $primaryKey = 'codice'; diff --git a/modules/fatture/src/Tipo.php b/modules/fatture/src/Tipo.php index d9481658e..5bca15f29 100755 --- a/modules/fatture/src/Tipo.php +++ b/modules/fatture/src/Tipo.php @@ -19,10 +19,13 @@ namespace Modules\Fatture; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; class Tipo extends Model { + use SimpleModelTrait; + protected $table = 'co_tipidocumento'; public function fatture() diff --git a/modules/fatture/variables.php b/modules/fatture/variables.php index f074222ba..89c5b1c99 100755 --- a/modules/fatture/variables.php +++ b/modules/fatture/variables.php @@ -31,9 +31,9 @@ FROM co_documenti WHERE co_documenti.id='.prepare($id_record)); if (!empty(setting('Logo stampe'))) { - $logo_azienda = BASEURL.'/'.Models\Upload::where('filename', setting('Logo stampe'))->first()->fileurl; + $logo_azienda = base_url().'/'.Models\Upload::where('filename', setting('Logo stampe'))->first()->fileurl; } else { - $logo_azienda = str_replace(DOCROOT, BASEURL, App::filepath('templates/base|custom|/logo_azienda.jpg')); + $logo_azienda = str_replace(base_dir(), base_url(), App::filepath('templates/base|custom|/logo_azienda.jpg')); $logo_azienda = str_replace('\\', '/', $logo_azienda); } diff --git a/modules/gestione_componenti/actions.php b/modules/gestione_componenti/actions.php index ccf0c0016..516651ba1 100755 --- a/modules/gestione_componenti/actions.php +++ b/modules/gestione_componenti/actions.php @@ -19,7 +19,7 @@ include_once __DIR__.'/../../core.php'; -$path = $docroot.'/files/my_impianti/'; +$path = base_dir().'/files/impianti/'; switch (post('op')) { case 'update': diff --git a/modules/gestione_componenti/edit.php b/modules/gestione_componenti/edit.php index 066217461..bab36c413 100755 --- a/modules/gestione_componenti/edit.php +++ b/modules/gestione_componenti/edit.php @@ -32,7 +32,7 @@ if (empty($id_record)) { for ($c = 1; $c <= count($cmp); ++$c) { echo ' - + '.$c.' '.$cmp[$c - 1][0].' '; diff --git a/modules/gestione_componenti/init.php b/modules/gestione_componenti/init.php index f4b5e494d..b53dc2ef8 100755 --- a/modules/gestione_componenti/init.php +++ b/modules/gestione_componenti/init.php @@ -19,9 +19,9 @@ include_once __DIR__.'/../../core.php'; -$cmp = \Util\Ini::getList($docroot.'/files/my_impianti/'); +$cmp = \Util\Ini::getList(base_dir().'/files/impianti/'); if (!empty($id_record) && isset($cmp[$id_record - 1])) { $record['nomefile'] = $cmp[$id_record - 1][0]; - $record['contenuto'] = file_get_contents($docroot.'/files/my_impianti/'.$record['nomefile']); + $record['contenuto'] = file_get_contents(base_dir().'/files/impianti/'.$record['nomefile']); } diff --git a/modules/giacenze_sedi/init.php b/modules/giacenze_sedi/init.php index 4e6f556ea..e32d32d2f 100644 --- a/modules/giacenze_sedi/init.php +++ b/modules/giacenze_sedi/init.php @@ -21,5 +21,5 @@ include_once __DIR__.'/../../core.php'; if (isset($id_record)) { $id_module = Modules::get('Articoli')['id']; - redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record); + redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record); } diff --git a/modules/impianti/actions.php b/modules/impianti/actions.php index cba2c958d..bf41a243a 100644 --- a/modules/impianti/actions.php +++ b/modules/impianti/actions.php @@ -21,7 +21,7 @@ include_once __DIR__.'/../../core.php'; $op = post('op'); -$upload_dir = $docroot.'/files/'.Modules::get('Impianti')['directory']; +$upload_dir = base_dir().'/files/'.Modules::get('Impianti')['directory']; switch ($op) { // Aggiorno informazioni di base impianto @@ -124,8 +124,8 @@ switch ($op) { } // ...altrimenti carico dal file .ini - elseif (file_exists($docroot.'/files/my_impianti/'.$filename)) { - $contenuto = file_get_contents($docroot.'/files/my_impianti/'.$filename); + elseif (file_exists(base_dir().'/files/impianti/'.$filename)) { + $contenuto = file_get_contents(base_dir().'/files/impianti/'.$filename); } crea_form_componente($contenuto); diff --git a/modules/impianti/ajax/search.php b/modules/impianti/ajax/search.php index 9988b77d2..9bf16226c 100644 --- a/modules/impianti/ajax/search.php +++ b/modules/impianti/ajax/search.php @@ -49,7 +49,7 @@ $rs = $dbo->fetchArray($query); foreach ($rs as $r) { $result = []; - $result['link'] = ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$r['id']; + $result['link'] = base_path().'/editor.php?id_module='.$link_id.'&id_record='.$r['id']; $result['title'] = $r['matricola'].' - '.$r['nome']; $result['category'] = 'Impianti'; diff --git a/modules/impianti/edit.php b/modules/impianti/edit.php index 982bb0030..7178fdfce 100644 --- a/modules/impianti/edit.php +++ b/modules/impianti/edit.php @@ -25,7 +25,7 @@ if (!empty($record['immagine'])) { $default_img = '/'.Uploads::getDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension']; - $img = file_exists(DOCROOT.$default_img) ? ROOTDIR.$default_img : ROOTDIR.'/'.Uploads::getDirectory($id_module).'/'.$record['immagine']; + $img = file_exists(base_dir().$default_img) ? base_path().$default_img : base_path().'/'.Uploads::getDirectory($id_module).'/'.$record['immagine']; } ?> diff --git a/modules/impianti/modutil.php b/modules/impianti/modutil.php index 5fc48ec37..508fead68 100755 --- a/modules/impianti/modutil.php +++ b/modules/impianti/modutil.php @@ -30,8 +30,9 @@ function crea_form_componente($contenuto) $fields[$key] = '
'.$value.'
'; } - echo $title; - echo '
'; - echo PHP_EOL.implode(PHP_EOL, $fields).PHP_EOL.''; - echo '
'; + echo $title.' +
+ '.implode(PHP_EOL, $fields).' + +
'; } diff --git a/modules/impianti/plugins/my_impianti.componenti.php b/modules/impianti/plugins/my_impianti.componenti.php index 4e9b7c4d2..7a0285d13 100755 --- a/modules/impianti/plugins/my_impianti.componenti.php +++ b/modules/impianti/plugins/my_impianti.componenti.php @@ -46,8 +46,8 @@ switch (filter('op')) { $filename = get('filename'); if (!empty($filename)) { - $contenuto = file_get_contents(DOCROOT.'/files/my_impianti/'.$filename); - $nome = Ini::getValue(Ini::readFile(DOCROOT.'/files/my_impianti/'.$filename), 'Nome'); + $contenuto = file_get_contents(base_dir().'/files/impianti/'.$filename); + $nome = Ini::getValue(Ini::readFile(base_dir().'/files/impianti/'.$filename), 'Nome'); $query = 'INSERT INTO my_impianto_componenti(filename, idimpianto, contenuto, nome, data) VALUES('.prepare($filename).', '.prepare($id_record).', '.prepare($contenuto).', '.prepare($nome).', NOW())'; $dbo->query($query); @@ -63,8 +63,8 @@ switch (filter('op')) { $filename = get('filename'); $id = get('id'); - $nome = Ini::getValue(Ini::readFile(DOCROOT.'/files/my_impianti/'.$filename), 'Nome'); - $contenuto = file_get_contents(DOCROOT.'/files/my_impianti/'.$filename); + $nome = Ini::getValue(Ini::readFile(base_dir().'/files/impianti/'.$filename), 'Nome'); + $contenuto = file_get_contents(base_dir().'/files/impianti/'.$filename); // Verifico che questo componente non sia già stato sostituito $query = 'SELECT * FROM my_impianto_componenti WHERE idsostituto = '.prepare($id); @@ -111,7 +111,7 @@ echo '
'; // Elenca i componenti disponibili -$componenti_disponibili = Ini::getList(DOCROOT.'/files/my_impianti/', $id_list); +$componenti_disponibili = Ini::getList(base_dir().'/files/my_impianti/', $id_list); echo '
@@ -203,7 +203,7 @@ if (!empty($componenti_installati)) { echo '
- + '; // Nome @@ -324,7 +324,7 @@ echo ' + '; +'; $start = $_SESSION['period_start']; $end = $_SESSION['period_end']; diff --git a/modules/stato_email/edit.php b/modules/stato_email/edit.php index 155ba9ea5..10bd6bd16 100755 --- a/modules/stato_email/edit.php +++ b/modules/stato_email/edit.php @@ -145,7 +145,7 @@ foreach ($uploads as $upload) { echo ' - '.$upload->name.' + '.$upload->name.' '.$upload->pivot->name.' '; diff --git a/modules/stato_servizi/actions.php b/modules/stato_servizi/actions.php index c3c8c81e0..f261adbcc 100755 --- a/modules/stato_servizi/actions.php +++ b/modules/stato_servizi/actions.php @@ -35,13 +35,13 @@ switch (filter('op')) { // Elimino il modulo dal menu $dbo->query('DELETE FROM zz_modules WHERE id='.prepare($id).' OR parent='.prepare($id)); - $uninstall_script = DOCROOT.'/modules/'.$module_dir.'/update/uninstall.php'; + $uninstall_script = base_dir().'/modules/'.$module_dir.'/update/uninstall.php'; if (file_exists($uninstall_script)) { include_once $uninstall_script; } - delete(DOCROOT.'/modules/'.$module_dir.'/'); + delete(base_dir().'/modules/'.$module_dir.'/'); flash()->info(tr('Modulo "_MODULE_" disinstallato!', [ '_MODULE_' => $modulo, @@ -160,8 +160,8 @@ switch (filter('op')) { $dirs = [ $backup_dir => tr('Backup'), - DOCROOT.'/files' => tr('Allegati'), - DOCROOT.'/logs' => tr('Logs'), + base_dir().'/files' => tr('Allegati'), + base_dir().'/logs' => tr('Logs'), ]; foreach ($dirs as $dir => $description) { diff --git a/modules/stato_servizi/edit.php b/modules/stato_servizi/edit.php index 398a5b3ff..9dbcfadf1 100755 --- a/modules/stato_servizi/edit.php +++ b/modules/stato_servizi/edit.php @@ -77,9 +77,9 @@ foreach ($widgets as $widget) { // Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti if ($widget['enabled']) { - $stato = "".$stato."\n"; + $stato = "".$stato."\n"; } else { - $stato = "".$stato."\n"; + $stato = "".$stato."\n"; } // POSIZIONE @@ -91,10 +91,10 @@ foreach ($widgets as $widget) { if ($widget['location'] == 'controller_right') { $posizione = " "; - $posizione = "".$posizione."\n"; + $posizione = "".$posizione."\n"; } elseif ($widget['location'] == 'controller_top') { $posizione = " '; - $posizione = "".$posizione."\n"; + $posizione = "".$posizione."\n"; } echo ' diff --git a/modules/stato_servizi/modutil.php b/modules/stato_servizi/modutil.php index 0c445ea1d..d4a252819 100755 --- a/modules/stato_servizi/modutil.php +++ b/modules/stato_servizi/modutil.php @@ -41,9 +41,9 @@ function submodules($list, $depth = 0) // Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti if (!$locked) { if ($sub['enabled']) { - $stato = "".$stato."\n"; + $stato = "".$stato."\n"; } else { - $stato = "".$stato."\n"; + $stato = "".$stato."\n"; } } @@ -77,7 +77,7 @@ function submodules($list, $depth = 0) // Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti if (empty($sub['default'])) { $result .= ' - + "; } else { diff --git a/modules/stato_servizi/src/API/v1/FolderSize.php b/modules/stato_servizi/src/API/v1/FolderSize.php index c17e6f57c..423dd2f71 100755 --- a/modules/stato_servizi/src/API/v1/FolderSize.php +++ b/modules/stato_servizi/src/API/v1/FolderSize.php @@ -35,14 +35,14 @@ class FolderSize extends Resource implements RetrieveInterface $dirs = [ $backup_dir => tr('Backup'), - DOCROOT.'/files' => tr('Allegati'), - DOCROOT.'/logs' => tr('Logs'), + base_dir().'/files' => tr('Allegati'), + base_dir().'/logs' => tr('Logs'), ]; } else { $array = explode(',', $dirs); foreach ($array as $key => $value) { $dirs = [ - DOCROOT.'/'.$value => $key, + base_dir().'/'.$value => $key, ]; } } diff --git a/modules/stato_servizi/widgets/spazio_utilizzato.php b/modules/stato_servizi/widgets/spazio_utilizzato.php index 32f7c3972..ddb677378 100755 --- a/modules/stato_servizi/widgets/spazio_utilizzato.php +++ b/modules/stato_servizi/widgets/spazio_utilizzato.php @@ -22,7 +22,7 @@ include_once __DIR__.'/../../../core.php'; $module = Modules::get('Stato dei servizi'); echo ' -'; +'; // Operazioni JavaScript echo ' diff --git a/modules/tipi_intervento/src/Tipo.php b/modules/tipi_intervento/src/Tipo.php index e264fe885..31f7a46f4 100755 --- a/modules/tipi_intervento/src/Tipo.php +++ b/modules/tipi_intervento/src/Tipo.php @@ -19,11 +19,14 @@ namespace Modules\TipiIntervento; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Modules\Anagrafiche\Anagrafica; class Tipo extends Model { + use SimpleModelTrait; + protected $table = 'in_tipiintervento'; protected $primaryKey = 'idtipointervento'; @@ -38,7 +41,7 @@ class Tipo extends Model */ public static function build($codice, $descrizione) { - $model = parent::build(); + $model = new static(); $model->codice = $codice; $model->descrizione = $descrizione; diff --git a/modules/utenti/actions.php b/modules/utenti/actions.php index 532f60c02..c13e39743 100755 --- a/modules/utenti/actions.php +++ b/modules/utenti/actions.php @@ -116,7 +116,7 @@ switch (filter('op')) { $utente->save(); - redirect(ROOTDIR.'/modules/utenti/info.php'); + redirect(base_path().'/modules/utenti/info.php'); break; diff --git a/modules/utenti/info.php b/modules/utenti/info.php index fa7314817..33fb02c51 100755 --- a/modules/utenti/info.php +++ b/modules/utenti/info.php @@ -37,7 +37,7 @@ if (!empty($rs)) { $anagrafica = $rs[0]; } -$api = BASEURL.'/api/?token='.$token; +$api = base_url().'/api/?token='.$token; $module = Modules::get('Utenti e permessi'); echo ' diff --git a/modules/utenti/user.php b/modules/utenti/user.php index bee45d8e7..2858378d9 100755 --- a/modules/utenti/user.php +++ b/modules/utenti/user.php @@ -46,7 +46,7 @@ if (!empty($user)) { } echo ' - + diff --git a/modules/utenti/variables.php b/modules/utenti/variables.php index af0550ec7..c4c234d13 100755 --- a/modules/utenti/variables.php +++ b/modules/utenti/variables.php @@ -24,5 +24,5 @@ $reset_token = $record->reset_token; return [ 'username' => $record->username, 'reset_token' => $reset_token, - 'reset_link' => BASEURL.'/reset.php?reset_token='.$reset_token, + 'reset_link' => base_url().'/reset.php?reset_token='.$reset_token, ]; diff --git a/modules/viste/edit.php b/modules/viste/edit.php index 90d4c15bc..2c179e2e3 100755 --- a/modules/viste/edit.php +++ b/modules/viste/edit.php @@ -132,7 +132,7 @@ function testQuery(){ $("#main_loading").fadeIn(); $.ajax({ - url: "'.ROOTDIR.'/actions.php?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&op=test", + url: "'.base_path().'/actions.php?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&op=test", cache: false, type: "post", processData: false, diff --git a/package.json b/package.json index 2df9dca89..d38707385 100755 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "main": "gulpfile.js", "dependencies": { "admin-lte": "^2.4.0", + "autonumeric": "^4.6.0", "autosize": "^3.0.21", "bootstrap": "^3.3.7", "bootstrap-colorpicker": "2.5.1", diff --git a/pdfgen.php b/pdfgen.php index 755823113..e4a814a63 100755 --- a/pdfgen.php +++ b/pdfgen.php @@ -43,7 +43,7 @@ if (empty($result)) {
- + '.tr('Indietro').'
'; diff --git a/plugins/dettagli_articolo/src/DettaglioFornitore.php b/plugins/dettagli_articolo/src/DettaglioFornitore.php index 207f6181f..3cfc301cb 100644 --- a/plugins/dettagli_articolo/src/DettaglioFornitore.php +++ b/plugins/dettagli_articolo/src/DettaglioFornitore.php @@ -19,18 +19,20 @@ namespace Plugins\DettagliArticolo; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Modules\Anagrafiche\Anagrafica; use Modules\Articoli\Articolo; -/** +/* * Classe per la gestione delle relazioni tra articolo e fornitore. * * @since 2.4.15 */ class DettaglioFornitore extends Model { + use SimpleModelTrait; use SoftDeletes; protected $table = 'mg_fornitore_articolo'; @@ -42,7 +44,7 @@ class DettaglioFornitore extends Model */ public static function build(Anagrafica $fornitore, Articolo $articolo) { - $model = parent::build(); + $model = new static(); $model->anagrafica()->associate($fornitore); $model->articolo()->associate($articolo); diff --git a/plugins/dettagli_articolo/src/DettaglioPrezzo.php b/plugins/dettagli_articolo/src/DettaglioPrezzo.php index dc8733b43..e17abf646 100644 --- a/plugins/dettagli_articolo/src/DettaglioPrezzo.php +++ b/plugins/dettagli_articolo/src/DettaglioPrezzo.php @@ -19,18 +19,21 @@ namespace Plugins\DettagliArticolo; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Modules\Anagrafiche\Anagrafica; use Modules\Articoli\Articolo; use Modules\Iva\Aliquota; -/** +/* * Classe per la gestione delle relazioni articolo-prezzo sulla base di un range di quantità e di una specifica anagrafica. * * @since 2.4.18 */ class DettaglioPrezzo extends Model { + use SimpleModelTrait; + protected $table = 'mg_prezzi_articoli'; /** @@ -40,7 +43,7 @@ class DettaglioPrezzo extends Model */ public static function build(Articolo $articolo, Anagrafica $anagrafica, $direzione = 'uscita') { - $model = parent::build(); + $model = new static(); $model->anagrafica()->associate($anagrafica); $model->articolo()->associate($articolo); diff --git a/plugins/dichiarazioni_intento/src/Dichiarazione.php b/plugins/dichiarazioni_intento/src/Dichiarazione.php index ec319b0bb..dd9803216 100755 --- a/plugins/dichiarazioni_intento/src/Dichiarazione.php +++ b/plugins/dichiarazioni_intento/src/Dichiarazione.php @@ -19,18 +19,20 @@ namespace Plugins\DichiarazioniIntento; -use Common\Model; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Modules\Anagrafiche\Anagrafica; use Modules\Fatture\Fattura; -/** +/* * Classe per la gestione delle dichiarazione d'intento. * * @since 2.4.11 */ class Dichiarazione extends Model { + use SimpleModelTrait; use SoftDeletes; protected $table = 'co_dichiarazioni_intento'; @@ -48,7 +50,7 @@ class Dichiarazione extends Model */ public static function build(Anagrafica $anagrafica, $data, $numero_protocollo, $numero_progressivo, $data_inizio, $data_fine) { - $model = parent::build(); + $model = new static(); $model->anagrafica()->associate($anagrafica); diff --git a/plugins/exportFE/edit.php b/plugins/exportFE/edit.php index f324874a4..5f28a2f8c 100755 --- a/plugins/exportFE/edit.php +++ b/plugins/exportFE/edit.php @@ -86,7 +86,7 @@ echo ' - + '.tr('Visualizza').' '; @@ -143,7 +143,7 @@ if (!empty($record['codice_stato_fe'])) { if (!empty($ultima_ricevuta)) { echo ' - + '.tr('Visualizza ricevuta').' '; } diff --git a/plugins/exportFE/init.php b/plugins/exportFE/init.php index 26a965d8d..9bb387c53 100755 --- a/plugins/exportFE/init.php +++ b/plugins/exportFE/init.php @@ -26,4 +26,4 @@ try { } catch (UnexpectedValueException $e) { } -$upload_dir = DOCROOT.'/'.FatturaElettronica::getDirectory(); +$upload_dir = base_dir().'/'.FatturaElettronica::getDirectory(); diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 115bba7a9..a8e537081 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -85,7 +85,7 @@ class FatturaElettronica { $documento = $this->getDocumento(); - return !empty($documento['progressivo_invio']) && file_exists(DOCROOT.'/'.static::getDirectory().'/'.$this->getFilename()); + return !empty($documento['progressivo_invio']) && file_exists(base_dir().'/'.static::getDirectory().'/'.$this->getFilename()); } /** @@ -1185,8 +1185,8 @@ class FatturaElettronica $descrizione = str_replace('’', ' ', $descrizione); // Aggiunta dei riferimenti ai documenti - if (setting('Riferimento dei documenti in Fattura Elettronica') && $riga->hasOriginal()) { - $descrizione .= "\n".$riga->getOriginal()->parent->getReference(); + if (setting('Riferimento dei documenti in Fattura Elettronica') && $riga->hasOriginalComponent()) { + $descrizione .= "\n".$riga->getOriginalComponent()->getDocument()->getReference(); } $dettaglio['Descrizione'] = $descrizione; @@ -1454,7 +1454,7 @@ class FatturaElettronica // Inclusione foreach ($allegati as $allegato) { if ($allegato['category'] == 'Allegati Fattura Elettronica') { - $file = DOCROOT.'/'.$directory.'/'.$allegato['filename']; + $file = base_dir().'/'.$directory.'/'.$allegato['filename']; $attachments[] = [ 'NomeAttachment' => $allegato['name'], @@ -1482,7 +1482,7 @@ class FatturaElettronica $dir = static::getDirectory(); $print = Prints::getModulePredefinedPrint($id_module); - $info = Prints::render($print['id'], $documento['id'], DOCROOT.'/'.$dir); + $info = Prints::render($print['id'], $documento['id'], base_dir().'/'.$dir); $name = 'Stampa allegata'; $is_presente = database()->fetchNum('SELECT id FROM zz_files WHERE id_module = '.prepare($id_module).' AND id_record = '.prepare($documento['id']).' AND name = '.prepare($name)); diff --git a/plugins/exportFE/src/Interaction.php b/plugins/exportFE/src/Interaction.php index 2bc6d9bb3..79d8d0e07 100755 --- a/plugins/exportFE/src/Interaction.php +++ b/plugins/exportFE/src/Interaction.php @@ -33,7 +33,7 @@ class Interaction extends Services { try { $fattura = new FatturaElettronica($id_record); - $file = DOCROOT.'/'.FatturaElettronica::getDirectory().'/'.$fattura->getFilename(); + $file = base_dir().'/'.FatturaElettronica::getDirectory().'/'.$fattura->getFilename(); $response = static::request('POST', 'invio_fattura_xml', [ 'xml' => file_get_contents($file), diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index 3121efbab..9b4960216 100755 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -156,7 +156,7 @@ switch (filter('op')) { $process_result = Interaction::processInvoice($filename); if ($process_result != '') { flash()->error($process_result); - redirect(ROOTDIR.'/controller.php?id_module='.$id_module); + redirect(base_path().'/controller.php?id_module='.$id_module); return; } @@ -166,12 +166,12 @@ switch (filter('op')) { $file = $files[$id_record - 1]; if (get('sequence') == null) { - redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_fattura); + redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_fattura); } elseif (!empty($file)) { - redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&sequence=1'); + redirect(base_path().'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&sequence=1'); } else { flash()->info(tr('Tutte le fatture salvate sono state importate!')); - redirect(ROOTDIR.'/controller.php?id_module='.$id_module); + redirect(base_path().'/controller.php?id_module='.$id_module); } break; @@ -362,7 +362,7 @@ switch (filter('op')) { // Ricerca della riga $riga = $documento->getRiga($namespace.$type, $collegamento['id']); - $riga_origine = $riga->getOriginal(); + $riga_origine = $riga->getOriginalComponent(); // Compilazione dei dati $results[$key] = [ diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index ed73a39e8..23d6b21ea 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -28,7 +28,7 @@ $(document).ready(function() { }); '; -$skip_link = $has_next ? ROOTDIR.'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.($id_record + 1).'&sequence='.get('sequence') : ROOTDIR.'/editor.php?id_module='.$id_module; +$skip_link = $has_next ? base_path().'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.($id_record + 1).'&sequence='.get('sequence') : base_path().'/editor.php?id_module='.$id_module; if (empty($fattura_pa)) { if (!empty($error)) { diff --git a/plugins/importFE/init.php b/plugins/importFE/init.php index 27b0abe4b..3c2b1890d 100755 --- a/plugins/importFE/init.php +++ b/plugins/importFE/init.php @@ -43,6 +43,6 @@ if (isset($id_record)) { if (empty($record)) { flash()->warning(tr('Nessuna fattura da importare!')); - redirect(ROOTDIR.'/controller.php?id_module='.$id_module); + redirect(base_path().'/controller.php?id_module='.$id_module); } } diff --git a/plugins/importFE/riferimento.php b/plugins/importFE/riferimento.php index ad4cca9b0..95e2b6706 100755 --- a/plugins/importFE/riferimento.php +++ b/plugins/importFE/riferimento.php @@ -54,7 +54,7 @@ $id_riferimento = get('id_riferimento'); $righe = $documento->getRighe(); foreach ($righe as $riga) { $qta_rimanente = $riga->qta_rimanente - $righe_utilizzate[$riga->id]; - $riga_origine = $riga->getOriginal(); + $riga_origine = $riga->getOriginalComponent(); $dettagli = [ 'tipo' => get_class($riga), diff --git a/plugins/importFE/src/FatturaElettronica.php b/plugins/importFE/src/FatturaElettronica.php index 61f150592..8efad4761 100755 --- a/plugins/importFE/src/FatturaElettronica.php +++ b/plugins/importFE/src/FatturaElettronica.php @@ -92,7 +92,7 @@ class FatturaElettronica return $value->name == 'Fatturazione Elettronica'; }); - self::$directory = DOCROOT.'/'.$plugin->upload_directory; + self::$directory = base_dir().'/'.$plugin->upload_directory; } } diff --git a/plugins/importFE/src/Interaction.php b/plugins/importFE/src/Interaction.php index 10af3bb35..4df35bd4d 100755 --- a/plugins/importFE/src/Interaction.php +++ b/plugins/importFE/src/Interaction.php @@ -37,13 +37,15 @@ class Interaction extends Services $result = self::getFileList($list); // Aggiornamento cache hook - Cache::get('Fatture Elettroniche')->set($result); + Cache::pool('Fatture Elettroniche')->set($result); return $result; } public static function getRemoteList() { + $list = []; + // Ricerca da remoto if (self::isEnabled()) { $response = static::request('POST', 'fatture_da_importare'); @@ -54,7 +56,7 @@ class Interaction extends Services } } - return $list ?: []; + return $list; } public static function getFileList($list = []) diff --git a/plugins/importFE/src/InvoiceHook.php b/plugins/importFE/src/InvoiceHook.php index 90c7155ad..5f7d0a20d 100755 --- a/plugins/importFE/src/InvoiceHook.php +++ b/plugins/importFE/src/InvoiceHook.php @@ -36,7 +36,7 @@ class InvoiceHook extends CachedManager public function response() { - $results = $this->getCache()->content; + $results = (array) $this->getCache()->content; $count = count($results); $notify = false; @@ -51,7 +51,7 @@ class InvoiceHook extends CachedManager return $value->name == 'Fatturazione Elettronica'; }); - $link = ROOTDIR.'/controller.php?id_module='.$module->id.'#tab_'.$plugin->id; + $link = base_path().'/controller.php?id_module='.$module->id.'#tab_'.$plugin->id; } $message = tr('Ci sono _NUM_ fatture passive da importare', [ diff --git a/plugins/importFE/view.php b/plugins/importFE/view.php index ca01b1c8e..902b6bbbe 100755 --- a/plugins/importFE/view.php +++ b/plugins/importFE/view.php @@ -30,7 +30,7 @@ $xml->loadXML($content); // XSL $xsl = new DOMDocument(); -$xsl->load(DOCROOT.'/plugins/xml/asso-invoice.xsl'); +$xsl->load(base_dir().'/plugins/xml/asso-invoice.xsl'); // XSLT $xslt = new XSLTProcessor(); diff --git a/plugins/pianificazione_fatturazione/edit.php b/plugins/pianificazione_fatturazione/edit.php index 041ce4d04..2bbc1b4ea 100755 --- a/plugins/pianificazione_fatturazione/edit.php +++ b/plugins/pianificazione_fatturazione/edit.php @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -include_once __DIR__.'/../../../core.php'; +include_once __DIR__.'/../../core.php'; use Modules\Contratti\Contratto; use Modules\Contratti\Stato; diff --git a/plugins/pianificazione_fatturazione/src/Pianificazione.php b/plugins/pianificazione_fatturazione/src/Pianificazione.php index 7d1089677..d10474f14 100755 --- a/plugins/pianificazione_fatturazione/src/Pianificazione.php +++ b/plugins/pianificazione_fatturazione/src/Pianificazione.php @@ -45,7 +45,7 @@ class Pianificazione extends Document */ public static function build(Contratto $contratto, $data_scadenza) { - $model = parent::build(); + $model = new static(); $model->contratto()->associate($contratto); diff --git a/plugins/pianificazione_interventi/actions.php b/plugins/pianificazione_interventi/actions.php index 3461d7f1d..04983eb16 100755 --- a/plugins/pianificazione_interventi/actions.php +++ b/plugins/pianificazione_interventi/actions.php @@ -127,7 +127,7 @@ switch ($operazione) { $righe = $promemoria_originale->getRighe(); foreach ($righe as $riga) { $copia = $riga->replicate(); - $copia->setParent($promemoria_corrente); + $copia->setDocument($promemoria_corrente); $copia->save(); } diff --git a/plugins/pianificazione_interventi/edit.php b/plugins/pianificazione_interventi/edit.php index f699d396b..5a5f247cd 100755 --- a/plugins/pianificazione_interventi/edit.php +++ b/plugins/pianificazione_interventi/edit.php @@ -158,7 +158,7 @@ if (!$elenco_promemoria->isEmpty()) { - diff --git a/plugins/pianificazione_interventi/row-list.php b/plugins/pianificazione_interventi/row-list.php index f01536f3a..a7a72bed3 100755 --- a/plugins/pianificazione_interventi/row-list.php +++ b/plugins/pianificazione_interventi/row-list.php @@ -137,7 +137,7 @@ if (!$righe->isEmpty()) { if ($r['abilita_serial']) { echo ' - '; } diff --git a/plugins/pianificazione_interventi/src/Components/Articolo.php b/plugins/pianificazione_interventi/src/Components/Articolo.php index 17cb794ce..1b17c4dfe 100755 --- a/plugins/pianificazione_interventi/src/Components/Articolo.php +++ b/plugins/pianificazione_interventi/src/Components/Articolo.php @@ -28,8 +28,6 @@ class Articolo extends Article { use RelationTrait; - public $movimenta_magazzino = false; - protected $table = 'co_righe_promemoria'; /** diff --git a/plugins/pianificazione_interventi/src/Components/RelationTrait.php b/plugins/pianificazione_interventi/src/Components/RelationTrait.php index e8a954f83..e37652e14 100755 --- a/plugins/pianificazione_interventi/src/Components/RelationTrait.php +++ b/plugins/pianificazione_interventi/src/Components/RelationTrait.php @@ -25,19 +25,19 @@ trait RelationTrait { protected $disableOrder = true; - public function getParentID() + public function getDocumentID() { return 'id_promemoria'; } - public function parent() + public function document() { - return $this->belongsTo(Promemoria::class, $this->getParentID()); + return $this->belongsTo(Promemoria::class, $this->getDocumentID()); } public function contratto() { - return $this->parent(); + return $this->document(); } public function fixIvaIndetraibile() diff --git a/plugins/pianificazione_interventi/src/Promemoria.php b/plugins/pianificazione_interventi/src/Promemoria.php index 7d91b2d44..7e87a2fe3 100755 --- a/plugins/pianificazione_interventi/src/Promemoria.php +++ b/plugins/pianificazione_interventi/src/Promemoria.php @@ -29,6 +29,11 @@ class Promemoria extends Document { use RecordTrait; + /** + * @var bool Disabilita movimentazione automatica + */ + public static $movimenta_magazzino = false; + protected $table = 'co_promemoria'; /** @@ -49,7 +54,7 @@ class Promemoria extends Document */ public static function build(Contratto $contratto, TipoSessione $tipo, $data_richiesta) { - $model = parent::build(); + $model = new static(); $model->contratto()->associate($contratto); $model->tipo()->associate($tipo); diff --git a/plugins/pianificazione_interventi/widgets/promemoria_da_pianificare.php b/plugins/pianificazione_interventi/widgets/promemoria_da_pianificare.php index 6acfa66f7..67d56c7af 100644 --- a/plugins/pianificazione_interventi/widgets/promemoria_da_pianificare.php +++ b/plugins/pianificazione_interventi/widgets/promemoria_da_pianificare.php @@ -108,7 +108,7 @@ foreach ($raggruppamenti as $mese => $raggruppamento) { // Pulsanti echo ' - diff --git a/plugins/receiptFE/src/Interaction.php b/plugins/receiptFE/src/Interaction.php index 77c258ff3..5cfa51f75 100755 --- a/plugins/receiptFE/src/Interaction.php +++ b/plugins/receiptFE/src/Interaction.php @@ -37,7 +37,7 @@ class Interaction extends Services $result = self::getFileList($list); // Aggiornamento cache hook - Cache::get('Ricevute Elettroniche')->set($result); + Cache::pool('Ricevute Elettroniche')->set($result); return $list; } diff --git a/plugins/receiptFE/src/ReceiptHook.php b/plugins/receiptFE/src/ReceiptHook.php index 47f56f883..1b059624b 100755 --- a/plugins/receiptFE/src/ReceiptHook.php +++ b/plugins/receiptFE/src/ReceiptHook.php @@ -32,7 +32,7 @@ class ReceiptHook extends Manager public function needsExecution() { // Lettura cache - $todo_cache = Cache::get('Ricevute Elettroniche'); + $todo_cache = Cache::pool('Ricevute Elettroniche'); return !$todo_cache->isValid() || !empty($todo_cache->content); } @@ -40,8 +40,8 @@ class ReceiptHook extends Manager public function execute() { // Lettura cache - $todo_cache = Cache::get('Ricevute Elettroniche'); - $completed_cache = Cache::get('Ricevute Elettroniche importate'); + $todo_cache = Cache::pool('Ricevute Elettroniche'); + $completed_cache = Cache::pool('Ricevute Elettroniche importate'); // Refresh cache if (!$todo_cache->isValid()) { @@ -92,8 +92,8 @@ class ReceiptHook extends Manager public function response() { // Lettura cache - $todo_cache = Cache::get('Ricevute Elettroniche'); - $completed_cache = Cache::get('Ricevute Elettroniche importate'); + $todo_cache = Cache::pool('Ricevute Elettroniche'); + $completed_cache = Cache::pool('Ricevute Elettroniche importate'); $completed_number = count($completed_cache->content); $total_number = $completed_number + count($todo_cache->content); diff --git a/plugins/receiptFE/src/Ricevuta.php b/plugins/receiptFE/src/Ricevuta.php index 48638debd..240337e96 100755 --- a/plugins/receiptFE/src/Ricevuta.php +++ b/plugins/receiptFE/src/Ricevuta.php @@ -95,7 +95,7 @@ class Ricevuta if (!isset(self::$directory)) { $plugin = Plugins::get('Ricevute FE'); - self::$directory = DOCROOT.'/'.$plugin->upload_directory; + self::$directory = base_dir().'/'.$plugin->upload_directory; } return self::$directory; diff --git a/plugins/revisioni/edit.php b/plugins/revisioni/edit.php index 4266c46d4..dbccc1694 100755 --- a/plugins/revisioni/edit.php +++ b/plugins/revisioni/edit.php @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -include_once __DIR__.'/../../../core.php'; +include_once __DIR__.'/../../core.php'; $revisione_principale = $dbo->fetchOne('SELECT master_revision FROM co_preventivi WHERE id = '.prepare($id_record)); $revisioni = $dbo->fetchArray('SELECT * FROM co_preventivi WHERE master_revision = '.prepare($revisione_principale['master_revision']).' OR id = '.prepare($revisione_principale['master_revision']).' ORDER BY created_at'); echo " - + @@ -89,7 +89,7 @@ echo " '; echo " -
+ diff --git a/plugins/statistiche_anagrafiche/info.php b/plugins/statistiche_anagrafiche/info.php index 83d4cb211..bd9b3a17b 100755 --- a/plugins/statistiche_anagrafiche/info.php +++ b/plugins/statistiche_anagrafiche/info.php @@ -107,7 +107,7 @@ echo '
'.tr('Preventivi').' - '.($preventivi->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($preventivi->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$preventivi->count().'
@@ -122,7 +122,7 @@ echo '
'.tr('Contratti').' - '.($contratti->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($contratti->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$contratti->count().'
@@ -137,7 +137,7 @@ echo '
'.tr('Ordini cliente').' - '.($ordini_cliente->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($ordini_cliente->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$ordini_cliente->count().'
@@ -154,7 +154,7 @@ echo '
'.tr('Attività').' - '.($interventi->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($interventi->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$interventi->count().'
@@ -169,7 +169,7 @@ echo '
'.tr('Ddt in uscita').' - '.($ddt_uscita->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($ddt_uscita->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$ddt_uscita->count().'
@@ -184,7 +184,7 @@ echo '
'.tr('Fatture').' - '.($fatture_vendita->count() > 0 ? ''.tr('Visualizza').' ' : '').' + '.($fatture_vendita->count() > 0 ? ''.tr('Visualizza').' ' : '').'
'.$fatture_vendita->count().'
diff --git a/reset.php b/reset.php index bbcd4089d..126ac7b7f 100755 --- a/reset.php +++ b/reset.php @@ -44,7 +44,7 @@ switch (post('op')) { $utente->reset_token = secure_random_string(); $utente->save(); - $template = Template::get('Reset password'); + $template = Template::pool('Reset password'); $mail = Mail::build($utente, $template, $utente->id); $mail->addReceiver($utente->email); @@ -59,7 +59,7 @@ switch (post('op')) { flash()->error(tr("Errore durante la gestione della richiesta: si prega di contattare l'amministratore").'.'); } - redirect(ROOTDIR.'/index.php'); + redirect(base_path().'/index.php'); exit(); break; @@ -76,7 +76,7 @@ switch (post('op')) { flash()->info(tr('Password cambiata!')); - redirect(ROOTDIR.'/index.php'); + redirect(base_path().'/index.php'); exit(); break; } @@ -121,7 +121,7 @@ if (Auth::isBrute()) { echo '
- +

'.$pageTitle.'

diff --git a/src/AJAX.php b/src/AJAX.php index 826246150..4c1107bc9 100755 --- a/src/AJAX.php +++ b/src/AJAX.php @@ -58,7 +58,7 @@ class AJAX $files = self::find('ajax/select.php', false); // File di gestione predefinita - array_unshift($files, DOCROOT.'/ajax_select.php'); + array_unshift($files, base_dir().'/ajax_select.php'); foreach ($files as $file) { $results = self::getSelectResults($file, $resource, $elements, [ @@ -142,7 +142,7 @@ class AJAX $files = self::find('ajax/search.php'); // File di gestione predefinita - array_unshift($files, DOCROOT.'/ajax_search.php'); + array_unshift($files, base_dir().'/ajax_search.php'); $results = []; foreach ($files as $file) { @@ -166,7 +166,7 @@ class AJAX $files = self::find('ajax/complete.php'); // File di gestione predefinita - array_unshift($files, DOCROOT.'/ajax_complete.php'); + array_unshift($files, base_dir().'/ajax_complete.php'); foreach ($files as $file) { $result = self::getCompleteResults($file, $resource); @@ -206,10 +206,10 @@ class AJAX $list = []; foreach ($pieces as $piece) { // File nativi - $files = glob(DOCROOT.'/modules/{'.implode(',', $piece).'}/'.$file, GLOB_BRACE); + $files = glob(base_dir().'/modules/{'.implode(',', $piece).'}/'.$file, GLOB_BRACE); // File personalizzati - $custom_files = glob(DOCROOT.'/modules/{'.implode(',', $piece).'}/custom/'.$file, GLOB_BRACE); + $custom_files = glob(base_dir().'/modules/{'.implode(',', $piece).'}/custom/'.$file, GLOB_BRACE); // Pulizia dei file nativi che sono stati personalizzati foreach ($custom_files as $key => $value) { diff --git a/src/API/App/v1/Interventi.php b/src/API/App/v1/Interventi.php index 5089a0372..bb3a29f1b 100644 --- a/src/API/App/v1/Interventi.php +++ b/src/API/App/v1/Interventi.php @@ -233,7 +233,7 @@ class Interventi extends AppResource $constraint->aspectRatio(); }); - $img->save(DOCROOT.'/files/interventi/'.$firma_file); + $img->save(base_dir().'/files/interventi/'.$firma_file); return $firma_file; } diff --git a/src/API/Common/Allegato.php b/src/API/Common/Allegato.php index d76acafb1..725360939 100755 --- a/src/API/Common/Allegato.php +++ b/src/API/Common/Allegato.php @@ -52,7 +52,7 @@ class Allegato extends Resource implements RetrieveInterface, CreateInterface ->where('id_record', $request['id_record']) ->first(); if (!empty($upload)) { - download(DOCROOT.'/'.$upload->filepath, $upload->original_name); + download(base_dir().'/'.$upload->filepath, $upload->original_name); } return [ diff --git a/src/API/Common/Stampa.php b/src/API/Common/Stampa.php index 4801894a4..067a6a359 100755 --- a/src/API/Common/Stampa.php +++ b/src/API/Common/Stampa.php @@ -30,7 +30,7 @@ class Stampa extends Resource implements RetrieveInterface { $print = PrintTemplate::where('name', $request['name'])->first(); if (!empty($print)) { - $directory = DOCROOT.'/files/api'; + $directory = base_dir().'/files/api'; $data = Prints::render($print->id, $request['id_record'], $directory); download($data['path']); diff --git a/src/API/Common/Task.php b/src/API/Common/Task.php index 5548f5bdc..2832e68f8 100644 --- a/src/API/Common/Task.php +++ b/src/API/Common/Task.php @@ -44,22 +44,22 @@ class Task extends Resource implements RetrieveInterface, CreateInterface $database = database(); // Rimozione della registrazione del cron attuale - $ultima_esecuzione = Cache::get('Ultima esecuzione del cron'); + $ultima_esecuzione = Cache::pool('Ultima esecuzione del cron'); $ultima_esecuzione->set(null); // Segnalazione della chiusura al cron attuale - $cron_id = Cache::get('ID del cron'); + $cron_id = Cache::pool('ID del cron'); $cron_id->set(null); // Rimozione dell'eventuale blocco sul cron - $disattiva = Cache::get('Disabilita cron'); + $disattiva = Cache::pool('Disabilita cron'); $disattiva->set(null); // Salvataggio delle modifiche $database->commitTransaction(); // Attesa della conclusione per il cron precedente - $in_esecuzione = Cache::get('Cron in esecuzione'); + $in_esecuzione = Cache::pool('Cron in esecuzione'); while ($in_esecuzione->content) { $timestamp = (new Carbon())->addMinutes(1)->getTimestamp(); time_sleep_until($timestamp); @@ -81,7 +81,7 @@ class Task extends Resource implements RetrieveInterface, CreateInterface */ protected function request() { - $endpoint = BASEURL.'/cron.php'; + $endpoint = base_url().'/cron.php'; $postData = json_encode([]); $endpointParts = parse_url($endpoint); diff --git a/src/API/Manager.php b/src/API/Manager.php index ac10101de..e9111ff04 100755 --- a/src/API/Manager.php +++ b/src/API/Manager.php @@ -36,7 +36,7 @@ class Manager protected $type; /** - * @throws InvalidArgumentException + * @throws \InvalidArgumentException */ public function __construct($resource, $type, $version) { @@ -46,7 +46,7 @@ class Manager ->first(); if (empty($object)) { - throw new ResourceNotFound(); + throw new ResourceNotFound(); } $this->resource = $object; diff --git a/src/API/Response.php b/src/API/Response.php index 8c5d6b3ae..92a1b87af 100755 --- a/src/API/Response.php +++ b/src/API/Response.php @@ -211,7 +211,7 @@ class Response */ public static function isAPIRequest() { - return getURLPath() == slashes(ROOTDIR.'/api/index.php'); + return getURLPath() == slashes(base_path().'/api/index.php'); } /** @@ -221,7 +221,7 @@ class Response * * @return array */ - public function getRequest($raw = false) + public static function getRequest($raw = false) { $request = []; diff --git a/src/App.php b/src/App.php index 50af9661d..bb6b8095d 100755 --- a/src/App.php +++ b/src/App.php @@ -17,6 +17,8 @@ * along with this program. If not, see . */ +use Util\Messages; + /** * Classe per la gestione delle utenze. * @@ -24,12 +26,16 @@ */ class App { + public static $docroot; + public static $rootdir; + public static $baseurl; + /** @var array Identificativo del modulo corrente */ protected static $current_module; /** @var int Identificativo dell'elemento corrente */ protected static $current_element; - /** @var \Util\Messages Gestione dei messaggi flash */ + /** @var Messages Gestione dei messaggi flash */ protected static $flash = null; /** @var bool Stato di debug */ @@ -71,8 +77,8 @@ class App public static function getConfig() { if (empty(self::$config['db_host'])) { - if (file_exists(DOCROOT.'/config.inc.php')) { - include DOCROOT.'/config.inc.php'; + if (file_exists(base_dir().'/config.inc.php')) { + include base_dir().'/config.inc.php'; $config = get_defined_vars(); } else { @@ -116,13 +122,13 @@ class App /** * Restituisce l'oggetto dedicato alla gestione dei messaggi per l'utente. * - * @return \Util\Messages + * @return Messages */ public static function flash() { if (empty(self::$flash)) { $storage = null; - self::$flash = new \Util\Messages($storage, 'messages'); + self::$flash = new Messages($storage, 'messages'); } return self::$flash; @@ -131,8 +137,6 @@ class App /** * Individua i percorsi di base necessari per il funzionamento del gestionale. * Attenzione: questo metodo deve essere eseguito all'interno di un file nella cartella principale del progetto per permettere il corretto funzionamento degli URL. - * - * @return array */ public static function definePaths($docroot) { @@ -154,6 +158,10 @@ class App define('DOCROOT', $docroot); define('ROOTDIR', $rootdir); define('BASEURL', $baseurl); + + self::$docroot = $docroot; + self::$rootdir = $rootdir; + self::$baseurl = $baseurl; } } @@ -164,7 +172,7 @@ class App */ public static function getPaths() { - $assets = ROOTDIR.'/assets/dist'; + $assets = base_path().'/assets/dist'; return [ 'assets' => $assets, @@ -218,7 +226,7 @@ class App foreach ($lang_replace as $replace) { $name = str_replace('|lang|', $replace, $element); - if (file_exists(DOCROOT.str_replace(ROOTDIR, '', $name))) { + if (file_exists(base_dir().str_replace(base_path(), '', $name))) { $assets_element = $name; break; } @@ -293,7 +301,7 @@ class App */ public static function filepath($path, $file = null) { - $path = str_contains($path, DOCROOT) ? $path : DOCROOT.'/'.ltrim($path, '/'); + $path = str_contains($path, base_dir()) ? $path : base_dir().'/'.ltrim($path, '/'); $path = empty($file) ? $path : rtrim($path, '/').'/'.$file; $original_file = str_replace('|custom|', '', $path); @@ -316,8 +324,8 @@ class App */ protected static function getDefaultConfig() { - if (file_exists(DOCROOT.'/config.example.php')) { - include DOCROOT.'/config.example.php'; + if (file_exists(base_dir().'/config.example.php')) { + include base_dir().'/config.example.php'; } $db_host = ''; diff --git a/src/Backup.php b/src/Backup.php index 8ba8233f4..66a946855 100755 --- a/src/Backup.php +++ b/src/Backup.php @@ -18,6 +18,7 @@ */ use Ifsnop\Mysqldump\Mysqldump; +use Util\Generator; use Util\Zip; /** @@ -96,7 +97,7 @@ class Backup */ public static function readName($string) { - return Util\Generator::read(self::PATTERN, basename($string)); + return Generator::read(self::PATTERN, basename($string)); } /** @@ -168,14 +169,14 @@ class Backup ], ]; - if (starts_with($backup_dir, slashes(DOCROOT))) { + if (starts_with($backup_dir, slashes(base_dir()))) { $ignores['dirs'][] = basename($backup_dir); } // Creazione backup in formato ZIP if (extension_loaded('zip')) { $result = Zip::create([ - DOCROOT, + base_dir(), self::getDatabaseDirectory(), ], $backup_dir.'/'.$backup_name.'.zip', $ignores); } @@ -183,7 +184,7 @@ class Backup // Creazione backup attraverso la copia dei file else { $result = copyr([ - DOCROOT, + base_dir(), self::getDatabaseDirectory(), ], $backup_dir.'/'.$backup_name.'.zip', $ignores); } @@ -243,7 +244,7 @@ class Backup // fino a ripristino ultimato // Rimozione del database - $tables = include DOCROOT.'/update/tables.php'; + $tables = include base_dir().'/update/tables.php'; // Ripristino del database $database_file = $extraction_dir.'/database.sql'; @@ -260,19 +261,19 @@ class Backup } // Salva il file di configurazione - $config = file_get_contents(DOCROOT.'/config.inc.php'); + $config = file_get_contents(base_dir().'/config.inc.php'); // Copia i file dalla cartella temporanea alla root - copyr($extraction_dir, DOCROOT); + copyr($extraction_dir, base_dir()); // Ripristina il file di configurazione dell'installazione - file_put_contents(DOCROOT.'/config.inc.php', $config); + file_put_contents(base_dir().'/config.inc.php', $config); // Pulizia if (!empty($cleanup)) { delete($extraction_dir); } - delete(DOCROOT.'/database.sql'); + delete(base_dir().'/database.sql'); } /** @@ -296,7 +297,7 @@ class Backup */ protected static function getReplaces() { - return Util\Generator::getReplaces(); + return Generator::getReplaces(); } /** @@ -306,6 +307,6 @@ class Backup */ protected static function getNextName() { - return Util\Generator::generate(self::PATTERN); + return Generator::generate(self::PATTERN); } } diff --git a/include/src/Components/Row.php b/src/Common/Components/Accounting.php old mode 100755 new mode 100644 similarity index 86% rename from include/src/Components/Row.php rename to src/Common/Components/Accounting.php index ac990b8bc..44309a090 --- a/include/src/Components/Row.php +++ b/src/Common/Components/Accounting.php @@ -19,11 +19,34 @@ namespace Common\Components; -use Common\Document; use Illuminate\Database\Eloquent\Builder; use Modules\Iva\Aliquota; -abstract class Row extends Description +/** + * Classe dedicata alla gestione delle informazioni contabili standard di una componente dei Documenti. + * + * Prevede i seguenti campi nel database: + * + * @property float prezzo_unitario + * @property float iva_unitaria = prezzo_unitario * percentuale_iva + * @property float prezzo_unitario_ivato = prezzo_unitario + iva_unitaria + * @property float sconto_unitario + * @property float sconto_iva_unitario = sconto_unitario * percentuale_iva + * @property float sconto_unitario_ivato = sconto_unitario + sconto_iva_unitario + * + * Introduce i seguenti campi ausiliari: + * @property float imponibile = prezzo_unitario * qta + * @property float sconto = sconto_unitario * qta + * @property float totale_imponibile = (prezzo_unitario - sconto_unitario) * qta [Imponibile con sconto] + * @property float iva = (iva_unitaria - sconto_iva_unitario) * qta + * @property float totale = (prezzo_unitario_ivato - sconto_unitario_ivato) * qta [Totale imponibile con IVA] + * @property float importo = se incorpora_iva: totale, altrimenti: totale_imponibile + * + * Per una estensione del sistema dei totali (Rivalsa, Ritenuta, ...), si consiglia di introdurre un relativo Netto a pagare. [Fatture] + * + * @since 2.4.18 + */ +abstract class Accounting extends Component { protected $casts = [ 'qta' => 'float', @@ -43,224 +66,19 @@ abstract class Row extends Description 'max_qta', ]; - public static function build(Document $document, $bypass = false) - { - return parent::build($document, true); - } - - // Attributi di contabilità - - /** - * Restituisce l'imponibile dell'elemento (prezzo unitario senza IVA * qta). - * - * @return float - */ - public function getImponibileAttribute() - { - return $this->prezzo_unitario * $this->qta; - } - - /** - * Restituisce il totale imponibile dell'elemento (imponibile - sconto unitario senza IVA). - * - * @return float - */ - public function getTotaleImponibileAttribute() - { - $result = $this->prezzo_unitario >= 0 ? $this->imponibile : -$this->imponibile; - - $result -= $this->sconto; - - return $this->prezzo_unitario >= 0 ? $result : -$result; - } - - /** - * Restituisce il totale (imponibile + iva) dell'elemento. - * - * @return float - */ - public function getTotaleAttribute() - { - return ($this->prezzo_unitario_ivato - $this->sconto_unitario_ivato) * $this->qta; - } - - /** - * Restituisce l'importo (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita con IVA incorporata') per la riga. - * - * @return float - */ - public function getImportoAttribute() - { - return $this->incorporaIVA() ? $this->totale : $this->totale_imponibile; - } - - /** - * Restituisce la spesa (costo_unitario * qta) relativa all'elemento. - * - * @return float - */ - public function getSpesaAttribute() - { - return $this->costo_unitario * $this->qta; - } - - /** - * Restituisce il margine totale (imponibile - spesa) relativo all'elemento. - * - * @return float - */ - public function getMargineAttribute() - { - return $this->totale_imponibile - $this->spesa; - } - - /** - * Restituisce il margine percentuale relativo all'elemento. - * - * @return float - */ - public function getMarginePercentualeAttribute() - { - return (1 - ($this->spesa / $this->imponibile)) * 100; - } - - // Attributi della componente - - public function getIvaAttribute() - { - return ($this->iva_unitaria - $this->sconto_iva_unitario) * $this->qta; - } - public function getIvaIndetraibileAttribute() { return $this->iva / 100 * $this->aliquota->indetraibile; } - public function getIvaDetraibileAttribute() + public function aliquota() { - return $this->iva - $this->iva_indetraibile; + return $this->belongsTo(Aliquota::class, 'idiva'); } - public function getSubtotaleAttribute() + public function getIvaAttribute() { - return $this->imponibile; - } - - /** - * Restituisce lo sconto della riga corrente in euro. - * - * @return float - */ - public function getScontoAttribute() - { - return $this->qta * $this->sconto_unitario; - } - - /** - * Restituisce il tipo di sconto della riga corrente. - * - * @return float - */ - public function getTipoScontoAttribute() - { - return $this->sconto_percentuale ? 'PRC' : 'UNT'; - } - - /** - * Imposta l'identificatore dell'IVA. - * - * @param int $value - */ - public function setIdIvaAttribute($value) - { - $this->attributes['idiva'] = $value; - $this->load('aliquota'); - } - - /** - * Restituisce il prezzo unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga. - * - * @return float - */ - public function getPrezzoUnitarioCorrenteAttribute() - { - // Gestione IVA incorporata - if ($this->incorporaIVA()) { - return $this->prezzo_unitario_ivato; - } else { - return $this->prezzo_unitario; - } - } - - /** - * Restituisce lo sconto unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga. - * - * @return float - */ - public function getScontoUnitarioCorrenteAttribute() - { - // Gestione IVA incorporata - if ($this->incorporaIVA()) { - return $this->sconto_unitario_ivato; - } else { - return $this->sconto_unitario; - } - } - - /** - * Imposta il prezzo unitario (senza IVA) per la riga corrente. - * - * @param $value - */ - public function setPrezzoUnitarioAttribute($value) - { - $this->attributes['prezzo_unitario'] = $value; - $percentuale_iva = floatval($this->aliquota->percentuale) / 100; - - $this->attributes['iva_unitaria'] = $value * $percentuale_iva; // Calcolo IVA - $this->attributes['prezzo_unitario_ivato'] = $value + $this->attributes['iva_unitaria']; - } - - /** - * Imposta il prezzo unitario ivato (con IVA) per la riga corrente. - * - * @param $value - */ - public function setPrezzoUnitarioIvatoAttribute($value) - { - $this->attributes['prezzo_unitario_ivato'] = $value; - $percentuale_iva = floatval($this->aliquota->percentuale) / 100; - - $this->attributes['iva_unitaria'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA - $this->attributes['prezzo_unitario'] = $value - $this->attributes['iva_unitaria']; - } - - /** - * Imposta il sconto unitario (senza IVA) per la riga corrente. - * - * @param $value - */ - public function setScontoUnitarioAttribute($value) - { - $this->attributes['sconto_unitario'] = $value; - $percentuale_iva = floatval($this->aliquota->percentuale) / 100; - - $this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva; // Calcolo IVA - $this->attributes['sconto_unitario_ivato'] = $value + $this->attributes['sconto_iva_unitario']; - } - - /** - * Imposta il sconto unitario ivato (con IVA) per la riga corrente. - * - * @param $value - */ - public function setScontoUnitarioIvatoAttribute($value) - { - $this->attributes['sconto_unitario_ivato'] = $value; - $percentuale_iva = floatval($this->aliquota->percentuale) / 100; - - $this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA - $this->attributes['sconto_unitario'] = $value - $this->attributes['sconto_iva_unitario']; + return ($this->iva_unitaria - $this->sconto_iva_unitario) * $this->qta; } /** @@ -281,6 +99,114 @@ abstract class Row extends Description } } + /** + * Restituisce il totale (imponibile + iva) dell'elemento. + * + * @return float + */ + public function getTotaleAttribute() + { + return ($this->prezzo_unitario_ivato - $this->sconto_unitario_ivato) * $this->qta; + } + + /** + * Restituisce l'imponibile dell'elemento (prezzo unitario senza IVA * qta). + * + * @return float + */ + public function getImponibileAttribute() + { + return $this->prezzo_unitario * $this->qta; + } + + /** + * Restituisce il tipo di sconto della riga corrente. + * + * @return float + */ + public function getTipoScontoAttribute() + { + return $this->sconto_percentuale ? 'PRC' : 'UNT'; + } + + /** + * Restituisce il margine totale (imponibile - spesa) relativo all'elemento. + * + * @return float + */ + public function getMargineAttribute() + { + return $this->totale_imponibile - $this->spesa; + } + + /** + * Restituisce l'importo (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita con IVA incorporata') per la riga. + * + * @return float + */ + public function getImportoAttribute() + { + return $this->incorporaIVA() ? $this->totale : $this->totale_imponibile; + } + + /** + * Restituisce il totale imponibile dell'elemento (imponibile - sconto unitario senza IVA). + * + * @return float + */ + public function getTotaleImponibileAttribute() + { + $result = $this->prezzo_unitario >= 0 ? $this->imponibile : -$this->imponibile; + + $result -= $this->sconto; + + return $this->prezzo_unitario >= 0 ? $result : -$result; + } + + /** + * Imposta il sconto unitario ivato (con IVA) per la riga corrente. + * + * @param $value + */ + public function setScontoUnitarioIvatoAttribute($value) + { + $this->attributes['sconto_unitario_ivato'] = $value; + $percentuale_iva = floatval($this->aliquota->percentuale) / 100; + + $this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA + $this->attributes['sconto_unitario'] = $value - $this->attributes['sconto_iva_unitario']; + } + + /** + * Restituisce la spesa (costo_unitario * qta) relativa all'elemento. + * + * @return float + */ + public function getSpesaAttribute() + { + return $this->costo_unitario * $this->qta; + } + + public function getIvaDetraibileAttribute() + { + return $this->iva - $this->iva_indetraibile; + } + + /** + * Restituisce lo sconto unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga. + * + * @return float + */ + public function getScontoUnitarioCorrenteAttribute() + { + // Gestione IVA incorporata + if ($this->incorporaIVA()) { + return $this->sconto_unitario_ivato; + } else { + return $this->sconto_unitario; + } + } + /** * Imposta lo sconto secondo le informazioni indicate per valore e tipologia (UNT o PRC). * @@ -313,6 +239,104 @@ abstract class Row extends Description } } + public function incorporaIVA() + { + return $this->getDocument()->direzione == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA'); + } + + /** + * Imposta il prezzo unitario (senza IVA) per la riga corrente. + * + * @param $value + */ + public function setPrezzoUnitarioAttribute($value) + { + $this->attributes['prezzo_unitario'] = $value; + $percentuale_iva = floatval($this->aliquota->percentuale) / 100; + + $this->attributes['iva_unitaria'] = $value * $percentuale_iva; // Calcolo IVA + $this->attributes['prezzo_unitario_ivato'] = $value + $this->attributes['iva_unitaria']; + } + + /** + * Restituisce lo sconto della riga corrente in euro. + * + * @return float + */ + public function getScontoAttribute() + { + return $this->qta * $this->sconto_unitario; + } + + /** + * Restituisce il prezzo unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga. + * + * @return float + */ + public function getPrezzoUnitarioCorrenteAttribute() + { + // Gestione IVA incorporata + if ($this->incorporaIVA()) { + return $this->prezzo_unitario_ivato; + } else { + return $this->prezzo_unitario; + } + } + + /** + * Restituisce il margine percentuale relativo all'elemento. + * + * @return float + */ + public function getMarginePercentualeAttribute() + { + return $this->imponibile ? (1 - ($this->spesa / $this->imponibile)) * 100 : 100; + } + + /** + * Imposta il prezzo unitario ivato (con IVA) per la riga corrente. + * + * @param $value + */ + public function setPrezzoUnitarioIvatoAttribute($value) + { + $this->attributes['prezzo_unitario_ivato'] = $value; + $percentuale_iva = floatval($this->aliquota->percentuale) / 100; + + $this->attributes['iva_unitaria'] = $value * $percentuale_iva / (1 + $percentuale_iva); // Calcolo IVA + $this->attributes['prezzo_unitario'] = $value - $this->attributes['iva_unitaria']; + } + + /** + * Imposta il sconto unitario (senza IVA) per la riga corrente. + * + * @param $value + */ + public function setScontoUnitarioAttribute($value) + { + $this->attributes['sconto_unitario'] = $value; + $percentuale_iva = floatval($this->aliquota->percentuale) / 100; + + $this->attributes['sconto_iva_unitario'] = $value * $percentuale_iva; // Calcolo IVA + $this->attributes['sconto_unitario_ivato'] = $value + $this->attributes['sconto_iva_unitario']; + } + + /** + * Imposta l'identificatore dell'IVA. + * + * @param int $value + */ + public function setIdIvaAttribute($value) + { + $this->attributes['idiva'] = $value; + $this->load('aliquota'); + } + + public function getSubtotaleAttribute() + { + return $this->imponibile; + } + /** * Salva la riga, impostando i campi dipendenti dai singoli parametri. * @@ -329,33 +353,6 @@ abstract class Row extends Description return parent::save($options); } - public function aliquota() - { - return $this->belongsTo(Aliquota::class, 'idiva'); - } - - protected static function boot($bypass = false) - { - // Precaricamento Aliquota IVA - static::addGlobalScope('aliquota', function (Builder $builder) { - $builder->with('aliquota'); - }); - - parent::boot(true); - - $table = parent::getTableName(); - - if (!$bypass) { - static::addGlobalScope('rows', function (Builder $builder) use ($table) { - $builder->whereNull($table.'.idarticolo')->orWhere($table.'.idarticolo', '=', 0); - }); - - static::addGlobalScope('not_discounts', function (Builder $builder) use ($table) { - $builder->where($table.'.is_sconto', '=', 0); - }); - } - } - /** * Effettua i conti per il subtotale della riga. */ @@ -396,20 +393,13 @@ abstract class Row extends Description $this->attributes['tipo_sconto'] = $this->sconto_percentuale ? 'PRC' : 'UNT'; } - /** - * Azione personalizzata per la copia dell'oggetto (dopo la copia). - * - * @param $original - */ - protected function customAfterDataCopiaIn($original) + protected static function boot() { - $this->prezzo_unitario = $original->prezzo_unitario; + parent::boot(); - parent::customAfterDataCopiaIn($original); - } - - protected function incorporaIVA() - { - return $this->parent->direzione == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA'); + // Pre-caricamento Aliquota IVA + static::addGlobalScope('aliquota', function (Builder $builder) { + $builder->with('aliquota'); + }); } } diff --git a/include/src/Components/Article.php b/src/Common/Components/Article.php similarity index 89% rename from include/src/Components/Article.php rename to src/Common/Components/Article.php index daca2118d..65ef1790f 100755 --- a/include/src/Components/Article.php +++ b/src/Common/Components/Article.php @@ -20,15 +20,17 @@ namespace Common\Components; use Common\Document; +use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Builder; use Modules\Articoli\Articolo as Original; use Modules\Articoli\Movimento; use Plugins\DettagliArticolo\DettaglioFornitore; use UnexpectedValueException; -abstract class Article extends Row +abstract class Article extends Accounting { - public $movimenta_magazzino = true; + use SimpleModelTrait; + protected $abilita_movimentazione = true; protected $serialRowID = null; @@ -38,7 +40,8 @@ abstract class Article extends Row public static function build(Document $document, Original $articolo) { - $model = parent::build($document, true); + $model = new static(); + $model->setDocument($document); $model->articolo()->associate($articolo); @@ -49,18 +52,43 @@ abstract class Article extends Row return $model; } + public function isDescrizione() + { + return false; + } + + public function isSconto() + { + return false; + } + + public function isRiga() + { + return false; + } + + public function isArticolo() + { + return true; + } + + /** + * Metodo dedicato a gestire in automatico la movimentazione del magazzino in relazione all'articolo di riferimento sulla base delle caratteristiche del movimento (magazzino abilitato o meno). + * + * @param $qta + */ public function movimenta($qta) { - if (!$this->movimenta_magazzino) { + if (!$this->parent->movimenta_magazzino) { return; } $movimenta = true; // Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente - if ($this->hasOriginal()) { - $original = $this->getOriginal(); - $movimenta = !$original->movimenta_magazzino; + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); + $movimenta = !$original->getDocument()->movimenta_magazzino; } if ($movimenta) { @@ -70,7 +98,7 @@ abstract class Article extends Row public function getDirection() { - return $this->parent->direzione; + return $this->getDocument()->direzione; } /** @@ -242,7 +270,7 @@ abstract class Article extends Row protected function movimentaMagazzino($qta) { - $documento = $this->parent; + $documento = $this->getDocument(); $data = $documento->getReferenceDate(); $qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta; @@ -265,15 +293,14 @@ abstract class Article extends Row protected static function boot() { - // Precaricamento Articolo + parent::boot(); + + // Pre-caricamento Articolo static::addGlobalScope('articolo', function (Builder $builder) { $builder->with('articolo', 'dettaglioFornitore'); }); - parent::boot(true); - - $table = parent::getTableName(); - + $table = static::getTableName(); static::addGlobalScope('articles', function (Builder $builder) use ($table) { $builder->whereNotNull($table.'.idarticolo')->where($table.'.idarticolo', '<>', 0); }); @@ -341,18 +368,4 @@ abstract class Article extends Row { $this->articolo()->associate($original->articolo); } - - protected function customBeforeDataCopiaIn($original) - { - //$this->movimentazione(false); - - parent::customBeforeDataCopiaIn($original); - } - - protected function customAfterDataCopiaIn($original) - { - // $this->movimentazione(true); - - parent::customAfterDataCopiaIn($original); - } } diff --git a/include/src/Components/Description.php b/src/Common/Components/Component.php old mode 100755 new mode 100644 similarity index 62% rename from include/src/Components/Description.php rename to src/Common/Components/Component.php index 0fecba35a..3a1d511db --- a/include/src/Components/Description.php +++ b/src/Common/Components/Component.php @@ -20,12 +20,33 @@ namespace Common\Components; use Common\Document; -use Common\Model; +use Common\RowReference; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; +use InvalidArgumentException; -abstract class Description extends Model +/** + * Classe dedicata alla gestione delle informazioni di base dei componenti dei Documenti, e in particolare di: + * - Collegamento con il Documento do origine + * - Riferimento di origine + * - Riferimenti informativi tra righe di altri documenti + * - Importazione tra documenti distinti di un componente. + * + * @property string original_type + * @property string original_id + * + * @template T + * + * @since 2.4.18 + */ +abstract class Component extends Model { - use MorphTrait; + /** + * Componente di origine da cui il compontente corrente deriva. + * + * @var Component|null + */ + protected $original_model = null; protected $guarded = []; @@ -37,33 +58,56 @@ abstract class Description extends Model 'parent', ]; - public static function build(Document $document, $bypass = false) + public function hasOriginalComponent() { - $model = parent::build(); - - if (!$bypass) { - $model->is_descrizione = 1; - $model->qta = 1; - } - - $model->setParent($document); - - return $model; + return !empty($this->original_type) && !empty($this->getOriginalComponent()); } + public function getOriginalComponent() + { + if (!isset($this->original_model) && !empty($this->original_type)) { + $class = $this->original_type; + + $this->original_model = $class::find($this->original_id); + } + + return $this->original_model; + } + + public function referenceSources() + { + $class = get_class($this); + + return $this->hasMany(RowReference::class, 'target_id') + ->where('target_type', $class); + } + + public function referenceTargets() + { + $class = get_class($this); + + return $this->hasMany(RowReference::class, 'source_id') + ->where('source_type', $class); + } + + /** + * Restituisce l'eventuale limite sulla quantità massima derivato dal componente di origine. + * + * @return mixed|null + */ public function getMaxQtaAttribute() { - if (!$this->hasOriginal()) { + if (!$this->hasOriginalComponent()) { return null; } - $original = $this->getOriginal(); + $original = $this->getOriginalComponent(); return $original->qta_rimanente + $this->qta; } /** - * Modifica la quantità dell'elemento. + * Modifica la quantità del componente. * * @param float $value * @@ -74,8 +118,8 @@ abstract class Description extends Model $previous = $this->qta; $diff = $value - $previous; - if ($this->hasOriginal()) { - $original = $this->getOriginal(); + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); if ($original->qta_rimanente < $diff) { $diff = $original->qta_rimanente; @@ -85,8 +129,8 @@ abstract class Description extends Model $this->attributes['qta'] = $value; - if ($this->hasOriginal()) { - $original = $this->getOriginal(); + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); $original->qta_evasa += $diff; $original->save(); @@ -96,7 +140,7 @@ abstract class Description extends Model } /** - * Restituisce la quantità rimanente dell'elemento. + * Restituisce la quantità rimanente del componente. * * @return float */ @@ -105,6 +149,11 @@ abstract class Description extends Model return $this->qta - $this->qta_evasa; } + /** + * Gestisce la possibilità di eliminare il componente. + * + * @return bool + */ public function canDelete() { return true; @@ -113,22 +162,22 @@ abstract class Description extends Model public function delete() { if (!$this->canDelete()) { - throw new \InvalidArgumentException(); + throw new InvalidArgumentException(); } - if ($this->hasOriginal()) { - $original = $this->getOriginal(); + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); } $this->qta = 0; $result = parent::delete(); // Trigger per la modifica delle righe - $this->parent->triggerComponent($this); + $this->getDocument()->triggerComponent($this); // Trigger per l'evasione delle quantità - if ($this->hasOriginal()) { - $original->parent->triggerEvasione($this); + if ($this->hasOriginalComponent()) { + $original->getDocument()->triggerEvasione($this); } return $result; @@ -150,22 +199,12 @@ abstract class Description extends Model return $result; } - /** - * Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe. - */ - public function setParent(Document $document) - { - $this->parent()->associate($document); - - // Ordine delle righe - if (empty($this->disableOrder)) { - $this->order = orderValue($this->table, $this->getParentID(), $document->id); - } - } - /** * Copia l'oggetto (articolo, riga, descrizione) nel corrispettivo per il documento indicato. * + * @param Document $document Documento di destinazione + * @param float|null $qta Quantità da riportare + * * @return self */ public function copiaIn(Document $document, $qta = null) @@ -195,7 +234,7 @@ abstract class Description extends Model $model = new $object(); // Rimozione attributo in conflitto - unset($attributes[$model->getParentID()]); + unset($attributes[$model->getDocumentID()]); // Riferimento di origine per l'evasione automatica della riga $is_evasione = true; @@ -215,7 +254,7 @@ abstract class Description extends Model unset($attributes['original_type']); // Impostazione del genitore - $model->setParent($document); + $model->setDocument($document); // Azioni specifiche di inizializzazione $model->customInitCopiaIn($this); @@ -224,6 +263,9 @@ abstract class Description extends Model // Impostazione degli attributi $model = $object::find($model->id); + if (empty($model)) { + dd($model, $attributes, $object); + } $accepted = $model->getAttributes(); // Azioni specifiche precedenti @@ -241,10 +283,12 @@ abstract class Description extends Model } /** - * Imposta l'origine dell'elemento, restituendo un array contenente i replace da effettuare per modificare la descrizione in modo coerente. + * Imposta l'origine del componente, restituendo un array contenente i replace da effettuare per modificare la descrizione in modo coerente. * - * @param $type - * @param $id + * @param string $type + * @param string $id + * + * @return array */ public function impostaOrigine($type, $id) { @@ -252,8 +296,8 @@ abstract class Description extends Model $nuovo_riferimento = null; // Rimozione del riferimento precedente dalla descrizione - if ($this->hasOriginal()) { - $riferimento = $this->getOriginal()->parent->getReference(); + if ($this->hasOriginalComponent()) { + $riferimento = $this->getOriginalComponent()->getDocument()->getReference(); $riferimento_precedente = "\nRif. ".strtolower($riferimento); } @@ -263,49 +307,57 @@ abstract class Description extends Model // Aggiunta del riferimento nella descrizione $origine = $type::find($id); if (!empty($origine)) { - $riferimento = $origine->parent->getReference(); + $riferimento = $origine->getDocument()->getReference(); $nuovo_riferimento = "\nRif. ".strtolower($riferimento); } return [$riferimento_precedente, $nuovo_riferimento]; } - abstract public function parent(); - - abstract public function getParentID(); - - public function isDescrizione() + /** + * Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe. + * + * @param Document $document Documento di riferimento + * @psalm-param T $document + */ + public function setDocument(Document $document) { - return !$this->isArticolo() && !$this->isSconto() && !$this->isRiga() && $this instanceof Description; + $this->document()->associate($document); + + // Ordine delle righe + if (empty($this->disableOrder)) { + $this->order = orderValue($this->table, $this->getDocumentID(), $document->id); + } } - public function isSconto() + /** + * @return Document + * @psalm-return T + */ + public function getDocument() { - return $this instanceof Discount; + return $this->document; } - public function isRiga() - { - return !$this->isArticolo() && !$this->isSconto() && $this instanceof Row; - } + abstract public function document(); - public function isArticolo() - { - return $this instanceof Article; - } + /** + * @return string + */ + abstract public function getDocumentID(); public function save(array $options = []) { $result = parent::save($options); // Trigger per la modifica delle righe - $this->parent->triggerComponent($this); + $this->getDocument()->triggerComponent($this); // Trigger per l'evasione delle quantità - if ($this->hasOriginal()) { - $original = $this->getOriginal(); + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); - $original->parent->triggerEvasione($this); + $original->getDocument()->triggerEvasione($this); } return $result; @@ -318,8 +370,6 @@ abstract class Description extends Model */ protected function customInitCopiaIn($original) { - $this->is_descrizione = $original->is_descrizione; - $this->is_sconto = $original->is_sconto; } /** @@ -340,25 +390,13 @@ abstract class Description extends Model { } - protected static function boot($bypass = false) + protected static function boot() { - // Precaricamento Documento - static::addGlobalScope('parent', function (Builder $builder) { - $builder->with('parent'); + // Pre-caricamento Documento + static::addGlobalScope('document', function (Builder $builder) { + $builder->with('document'); }); parent::boot(); - - $table = parent::getTableName(); - - if (!$bypass) { - static::addGlobalScope('descriptions', function (Builder $builder) use ($table) { - $builder->where($table.'.is_descrizione', '=', 1); - }); - } else { - static::addGlobalScope('not_descriptions', function (Builder $builder) use ($table) { - $builder->where($table.'.is_descrizione', '=', 0); - }); - } } } diff --git a/src/Common/Components/Description.php b/src/Common/Components/Description.php new file mode 100755 index 000000000..6a48698da --- /dev/null +++ b/src/Common/Components/Description.php @@ -0,0 +1,82 @@ +. + */ + +namespace Common\Components; + +use Common\Document; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Builder; + +abstract class Description extends Component +{ + use SimpleModelTrait; + + public static function build(Document $document) + { + $model = new static(); + + $model->is_descrizione = 1; + $model->qta = 1; + + $model->setDocument($document); + + return $model; + } + + public function isDescrizione() + { + return true; + } + + public function isSconto() + { + return false; + } + + public function isRiga() + { + return false; + } + + public function isArticolo() + { + return false; + } + + /** + * Azione personalizzata per la copia dell'oggetto (inizializzazione della copia). + * + * @param $original + */ + protected function customInitCopiaIn($original) + { + $this->is_descrizione = $original->is_descrizione; + } + + protected static function boot($bypass = false) + { + // Pre-caricamento Documento + parent::boot(); + + $table = static::getTableName(); + static::addGlobalScope('descriptions', function (Builder $builder) use ($table) { + $builder->where($table.'.is_descrizione', '=', 1); + }); + } +} diff --git a/include/src/Components/Discount.php b/src/Common/Components/Discount.php similarity index 74% rename from include/src/Components/Discount.php rename to src/Common/Components/Discount.php index a572f59cc..b9f4101bd 100755 --- a/include/src/Components/Discount.php +++ b/src/Common/Components/Discount.php @@ -20,15 +20,19 @@ namespace Common\Components; use Common\Document; +use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Builder; -abstract class Discount extends Row +abstract class Discount extends Accounting { + use SimpleModelTrait; + protected $guarded = []; public static function build(Document $document) { - $model = parent::build($document, true); + $model = new static(); + $model->setDocument($document); $model->is_sconto = 1; $model->qta = 1; @@ -36,6 +40,26 @@ abstract class Discount extends Row return $model; } + public function isDescrizione() + { + return false; + } + + public function isSconto() + { + return true; + } + + public function isRiga() + { + return false; + } + + public function isArticolo() + { + return false; + } + public function getIvaAttribute() { return $this->attributes['iva']; @@ -61,12 +85,16 @@ abstract class Discount extends Row $this->fixIvaIndetraibile(); } + protected function customInitCopiaIn($original) + { + $this->is_sconto = $original->is_sconto; + } + protected static function boot($bypass = false) { - parent::boot(true); - - $table = parent::getTableName(); + parent::boot(); + $table = static::getTableName(); static::addGlobalScope('discounts', function (Builder $builder) use ($table) { $builder->where($table.'.is_sconto', '=', 1); }); diff --git a/src/Common/Components/Row.php b/src/Common/Components/Row.php new file mode 100755 index 000000000..e0d2b267f --- /dev/null +++ b/src/Common/Components/Row.php @@ -0,0 +1,87 @@ +. + */ + +namespace Common\Components; + +use Common\Document; +use Common\SimpleModelTrait; +use Illuminate\Database\Eloquent\Builder; + +abstract class Row extends Accounting +{ + use SimpleModelTrait; + + public static function build(Document $document) + { + $model = new static(); + $model->setDocument($document); + + return $model; + } + + public function isDescrizione() + { + return false; + } + + public function isSconto() + { + return false; + } + + public function isRiga() + { + return true; + } + + public function isArticolo() + { + return false; + } + + protected static function boot() + { + parent::boot(); + + $table = static::getTableName(); + static::addGlobalScope('not_articles', function (Builder $builder) use ($table) { + $builder->whereNull($table.'.idarticolo')->orWhere($table.'.idarticolo', '=', 0); + }); + + static::addGlobalScope('not_discounts', function (Builder $builder) use ($table) { + $builder->where($table.'.is_sconto', '=', 0); + }); + + static::addGlobalScope('not_descriptions', function (Builder $builder) use ($table) { + $builder->where($table.'.is_descrizione', '=', 0); + }); + } + + /** + * Azione personalizzata per la copia dell'oggetto (dopo la copia). + * + * @param $original + */ + protected function customAfterDataCopiaIn($original) + { + $this->prezzo_unitario = $original->prezzo_unitario; + + parent::customAfterDataCopiaIn($original); + } +} diff --git a/include/src/Document.php b/src/Common/Document.php similarity index 82% rename from include/src/Document.php rename to src/Common/Document.php index e7d3e5f8f..45b2d704a 100755 --- a/include/src/Document.php +++ b/src/Common/Document.php @@ -19,15 +19,28 @@ namespace Common; -use Common\Components\Description; +use Common\Components\Component; +use Illuminate\Database\Eloquent\Model as Model; -abstract class Document extends Model implements ReferenceInterface +abstract class Document extends Model implements ReferenceInterface, DocumentInterface { /** - * Restituisce la collezione di righe e articoli con valori rilevanti per i conti. + * Abilita la movimentazione automatica degli Articoli, finalizzata alla gestione interna del magazzino. * - * @return iterable + * @var bool */ + public static $movimenta_magazzino = true; + + /** + * Restituisce il valore della variabile statica $movimenta_magazzino per il documento. + * + * @return bool + */ + public function getMovimentaMagazzinoAttribute() + { + return static::$movimenta_magazzino; + } + public function getRighe() { $results = $this->mergeCollections($this->descrizioni, $this->righe, $this->articoli, $this->sconti); @@ -37,14 +50,6 @@ abstract class Document extends Model implements ReferenceInterface }); } - /** - * Restituisce la riga identificata dall'ID indicato. - * - * @param $type - * @param $id - * - * @return mixed - */ public function getRiga($type, $id) { $righe = $this->getRighe(); @@ -54,22 +59,16 @@ abstract class Document extends Model implements ReferenceInterface }); } - /** - * Restituisce la collezione di righe e articoli con valori rilevanti per i conti, raggruppate sulla base dei documenti di provenienza. - * La chiave è la serializzazione del documento di origine, oppure null in caso non esista. - * - * @return iterable - */ public function getRigheRaggruppate() { $righe = $this->getRighe(); $groups = $righe->groupBy(function ($item, $key) { - if (!$item->hasOriginal()) { + if (!$item->hasOriginalComponent()) { return null; } - $parent = $item->getOriginal()->parent; + $parent = $item->getOriginalComponent()->getDocument(); return serialize($parent); }); @@ -87,6 +86,16 @@ abstract class Document extends Model implements ReferenceInterface abstract public function getDirezioneAttribute(); + public function triggerEvasione(Component $trigger) + { + $this->setRelations([]); + } + + public function triggerComponent(Component $trigger) + { + $this->setRelations([]); + } + /** * Calcola l'imponibile del documento. * @@ -164,7 +173,7 @@ abstract class Document extends Model implements ReferenceInterface */ public function getMarginePercentualeAttribute() { - return (1 - ($this->spesa / ($this->totale_imponibile))) * 100; + return $this->imponibile ? (1 - ($this->spesa / $this->totale_imponibile)) * 100 : 100; } public function delete() @@ -187,24 +196,6 @@ abstract class Document extends Model implements ReferenceInterface return parent::delete(); } - /** - * Metodo richiamato a seguito di modifiche sull'evasione generale delle righe del documento. - * Utilizzabile per l'impostazione automatica degli stati. - */ - public function triggerEvasione(Description $trigger) - { - $this->setRelations([]); - } - - /** - * Metodo richiamato a seguito della modifica o creazione di una riga del documento. - * Utilizzabile per limpostazione automatica di campi statici del documento. - */ - public function triggerComponent(Description $trigger) - { - $this->setRelations([]); - } - public function toArray() { $array = parent::toArray(); diff --git a/src/Common/DocumentInterface.php b/src/Common/DocumentInterface.php new file mode 100644 index 000000000..f9435052a --- /dev/null +++ b/src/Common/DocumentInterface.php @@ -0,0 +1,69 @@ +. + */ + +namespace Common; + +use Common\Components\Component; + +interface DocumentInterface +{ + /** + * Restituisce la collezione di righe e articoli con valori rilevanti per i conti. + * + * @return iterable + */ + public function getRighe(); + + /** + * Restituisce la riga identificata dall'ID indicato. + * + * @param $type + * @param $id + * + * @return mixed + */ + public function getRiga($type, $id); + + /** + * Restituisce la collezione di righe e articoli con valori rilevanti per i conti, raggruppate sulla base dei documenti di provenienza. + * La chiave è la serializzazione del documento di origine, oppure null in caso non esista. + * + * @return iterable + */ + public function getRigheRaggruppate(); + + /** + * Restituisce la direzione in relazione al flusso di denaro impostata per il documento. + * + * @return string 'entrata'|'uscita' + */ + public function getDirezioneAttribute(); + + /** + * Metodo richiamato a seguito di modifiche sull'evasione generale delle righe del documento. + * Utilizzabile per l'impostazione automatica degli stati. + */ + public function triggerEvasione(Component $trigger); + + /** + * Metodo richiamato a seguito della modifica o creazione di una riga del documento. + * Utilizzabile per l'impostazione automatica di campi statici del documento. + */ + public function triggerComponent(Component $trigger); +} diff --git a/src/Common/Model.php b/src/Common/Model.php new file mode 100755 index 000000000..8b16bb808 --- /dev/null +++ b/src/Common/Model.php @@ -0,0 +1,30 @@ +. + */ + +namespace Common; + +use Illuminate\Database\Eloquent\Model as Original; + +/** + * @deprecated 2.4.18 + */ +abstract class Model extends Original +{ + use SimpleModelTrait; +} diff --git a/include/src/ReferenceInterface.php b/src/Common/ReferenceInterface.php similarity index 100% rename from include/src/ReferenceInterface.php rename to src/Common/ReferenceInterface.php diff --git a/include/src/RowReference.php b/src/Common/RowReference.php similarity index 97% rename from include/src/RowReference.php rename to src/Common/RowReference.php index 84fda3f44..970082ad3 100644 --- a/include/src/RowReference.php +++ b/src/Common/RowReference.php @@ -21,6 +21,8 @@ namespace Common; class RowReference extends Model { + use SimpleModelTrait; + protected $table = 'co_riferimenti_righe'; public function source() diff --git a/include/src/Model.php b/src/Common/SimpleModelTrait.php old mode 100755 new mode 100644 similarity index 93% rename from include/src/Model.php rename to src/Common/SimpleModelTrait.php index 49ef79ddc..735bb7753 --- a/include/src/Model.php +++ b/src/Common/SimpleModelTrait.php @@ -19,9 +19,7 @@ namespace Common; -use Illuminate\Database\Eloquent\Model as Original; - -abstract class Model extends Original +trait SimpleModelTrait { // Retrocompatibilità MySQL public function setUpdatedAtAttribute($value) @@ -29,6 +27,11 @@ abstract class Model extends Original // to Disable updated_at } + public static function getTableName() + { + return with(new static())->getTable(); + } + /** * Crea una nuova istanza del modello. * @@ -38,9 +41,4 @@ abstract class Model extends Original { return new static(); } - - public static function getTableName() - { - return with(new static())->getTable(); - } } diff --git a/src/Extensions/EloquentCollector.php b/src/Extensions/EloquentCollector.php index 58584b1ea..b83ce08f3 100755 --- a/src/Extensions/EloquentCollector.php +++ b/src/Extensions/EloquentCollector.php @@ -19,6 +19,9 @@ namespace Extensions; +use Illuminate\Database\Capsule\Manager; +use PDO; + class EloquentCollector extends \DebugBar\DataCollector\PDO\PDOCollector { protected $capsule; @@ -54,7 +57,7 @@ class EloquentCollector extends \DebugBar\DataCollector\PDO\PDOCollector } /** - * @return Illuminate\Database\Capsule\Manager; + * @return Manager; */ protected function getEloquentCapsule() { diff --git a/src/HTMLBuilder/HTMLBuilder.php b/src/HTMLBuilder/HTMLBuilder.php index d37fef186..2595532e8 100755 --- a/src/HTMLBuilder/HTMLBuilder.php +++ b/src/HTMLBuilder/HTMLBuilder.php @@ -93,7 +93,7 @@ class HTMLBuilder 'list' => [ 'filelist_and_upload' => Manager\FileManager::class, 'button' => Manager\ButtonManager::class, - 'csrf' => Manager\CSRFManager::class, + //'csrf' => Manager\CSRFManager::class, 'custom_fields' => Manager\FieldManager::class, 'widgets' => Manager\WidgetManager::class, 'log_email' => Manager\EmailManager::class, @@ -195,9 +195,7 @@ class HTMLBuilder } // Ricorsione - if ($depth < self::$max_recursion) { - $result = self::replace($result, $depth + 1); - } + $result = self::replace($result); return !empty($result) ? $result : json_encode($json); } @@ -318,7 +316,7 @@ class HTMLBuilder $class = is_object($class) ? $class : new $class(); - if ($class instanceof Handler\ManagerInterface) { + if ($class instanceof Manager\ManagerInterface) { self::$managers['list'][$input] = $original; self::$managers['instances'][$original] = $class; } @@ -327,8 +325,7 @@ class HTMLBuilder /** * Imposta l'oggetto responsabile per la costruzione del codice HTML per il tag personalizzato. * - * @param string $input - * @param string|mixed $class + * @param array $record */ public static function setRecord($record) { diff --git a/src/HTMLBuilder/Handler/CKEditorHandler.php b/src/HTMLBuilder/Handler/CKEditorHandler.php index 0fd14fdbe..1004a4231 100755 --- a/src/HTMLBuilder/Handler/CKEditorHandler.php +++ b/src/HTMLBuilder/Handler/CKEditorHandler.php @@ -31,7 +31,7 @@ class CKEditorHandler implements HandlerInterface // Generazione del codice HTML return ' - + + @@ -241,10 +240,10 @@ $(document).ready(function() { addRemoveLinks: false, autoProcessQueue: true, autoQueue: true, - url: "'.ROOTDIR.'/actions.php?op=link_file&id_module='.$options['id_module'].'&id_record='.$options['id_record'].'&id_plugin='.$options['id_plugin'].'", + url: "'.base_path().'/actions.php?op=link_file&id_module='.$options['id_module'].'&id_record='.$options['id_record'].'&id_plugin='.$options['id_plugin'].'", init: function (file, xhr, formData) { this.on("sending", function(file, xhr, formData) { - formData.append("categoria", $("#categoria").val()); + formData.append("categoria", $("#categoria_allegato").val()); formData.append("nome_allegato", $("#nome_allegato").val()); }); @@ -323,7 +322,7 @@ $(document).ready(function() { }); // Autocompletamento categoria - $("#'.$attachment_id.' #categoria").autocomplete({ + $("#'.$attachment_id.' #categoria_allegato").autocomplete({ source: '.json_encode($source).', minLength: 0 }).focus(function() { diff --git a/src/HTMLBuilder/Manager/WidgetManager.php b/src/HTMLBuilder/Manager/WidgetManager.php index d6f79da5f..6a0965c17 100755 --- a/src/HTMLBuilder/Manager/WidgetManager.php +++ b/src/HTMLBuilder/Manager/WidgetManager.php @@ -19,6 +19,8 @@ namespace HTMLBuilder\Manager; +use Util\Query; + /** * @since 2.4 */ @@ -96,7 +98,7 @@ class WidgetManager implements ManagerInterface $query = str_replace('1=1', '1=1 '.$additionals, $query); } - $query = \Util\Query::replacePlaceholder($query); + $query = Query::replacePlaceholder($query); // Individuazione del risultato della query $database = database(); @@ -118,7 +120,7 @@ class WidgetManager implements ManagerInterface $is_title_request = true; ob_start(); - include DOCROOT.'/'.$widget['php_include']; + include base_dir().'/'.$widget['php_include']; $content = ob_get_clean(); } @@ -131,7 +133,7 @@ class WidgetManager implements ManagerInterface if (!empty($widget['php_include'])) { $is_number_request = true; ob_start(); - include DOCROOT.'/'.$widget['php_include']; + include base_dir().'/'.$widget['php_include']; $content = ob_get_clean(); } @@ -141,7 +143,7 @@ class WidgetManager implements ManagerInterface protected function render($widget, $title, $number = null) { $result = ' - '; @@ -163,7 +165,7 @@ class WidgetManager implements ManagerInterface elseif ($widget['more_link_type'] == 'javascript') { $link = $widget['more_link']; - $link = \Util\Query::replacePlaceholder($link); + $link = Query::replacePlaceholder($link); $result .= 'onclick="'.$link.'"'; } diff --git a/src/HTMLBuilder/Wrapper/HTMLWrapper.php b/src/HTMLBuilder/Wrapper/HTMLWrapper.php index 9a839f3dc..af70a2bc9 100755 --- a/src/HTMLBuilder/Wrapper/HTMLWrapper.php +++ b/src/HTMLBuilder/Wrapper/HTMLWrapper.php @@ -106,8 +106,8 @@ class HTMLWrapper implements WrapperInterface $value = explode('|', $values['validation']); $name = $value[0]; - $id_module = $value[1] ?: '$id_module$'; - $id_record = $value[2] ?: '$id_record$'; + $id_module = isset($value[1]) ? $value[1] : '$id_module$'; + $id_record = isset($value[2]) ? $value[2] : '$id_record$'; $result .= '