Merge branch 'master' into revisione-banche

This commit is contained in:
Dasc3er 2020-09-24 15:09:31 +02:00
commit 481fcb7c8d
345 changed files with 7878 additions and 6526 deletions

6
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

@ -72,7 +72,7 @@ switch (filter('op')) {
break;
case 'checklists':
include DOCROOT.'/plugins/checks.php';
include base_dir().'/plugins/checks.php';
break;

View File

@ -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'],
'<span class="hide" data-id="'.$r['id'].'"></span>', // 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), '<div |attr|>'.$value.'</div>');
}

View File

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

View File

@ -1041,6 +1041,10 @@ div.tip {
background: #222222;
}
.decimal-number {
text-align: right;
}
/* Loading specificato per un div */
.local-loader {
position: relative;

View File

@ -16,12 +16,21 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// 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<unknown>}
*/
function salvaForm(button, form, data = {}) {
return new Promise(function (resolve, reject) {
// Caricamento visibile nel pulsante

View File

@ -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 <https://www.gnu.org/licenses/>.
*/
/**
* 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');
}
}

View File

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

View File

@ -118,6 +118,7 @@ function selectBackground(data, container) {
return data.text;
}
/**
* Reimposta i contenuti di un <select> creato con select2.
*/
@ -206,11 +207,16 @@ jQuery.fn.selectData = function () {
let selectData = this.select2('data');
if (this.prop('multiple')) {
return selectData;
let results = [];
for (const option of selectData) {
results.push(option.element.dataset);
}
return results;
} else if (selectData.length === 0) {
return undefined;
} else {
return selectData[0];
return selectData[0].element.dataset;
}
};

View File

@ -38,13 +38,13 @@ if (filter('op') == 'send') {
$mail->Subject = 'Segnalazione bug OSM '.$version;
// Aggiunta dei file di log (facoltativo)
if (!empty(post('log')) && file_exists($docroot.'/logs/error.log')) {
$mail->AddAttachment($docroot.'/logs/error.log');
if (!empty(post('log')) && file_exists(base_dir().'/logs/error.log')) {
$mail->AddAttachment(base_dir().'/logs/error.log');
}
// Aggiunta della copia del database (facoltativo)
if (!empty(post('sql'))) {
$backup_file = $docroot.'/Backup OSM '.date('Y-m-d').' '.date('H_i_s').'.sql';
$backup_file = base_dir().'/Backup OSM '.date('Y-m-d').' '.date('H_i_s').'.sql';
Backup::database($backup_file);
$mail->AddAttachment($backup_file);
@ -87,7 +87,7 @@ if (filter('op') == 'send') {
delete($backup_file);
}
redirect($rootdir.'/bug.php');
redirect(base_path().'/bug.php');
exit();
}

View File

@ -64,7 +64,46 @@
"autoload": {
"psr-4": {
"": "src/",
"Update\\": "update/"
"Update\\": "update/",
"Modules\\Aggiornamenti\\": ["modules/aggiornamenti/custom/src/", "modules/aggiornamenti/src/"],
"Modules\\Anagrafiche\\": ["modules/anagrafiche/custom/src/", "modules/anagrafiche/src/"],
"Modules\\Backups\\": ["modules/backups/custom/src/", "modules/backups/src/"],
"Modules\\Emails\\": ["modules/emails/custom/src/", "modules/emails/src/"],
"Modules\\Articoli\\": ["modules/articoli/custom/src/", "modules/articoli/src/"],
"Modules\\Checklists\\": ["modules/checklists/custom/src/", "modules/checklists/src/"],
"Modules\\Ritenute\\": ["modules/ritenute/custom/src/", "modules/ritenute/src/"],
"Modules\\RitenuteContributi\\": ["modules/ritenute_contributi/custom/src/", "modules/ritenute_contributi/src/"],
"Modules\\Rivalse\\": ["modules/rivalse/custom/src/", "modules/rivalse/src/"],
"Modules\\Newsletter\\": ["modules/newsletter/custom/src/", "modules/newsletter/src/"],
"Modules\\Iva\\": ["modules/iva/custom/src/", "modules/iva/src/"],
"Modules\\DDT\\": ["modules/ddt/custom/src/", "modules/ddt/src/"],
"Modules\\Fatture\\": ["modules/fatture/custom/src/", "modules/fatture/src/"],
"Modules\\Ordini\\": ["modules/ordini/custom/src/", "modules/ordini/src/"],
"Modules\\Preventivi\\": ["modules/preventivi/custom/src/", "modules/preventivi/src/"],
"Modules\\Contratti\\": ["modules/contratti/custom/src/", "modules/contratti/src/"],
"Modules\\Interventi\\": ["modules/interventi/custom/src/", "modules/interventi/src/"],
"Modules\\Pagamenti\\": ["modules/pagamenti/custom/src/", "modules/pagamenti/src/"],
"Modules\\Statistiche\\": ["modules/statistiche/custom/src/", "modules/statistiche/src/"],
"Modules\\Scadenzario\\": ["modules/scadenzario/custom/src/", "modules/scadenzario/src/"],
"Modules\\PrimaNota\\": ["modules/primanota/custom/src/", "modules/primanota/src/"],
"Modules\\Utenti\\": ["modules/utenti/custom/src/", "modules/utenti/src/"],
"Modules\\StatoServizi\\": ["modules/stato_servizi/custom/src/", "modules/stato_servizi/src/"],
"Modules\\StatiIntervento\\": ["modules/stati_intervento/custom/src/", "modules/stati_intervento/src/"],
"Modules\\StatiPreventivo\\": ["modules/stati_preventivo/custom/src/", "modules/stati_preventivo/src/"],
"Modules\\StatiContratto\\": ["modules/stati_contratto/custom/src/", "modules/stati_contratto/src/"],
"Modules\\TipiIntervento\\": ["modules/tipi_intervento/custom/src/", "modules/tipi_intervento/src/"],
"Modules\\CategorieDocumentali\\": ["modules/categorie_documenti/custom/src/", "modules/categorie_documenti/src/"],
"Modules\\Listini\\": ["modules/listini/custom/src/", "modules/listini/src/"],
"Modules\\Impianti\\": ["modules/impianti/custom/src/", "modules/impianti/src/"],
"Modules\\Impostazioni\\": ["modules/impostazioni/custom/src/", "modules/impostazioni/src/"],
"Plugins\\ExportFE\\": ["plugins/exportFE/custom/src/", "plugins/exportFE/src/"],
"Plugins\\ImportFE\\": ["plugins/importFE/custom/src/", "plugins/importFE/src/"],
"Plugins\\ReceiptFE\\": ["plugins/receiptFE/custom/src/", "plugins/receiptFE/src/"],
"Plugins\\DichiarazioniIntento\\": ["plugins/dichiarazioni_intento/custom/src/", "plugins/dichiarazioni_intento/src/"],
"Plugins\\PianificazioneInterventi\\": ["plugins/pianificazione_interventi/custom/src/", "plugins/pianificazione_interventi/src/"],
"Plugins\\PianificazioneFatturazione\\": ["plugins/pianificazione_fatturazione/custom/src/", "plugins/pianificazione_fatturazione/src/"],
"Plugins\\StatisticheArticoli\\": ["plugins/statistiche_articoli/custom/src/", "plugins/statistiche_articoli/src/"],
"Plugins\\DettagliArticolo\\": ["plugins/dettagli_articolo/custom/src/", "plugins/dettagli_articolo/src/"]
},
"files": [
"lib/functions.php",

View File

@ -21,15 +21,15 @@
* Configuration file for CSRF Protector.
*/
return [
'logDirectory' => DOCROOT.'/logs',
'logDirectory' => base_dir().'/logs',
'failedAuthAction' => [
'GET' => 0,
'POST' => 0,
],
'jsUrl' => ROOTDIR.'/assets/dist/js/csrf/csrfprotector.js',
'jsUrl' => base_path().'/assets/dist/js/csrf/csrfprotector.js',
'tokenLength' => 10,
'cookieConfig' => [
'path' => ROOTDIR,
'path' => base_path(),
'secure' => isHTTPS(true),
],
'verifyGetFor' => [],

View File

@ -18,7 +18,7 @@
*/
return [
'include' => 'Common',
/*
'modules/aggiornamenti' => 'Modules\Aggiornamenti',
'modules/anagrafiche' => 'Modules\Anagrafiche',
'modules/backups' => 'Modules\Backups',
@ -59,4 +59,5 @@ return [
'plugins/pianificazione_fatturazione' => 'Plugins\PianificazioneFatturazione',
'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli',
'plugins/dettagli_articolo' => 'Plugins\DettagliArticolo',
*/
];

View File

@ -20,15 +20,15 @@
include_once __DIR__.'/core.php';
if (!empty($id_record) && !empty($id_module)) {
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);
} elseif (empty($id_module)) {
redirect(ROOTDIR.'/index.php');
redirect(base_path().'/index.php');
}
include_once App::filepath('include|custom|', 'top.php');
// Inclusione gli elementi fondamentali
include_once $docroot.'/actions.php';
include_once base_dir().'/actions.php';
// Widget in alto
echo '{( "name": "widgets", "id_module": "'.$id_module.'", "position": "top", "place": "controller" )}';
@ -66,7 +66,7 @@ echo '
<div class="tab-content">
<div id="tab_0" class="tab-pane active">';
include $docroot.'/include/manager.php';
include base_dir().'/include/manager.php';
echo '
</div>';
@ -81,7 +81,7 @@ foreach ($plugins as $plugin) {
$id_plugin = $plugin['id'];
include $docroot.'/include/manager.php';
include base_dir().'/include/manager.php';
echo '
</div>';

View File

@ -20,8 +20,6 @@
// Rimozione header X-Powered-By
header_remove('X-Powered-By');
ini_set('session.cookie_samesite', 'strict');
// Impostazioni di configurazione PHP
date_default_timezone_set('Europe/Rome');
@ -81,16 +79,16 @@ use Monolog\Handler\StreamHandler;
$handlers = [];
if (!API\Response::isAPIRequest()) {
// File di log di base (logs/error.log, logs/setup.log)
$handlers[] = new StreamHandler($docroot.'/logs/error.log', Monolog\Logger::ERROR);
$handlers[] = new StreamHandler($docroot.'/logs/setup.log', Monolog\Logger::EMERGENCY);
$handlers[] = new StreamHandler(base_dir().'/logs/error.log', Monolog\Logger::ERROR);
$handlers[] = new StreamHandler(base_dir().'/logs/setup.log', Monolog\Logger::EMERGENCY);
// Messaggi grafici per l'utente
$handlers[] = new Extensions\MessageHandler(Monolog\Logger::ERROR);
// File di log ordinati in base alla data
if (App::debug()) {
$handlers[] = new RotatingFileHandler($docroot.'/logs/error.log', 0, Monolog\Logger::ERROR);
$handlers[] = new RotatingFileHandler($docroot.'/logs/setup.log', 0, Monolog\Logger::EMERGENCY);
$handlers[] = new RotatingFileHandler(base_dir().'/logs/error.log', 0, Monolog\Logger::ERROR);
$handlers[] = new RotatingFileHandler(base_dir().'/logs/setup.log', 0, Monolog\Logger::EMERGENCY);
}
// Inizializzazione Whoops
@ -118,9 +116,17 @@ if (!API\Response::isAPIRequest()) {
]);
});
} else {
$handlers[] = new StreamHandler($docroot.'/logs/api.log', Monolog\Logger::ERROR);
$handlers[] = new StreamHandler(base_dir().'/logs/api.log', Monolog\Logger::ERROR);
}
// Sicurezza della sessioni
ini_set('session.cookie_samesite', 'strict');
ini_set('session.use_trans_sid', '0');
ini_set('session.use_only_cookies', '1');
session_set_cookie_params(0, base_path(), null, isHTTPS(true));
session_start();
// Disabilita i messaggi nativi di PHP
ini_set('display_errors', 0);
// Ignora gli avvertimenti e le informazioni relative alla deprecazione di componenti
@ -144,13 +150,6 @@ $dbo = $database = database();
/* SESSIONE */
if (!API\Response::isAPIRequest()) {
// Sicurezza della sessioni
ini_set('session.use_trans_sid', '0');
ini_set('session.use_only_cookies', '1');
session_set_cookie_params(0, $rootdir, null, isHTTPS(true));
session_start();
// Barra di debug (necessario per loggare tutte le query)
if (App::debug()) {
$debugbar = new DebugBar\DebugBar();
@ -168,11 +167,11 @@ if (!API\Response::isAPIRequest()) {
/* INTERNAZIONALIZZAZIONE */
// Istanziamento del gestore delle traduzioni del progetto
$lang = !empty($config['lang']) ? $config['lang'] : $_GET['lang'];
$lang = !empty($config['lang']) ? $config['lang'] : (isset($_GET['lang']) ? $_GET['lang'] : null);
$formatter = !empty($config['formatter']) ? $config['formatter'] : [];
$translator = trans();
$translator->addLocalePath($docroot.'/locale');
$translator->addLocalePath($docroot.'/modules/*/locale');
$translator->addLocalePath(base_dir().'/locale');
$translator->addLocalePath(base_dir().'/modules/*/locale');
$translator->setLocale($lang, $formatter);
// Individuazione di versione e revisione del progetto
@ -187,12 +186,12 @@ if (!empty($skip_permissions)) {
Permissions::skip();
}
if (!$continue && getURLPath() != slashes(ROOTDIR.'/index.php') && !Permissions::getSkip()) {
if (!$continue && getURLPath() != slashes(base_path().'/index.php') && !Permissions::getSkip()) {
if (Auth::check()) {
Auth::logout();
}
redirect(ROOTDIR.'/index.php');
redirect(base_path().'/index.php');
exit();
}
@ -258,8 +257,8 @@ if (!API\Response::isAPIRequest()) {
$plugin = Plugins::getCurrent();
$structure = isset($plugin) ? $plugin : $module;
$id_module = $module['id'];
$id_plugin = $plugin['id'];
$id_module = $module ? $module['id'] : null;
$id_plugin = $plugin ? $plugin['id'] : null;
$user = Auth::user();

View File

@ -56,18 +56,18 @@ $pattern = '[%datetime%] %level_name%: %message% %context%'.PHP_EOL;
$formatter = new Monolog\Formatter\LineFormatter($pattern);
$logger = new Logger('Tasks');
$handler = new RotatingFileHandler(DOCROOT.'/logs/cron.log', 7);
$handler = new RotatingFileHandler(base_dir().'/logs/cron.log', 7);
$handler->setFormatter($formatter);
$logger->pushHandler($handler);
// Lettura della cache
$ultima_esecuzione = Cache::get('Ultima esecuzione del cron');
$ultima_esecuzione = Cache::pool('Ultima esecuzione del cron');
$data = $ultima_esecuzione->content;
$in_esecuzione = Cache::get('Cron in esecuzione');
$cron_id = Cache::get('ID del cron');
$in_esecuzione = Cache::pool('Cron in esecuzione');
$cron_id = Cache::pool('ID del cron');
$disattiva = Cache::get('Disabilita cron');
$disattiva = Cache::pool('Disabilita cron');
if (!empty($disattiva->content)) {
return;
}

View File

@ -25,9 +25,9 @@ use Carbon\Carbon;
$read_only = $structure->permission == 'r';
if (empty($id_record) && !empty($id_module) && empty($id_plugin)) {
redirect(ROOTDIR.'/controller.php?id_module='.$id_module);
redirect(base_path().'/controller.php?id_module='.$id_module);
} elseif (empty($id_record) && empty($id_module) && empty($id_plugin)) {
redirect(ROOTDIR.'/index.php');
redirect(base_path().'/index.php');
}
include_once App::filepath('include|custom|', 'top.php');
@ -48,7 +48,7 @@ $has_access = !empty($query) ? $dbo->fetchNum($query) !== 0 : true;
if ($has_access) {
// Inclusione gli elementi fondamentali
include_once DOCROOT.'/actions.php';
include_once base_dir().'/actions.php';
}
if (empty($record) || !$has_access) {
@ -61,7 +61,7 @@ if (empty($record) || !$has_access) {
</h3>
<br>
<a class="btn btn-default" href="'.ROOTDIR.'/controller.php?id_module='.$id_module.'">
<a class="btn btn-default" href="'.base_path().'/controller.php?id_module='.$id_module.'">
<i class="fa fa-chevron-left"></i> '.tr('Indietro').'
</a>
</div>';
@ -145,7 +145,7 @@ if (empty($record) || !$has_access) {
// Pulsanti di default
echo '
<div id="pulsanti">
<a class="btn btn-warning" href="'.ROOTDIR.'/controller.php?id_module='.$id_module.'">
<a class="btn btn-warning" href="'.base_path().'/controller.php?id_module='.$id_module.'">
<i class="fa fa-chevron-left"></i> '.tr("Torna all'elenco").'
</a>
@ -265,11 +265,11 @@ if (empty($record) || !$has_access) {
});
</script>';
if ($structure->permission != '-' && $structure->use_notes) {
if ($structure->permission != '-' && $structure->use_notes && $user->gruppo != 'Clienti') {
echo '
<div id="tab_note" class="tab-pane">';
include DOCROOT.'/plugins/notes.php';
include base_dir().'/plugins/notes.php';
echo '
</div>';
@ -279,7 +279,7 @@ if (empty($record) || !$has_access) {
echo '
<div id="tab_checks" class="tab-pane">';
include DOCROOT.'/plugins/checks.php';
include base_dir().'/plugins/checks.php';
echo '
</div>';
@ -381,7 +381,7 @@ if (empty($record) || !$has_access) {
$id_plugin = $plugin['id'];
include DOCROOT.'/include/manager.php';
include base_dir().'/include/manager.php';
echo '
</div>';
@ -402,7 +402,7 @@ echo '{( "name": "widgets", "id_module": "'.$id_module.'", "id_record": "'.$id_r
if (!empty($record)) {
echo '
<hr>
<a class="btn btn-default" href="'.ROOTDIR.'/controller.php?id_module='.$id_module.'">
<a class="btn btn-default" href="'.base_path().'/controller.php?id_module='.$id_module.'">
<i class="fa fa-chevron-left"></i> '.tr('Indietro').'
</a>';
}
@ -421,6 +421,12 @@ if ($read_only || !empty($block_edit)) {
$(".checkbox-buttons label", "section.content")'.$not.'.addClass("disabled");
';
// Nascondo il plugin Note interne ai clienti
if ($user->gruppo == 'Clienti') {
echo '
$("#link-tab_note").hide();';
}
if ($read_only) {
echo '
$("a.btn, button, input[type=button], input[type=submit]", "section.content").hide();
@ -474,7 +480,7 @@ if (!empty($advanced_sessions)) {
?>
function getActiveUsers(){
$.getJSON('<?php echo ROOTDIR; ?>/ajax.php?op=active_users', {
$.getJSON('<?php echo base_path(); ?>/ajax.php?op=active_users', {
id_module: <?php echo $id_module; ?>,
id_record: <?php echo $id_record; ?>
},

View File

@ -94,6 +94,7 @@ const JS = gulp.parallel(() => {
'datatables.net-scroller/js/dataTables.scroller.js',
'datatables.net-select/js/dataTables.select.js',
'dropzone/dist/dropzone.js',
'autonumeric/dist/autoNumeric.min.js',
'eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js',
'fullcalendar/dist/fullcalendar.js',
'geocomplete/jquery.geocomplete.js',

View File

@ -78,21 +78,21 @@ if ($module['name'] != 'Contratti' && $module['name'] != 'Preventivi') {
echo '
<div class="row '.(!empty($options['nascondi_prezzi']) ? 'hidden' : '').'" id="prezzi_articolo">
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezziacquisto\').toggleClass(\'hide\'); $(\'#prezziacquisto\').load(\''.ROOTDIR."/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezziacquisto\').toggleClass(\'hide\'); $(\'#prezziacquisto\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<i class="fa fa-search"></i> '.tr('Ultimi prezzi di acquisto').'
</button>
<div id="prezziacquisto" class="hide"></div>
</div>
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzi\').toggleClass(\'hide\'); $(\'#prezzi\').load(\''.ROOTDIR."/ajax_complete.php?module=Articoli&op=getprezzi&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzi\').toggleClass(\'hide\'); $(\'#prezzi\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezzi&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<i class="fa fa-search"></i> '.tr('Ultimi prezzi al cliente').'
</button>
<div id="prezzi" class="hide"></div>
</div>
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzivendita\').toggleClass(\'hide\'); $(\'#prezzivendita\').load(\''.ROOTDIR."/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<button type="button" class="btn btn-sm btn-info btn-block '.($disabled ? 'disabled' : '').'" '.($disabled ? 'disabled' : '').' onclick="$(\'#prezzivendita\').toggleClass(\'hide\'); $(\'#prezzivendita\').load(\''.base_path()."/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo=' + ( $('#idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
<i class="fa fa-search"></i> '.tr('Ultimi prezzi di vendita').'
</button>
<div id="prezzivendita" class="hide"></div>

View File

@ -21,7 +21,7 @@ $result['id'] = isset($result['id']) ? $result['id'] : null;
// Form di inserimento riga documento
echo '
<form action="'.ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<form action="'.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
<input type="hidden" name="hash" value="tab_'.$id_plugin.'">
<input type="hidden" name="backto" value="record-edit">

View File

@ -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 '
<form action="'.$link.'" method="post">
@ -246,64 +246,69 @@ echo '
</div>
<table class="box-body table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%">'.tr('Q.').'</th>
<th width="15%">'.tr('Q. da evadere').'</th>
<th width="20%">'.tr('Subtot.').'</th>';
<thead>
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%">'.tr('Q.').'</th>
<th width="15%">'.tr('Q. da evadere').'</th>
<th width="20%">'.tr('Subtot.').'</th>';
if (!empty($options['serials'])) {
echo '
<th width="20%">'.tr('Seriali').'</th>';
<th width="20%">'.tr('Seriali').'</th>';
}
echo '
</tr>';
</tr>
</thead>
<tbody id="righe_documento_importato">';
foreach ($righe as $i => $riga) {
// Descrizione
echo '
<tr>
<td>
<input type="hidden" id="prezzo_unitario_'.$i.'" name="subtot['.$riga['id'].']" value="'.$riga['prezzo_unitario'].'" />
<input type="hidden" id="sconto_unitario_'.$i.'" name="sconto['.$riga['id'].']" value="'.$riga['sconto_unitario'].'" />
<input type="hidden" id="iva_unitaria_'.$i.'" name="iva['.$riga['id'].']" value="'.$riga['iva_unitaria'].'" />
<input type="hidden" id="qta_max_'.$i.'" value="'.($riga['qta_rimanente']).'" />';
<tr data-local_id="'.$i.'">
<td>
<span class="hidden" id="id_articolo_'.$i.'">'.$riga['idarticolo'].'</span>
<input type="hidden" id="prezzo_unitario_'.$i.'" name="subtot['.$riga['id'].']" value="'.$riga['prezzo_unitario'].'" />
<input type="hidden" id="sconto_unitario_'.$i.'" name="sconto['.$riga['id'].']" value="'.$riga['sconto_unitario'].'" />
<input type="hidden" id="iva_unitaria_'.$i.'" name="iva['.$riga['id'].']" value="'.$riga['iva_unitaria'].'" />
<input type="hidden" id="max_qta_'.$i.'" value="'.($riga['qta_rimanente']).'" />';
// Checkbox - da evadere?
echo '
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere['.$riga['id'].']" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />';
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere['.$riga['id'].']" value="on" onclick="ricalcolaTotaleRiga('.$i.');" />';
$descrizione = ($riga->isArticolo() ? $riga->articolo->codice.' - ' : '').$riga['descrizione'];
echo '&nbsp;'.nl2br($descrizione);
echo '
</td>';
</td>';
// Q.tà rimanente
echo '
<td class="text-center">
'.numberFormat($riga['qta_rimanente']).'
</td>';
<td class="text-center">
'.numberFormat($riga['qta_rimanente']).'
</td>';
// Q.tà da evadere
echo '
<td>
{[ "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.');\"" ]}
</td>';
<td>
{[ "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.');\"" ]}
</td>';
echo '
<td>
<big id="subtotale_'.$i.'">'.moneyFormat($riga->totale).'</big><br/>
<td>
<big id="subtotale_'.$i.'">'.moneyFormat($riga->totale).'</big><br/>
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.numberFormat($riga->totale_imponibile).' + '.numberFormat($riga->iva).'</small>
</td>';
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.numberFormat($riga->totale_imponibile).' + '.numberFormat($riga->iva).'</small>
</td>';
// Seriali
if (!empty($options['serials'])) {
echo '
<td>';
<td>';
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 '
</td>';
</td>';
}
echo '
</tr>';
</tr>';
}
// Totale
echo '
</tbody>
<tr>
<td colspan="'.(!empty($options['serials']) ? 4 : 3).'" class="text-right">
<b>'.tr('Totale').':</b>
@ -347,6 +354,22 @@ echo '
</table>
</div>';
echo '
<div class="alert alert-warning hidden" id="articoli_sottoscorta">
<table class="table table-condensed">
<thead>
<tr>
<th>'.tr('Articolo').'</th>
<th class="text-center tip" width="150" title="'.tr('Quantità richiesta').'">'.tr('Q.').'</th>
<th class="text-center tip" width="150" title="'.tr('Quantità disponibile nel magazzino del gestionale').'">'.tr('Q. magazzino').'</th>
<th class="text-center" width="150">'.tr('Scarto').'</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>';
echo '
<!-- PULSANTI -->
@ -362,95 +385,160 @@ echo '
echo '
<script>$(document).ready(init)</script>';
?>
echo '
<script type="text/javascript">
function ricalcola_subtotale_riga(r) {
var prezzo_unitario = $("#prezzo_unitario_" + r).val();
var sconto = $("#sconto_unitario_" + r).val();
var iva = $("#iva_unitaria_" + r).val();
';
var qta_max_input = $("#qta_max_" + r);
var qta_max = qta_max_input.val() ? qta_max_input.val() : 0;
$articoli = $documento->articoli->groupBy('idarticolo');
$scorte = [];
foreach ($articoli as $elenco) {
$qta = $elenco->sum('qta');
$articolo = $elenco->first()->articolo;
$descrizione_riga = $articolo->codice.' - '.$articolo->descrizione;
$text = $articolo ? Modules::link('Articoli', $articolo->id, $descrizione_riga) : $descrizione_riga;
$scorte[$articolo->id] = [
'qta' => $articolo->qta,
'descrizione' => $text,
];
}
echo '
var scorte = '.json_encode($scorte).';
var abilita_scorte = '.intval(!$documento::$movimenta_magazzino && !empty($options['tipo_documento_finale']) && $options['tipo_documento_finale']::$movimenta_magazzino).';
function controllaMagazzino() {
if(!abilita_scorte) return;
let righe = $("#righe_documento_importato tr");
// Lettura delle righe selezionate per l\'improtazione
let richieste = {};
for(const r of righe) {
let riga = $(r);
let id = $(riga).data("local_id");
let id_articolo = riga.find("[id^=id_articolo_]").text();
if (!$("#checked_" + id).is(":checked") || !id_articolo) {
continue;
}
let qta = parseFloat(riga.find("input[id^=qta_]").val());
richieste[id_articolo] = richieste[id_articolo] ? richieste[id_articolo] + qta : qta;
}
let sottoscorta = $("#articoli_sottoscorta");
let body = sottoscorta.find("tbody");
body.html("");
for(const id_articolo in richieste) {
let qta_scorta = parseFloat(scorte[id_articolo]["qta"]);
let qta_richiesta = parseFloat(richieste[id_articolo]);
if (qta_richiesta > qta_scorta) {
body.append(`<tr>
<td>` + scorte[id_articolo]["descrizione"] + `</td>
<td class="text-right">` + qta_richiesta.toLocale() + `</td>
<td class="text-right">` + qta_scorta.toLocale() + `</td>
<td class="text-right">` + (qta_richiesta - qta_scorta).toLocale() + `</td>
</tr>`);
}
}
if (body.html()) {
sottoscorta.removeClass("hidden");
} else {
sottoscorta.addClass("hidden");
}
}
function ricalcolaTotaleRiga(r) {
let prezzo_unitario = $("#prezzo_unitario_" + r).val();
let sconto = $("#sconto_unitario_" + r).val();
let iva = $("#iva_unitaria_" + r).val();
let max_qta_input = $("#max_qta_" + r);
let qta_max = max_qta_input.val() ? max_qta_input.val() : 0;
prezzo_unitario = parseFloat(prezzo_unitario);
sconto = parseFloat(sconto);
iva = parseFloat(iva);
qta_max = parseFloat(qta_max);
let prezzo_scontato = prezzo_unitario - sconto;
let qta = $("#qta_" + r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if (qta > qta_max) {
qta = qta_max;
$("#qta_" + r).val(qta);
}
// Se tolgo la spunta della casella dell\'evasione devo azzerare i conteggi
if (isNaN(qta) || !$("#checked_" + r).is(":checked")) {
qta = 0;
}
let serial_select = $("#serial_" + r);
serial_select.selectClear();
serial_select.select2("destroy");
serial_select.data("maximum", qta);
start_superselect();
let subtotale = (prezzo_scontato * qta + iva * qta).toLocale();
$("#subtotale_" + r).html(subtotale + " " + globals.currency);
$("#subtotaledettagli_" + r).html((prezzo_scontato * qta).toLocale() + " + " + (iva * qta).toLocale());
ricalcolaTotale();
}
function ricalcolaTotale() {
let totale = 0.00;
let totale_qta = 0;
$("input[id*=qta_]").each(function() {
let qta = $(this).val().toEnglish();
let r = $(this).attr("id").replace("qta_", "");
if (!$("#checked_" + r).is(":checked") || isNaN(qta)) {
qta = 0;
}
let prezzo_unitario = $("#prezzo_unitario_" + r).val();
let sconto = $("#sconto_unitario_" + r).val();
let iva = $("#iva_unitaria_" + r).val();
prezzo_unitario = parseFloat(prezzo_unitario);
sconto = parseFloat(sconto);
iva = parseFloat(iva);
qta_max = parseFloat(qta_max);
var prezzo_scontato = prezzo_unitario - sconto;
let prezzo_scontato = prezzo_unitario - sconto;
var qta = $("#qta_" + r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if (qta > qta_max) {
qta = qta_max;
$('#qta_' + r).val(qta);
if(prezzo_scontato) {
totale += prezzo_scontato * qta + iva * qta;
}
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if (isNaN(qta) || !$('#checked_' + r).is(':checked')) {
qta = 0;
}
totale_qta += qta;
});
var serial_select = $("#serial_" + r);
serial_select.selectClear();
serial_select.select2("destroy");
serial_select.data('maximum', qta);
start_superselect();
$("#totale").html((totale.toLocale()) + " " + globals.currency);';
var subtotale = (prezzo_scontato * qta + iva * qta).toLocale();
if (empty($options['allow-empty'])) {
echo '
if (totale_qta > 0) {
$("#submit_btn").show();
} else {
$("#submit_btn").hide();
}';
}
$("#subtotale_" + r).html(subtotale + " " + globals.currency);
$("#subtotaledettagli_" + r).html((prezzo_scontato * qta).toLocale() + " + " + (iva * qta).toLocale());
echo '
controllaMagazzino();
}
ricalcola_totale();
}
function ricalcola_totale() {
var totale = 0.00;
var totale_qta = 0;
$('input[id*=qta_]').each(function() {
var qta = $(this).val().toEnglish();
var r = $(this).attr("id").replace("qta_", "");
if (!$("#checked_" + r).is(":checked") || isNaN(qta)) {
qta = 0;
}
var prezzo_unitario = $("#prezzo_unitario_" + r).val();
var sconto = $("#sconto_unitario_" + r).val();
var iva = $("#iva_unitaria_" + r).val();
prezzo_unitario = parseFloat(prezzo_unitario);
sconto = parseFloat(sconto);
iva = parseFloat(iva);
var prezzo_scontato = prezzo_unitario - sconto;
if(prezzo_scontato) {
totale += prezzo_scontato * qta + iva * qta;
}
totale_qta += qta;
});
$('#totale').html((totale.toLocale()) + " " + globals.currency);
<?php
if (empty($options['allow-empty'])) {
echo '
if (totale_qta > 0)
$("#submit_btn").show();
else
$("#submit_btn").hide();';
}
?>
}
ricalcola_totale();
</script>
ricalcolaTotale();
</script>';

View File

@ -33,7 +33,7 @@ echo '
// Quantità
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "<span class=\"tip\" title=\"'.tr("L'elemento è collegato a un documento: la quantità massima ammessa è relativa allo stato di evasione dell'elemento nel documento di origine (quantità dell'elemento / quantità massima ammessa)").'\">/ '.numberFormat($result['max_qta'], 'qta').' <i class=\"fa fa-question-circle-o\"></i></span>"' : '').', "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": "<span class=\"tip\" title=\"'.tr("L'elemento è collegato a un documento: la quantità massima ammessa è relativa allo stato di evasione dell'elemento nel documento di origine (quantità dell'elemento / quantità massima ammessa)").'\">/ '.numberFormat($result['max_qta'], 'qta').' <i class=\"fa fa-question-circle-o\"></i></span>"' : '').', "min-value": "'.$result['qta_evasa'].'" ]}
</div>';
// Unità di misura

View File

@ -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) {
<p>'.tr('Sembra che non ci siano i permessi di scrittura sul file _FILE_', [
'_FILE_' => '<b>config.inc.php</b>',
]).'</p>
<form action="'.$rootdir.'/index.php?action=updateconfig&firstuse=true" method="post">
<form action="'.base_path().'/index.php?action=updateconfig&firstuse=true" method="post">
<div class="hide">
<input type="hidden" name="db_name" value="'.$db_name.'">
<input type="hidden" name="db_password" value="'.$db_password.'">
<input type="hidden" name="db_username" value="'.$db_username.'">;
<input type="hidden" name="db_host" value="'.$db_host.'">
</div>
<a class="btn btn-warning" href="'.$rootdir.'/index.php"><i class="fa fa-arrow-left"></i> '.tr('Torna indietro').'</a>
<a class="btn btn-warning" href="'.base_path().'/index.php"><i class="fa fa-arrow-left"></i> '.tr('Torna indietro').'</a>
<button class="btn btn-info"><i class="fa fa-repeat"></i> '.tr('Riprova').'</button>
</form>
<hr>
@ -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()) {
<div class="box-body">
<p>'.tr("Si è verificato un'errore durante la connessione al database").'.</p>
<p>'.tr('Controllare di aver inserito correttamente i dati di accesso, e che il database atto ad ospitare i dati del gestionale sia esistente').'.</p>
<a class="btn btn-info" href="'.$rootdir.'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
<a class="btn btn-info" href="'.base_path().'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
</div>
</div>';
}
@ -240,7 +240,7 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
'_FILE_' => '<b>config.inc.php</b>',
]).'.</p>
<p>'.tr("Nel caso il problema persista, rivolgersi all'assistenza ufficiale").'.</p>
<a class="btn btn-info" href="'.$rootdir.'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
<a class="btn btn-info" href="'.base_path().'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
</div>
</div>';
}
@ -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,
},

View File

@ -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) {
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "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 ]}
</div>
<div class="col-md-6">
{[ "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" ]}
</div>
<div class="col-md-6">
{[ "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 ]}
</div>
</div>
</div>
@ -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('</form>', '', $anagrafica);
@ -258,7 +258,7 @@ echo '
$("button[type=submit]").not("#config").remove();
});
</script>
<script src="'.$rootdir.'/lib/functions.js"></script>
<script src="'.base_path().'/lib/functions.js"></script>
<script>$(document).ready(init)</script>';
include_once App::filepath('include|custom|', 'bottom.php');

View File

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

View File

@ -104,7 +104,7 @@ if (filter('action') == 'do_update') {
}
echo '
<a class="btn btn-success btn-block" href="'.ROOTDIR.'">
<a class="btn btn-success btn-block" href="'.base_path().'">
<i class="fa fa-check"></i> '.tr('Continua').'
</a>';
}
@ -125,7 +125,7 @@ if (filter('action') == 'do_update') {
<div class="box-body">
<p>'.tr("E' attualmente in corso la procedura di aggiornamento del software, e pertanto siete pregati di attendere fino alla sua conclusione").'.</p>
<p>'.tr("Nel caso il problema persista, rivolgersi all'amministratore o all'assistenza ufficiale").'.</p>
<a class="btn btn-info" href="'.$rootdir.'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
<a class="btn btn-info" href="'.base_path().'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
</div>
</div>';
@ -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) {

View File

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

View File

@ -48,7 +48,7 @@ echo '
</div>';
$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) {

View File

@ -55,7 +55,7 @@ if (!$riferimenti->isEmpty()) {
'.$riferimento->target->descrizione.'
<br>
<small>'.reference($riferimento->target->parent).'</small>
<small>'.reference($riferimento->target->getDocument()).'</small>
</td>
</tr>';

View File

@ -1,59 +0,0 @@
<?php
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}
}

View File

@ -38,9 +38,9 @@ echo '<!DOCTYPE html>
<link href="'.$paths['img'].'/favicon.png" rel="icon" type="image/x-icon" />';
if (file_exists(DOCROOT.'/manifest.json')) {
if (file_exists(base_dir().'/manifest.json')) {
echo '
<link rel="manifest" href="'.ROOTDIR.'/manifest.json">';
<link rel="manifest" href="'.base_path().'/manifest.json">';
}
// 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 '
<script>
globals = {
rootdir: "'.$rootdir.'",
rootdir: "'.base_path().'",
search: {},
translations: {
@ -289,7 +289,8 @@ if (Auth::check()) {
}
}
$hide_sidebar = Auth::check() && (setting('Nascondere la barra sinistra di default') or $_SESSION['settings']['sidebar-collapse']);
$settings_collapse = session_get('settings.sidebar-collapse') ? 1 : 0;
$hide_sidebar = Auth::check() && (setting('Nascondere la barra sinistra di default') || $settings_collapse);
echo '
</head>
@ -298,7 +299,7 @@ echo '
<div class="'.(!Auth::check() ? '' : 'wrapper').'">';
if (Auth::check()) {
$calendar = ($_SESSION['period_start'] != date('Y').'-01-01' || $_SESSION['period_end'] != date('Y').'-12-31') ? 'red' : 'white';
$calendar_color_label = ($_SESSION['period_start'] != date('Y').'-01-01' || $_SESSION['period_end'] != date('Y').'-12-31') ? 'danger' : 'default';
echo '
<!-- Loader principale -->
@ -337,11 +338,11 @@ if (Auth::check()) {
<!-- Navbar Left Menu -->
<div class="navbar-left hidden-xs">
<ul class="nav navbar-nav hidden-xs">
<li><a href="#" id="daterange" style="color:'.$calendar.';" role="button" >
<li><a href="#" id="daterange" role="button" >
<i class="fa fa-calendar" style="color:inherit"></i> <i class="fa fa-caret-down" style="color:inherit"></i>
</a></li>
<li><a style="color:'.$calendar.';background:inherit;cursor:default;">
<li><a style="cursor:default;padding:0px;padding-right:5px;padding-left:5px;margin-top:15px;" class="label label-'.$calendar_color_label.'">
'.Translator::dateToLocale($_SESSION['period_start']).' - '.Translator::dateToLocale($_SESSION['period_end']).'
</a></li>
</ul>
@ -372,19 +373,19 @@ if (Auth::check()) {
<i class="fa fa-print"></i>
</a></li>
<li><a href="'.$rootdir.'/bug.php" class="tip nav-button" title="'.tr('Segnalazione bug').'">
<li><a href="'.base_path().'/bug.php" class="tip nav-button" title="'.tr('Segnalazione bug').'">
<i class="fa fa-bug"></i>
</a></li>
<li><a href="'.$rootdir.'/log.php" class="tip nav-button" title="'.tr('Log accessi').'">
<li><a href="'.base_path().'/log.php" class="tip nav-button" title="'.tr('Log accessi').'">
<i class="fa fa-book"></i>
</a></li>
<li><a href="'.$rootdir.'/info.php" class="tip nav-button" title="'.tr('Informazioni').'">
<li><a href="'.base_path().'/info.php" class="tip nav-button" title="'.tr('Informazioni').'">
<i class="fa fa-info"></i>
</a></li>
<li><a href="'.$rootdir.'/index.php?op=logout" onclick="sessionStorage.clear()" class="bg-red tip" title="'.tr('Esci').'">
<li><a href="'.base_path().'/index.php?op=logout" onclick="sessionStorage.clear()" class="bg-red tip" title="'.tr('Esci').'">
<i class="fa fa-power-off"></i>
</a></li>
</ul>
@ -399,13 +400,13 @@ if (Auth::check()) {
<!-- Sidebar user panel -->
<div class="user-panel text-center info" style="height: 60px">
<div class="info">
<p><a href="'.$rootdir.'/modules/utenti/info.php">
<p><a href="'.base_path().'/modules/utenti/info.php">
'.$user['username'].'
</a></p>
<p id="datetime"></p>
</div>
<a class="image" href="'.$rootdir.'/modules/utenti/info.php">';
<a class="image" href="'.base_path().'/modules/utenti/info.php">';
$user_photo = $user->photo;
if ($user_photo) {
@ -520,10 +521,16 @@ if (Auth::check()) {
<div class="col-md-12">';
// Eventuale messaggio personalizzato per l'installazione corrente
include_once App::filepath('include/custom/extra', 'extra.php');
$extra_file = App::filepath('include/custom/extra', 'extra.php');
if ($extra_file) {
include_once $extra_file;
}
} else {
// Eventuale messaggio personalizzato per l'installazione corrente
include_once App::filepath('include/custom/extra', 'login.php');
$extra_file = App::filepath('include/custom/extra', 'login.php');
if ($extra_file) {
include_once $extra_file;
}
if (!empty($messages['info']) || !empty($messages['warning']) || !empty($messages['error'])) {
echo '

View File

@ -38,7 +38,7 @@ switch ($op) {
flash()->error(Auth::getStatus()[$status]['message']);
redirect(ROOTDIR.'/index.php');
redirect(base_path().'/index.php');
exit();
}
@ -47,7 +47,7 @@ switch ($op) {
case 'logout':
Auth::logout();
redirect(ROOTDIR.'/index.php');
redirect(base_path().'/index.php');
exit();
break;
@ -57,21 +57,21 @@ if (Auth::check() && isset($dbo) && $dbo->isConnected() && $dbo->isInstalled())
$module = Auth::firstModule();
if (!empty($module)) {
redirect(ROOTDIR.'/controller.php?id_module='.$module);
redirect(base_path().'/controller.php?id_module='.$module);
} else {
redirect(ROOTDIR.'/index.php?op=logout');
redirect(base_path().'/index.php?op=logout');
}
exit();
}
// Procedura di installazione
include_once $docroot.'/include/init/configuration.php';
include_once base_dir().'/include/init/configuration.php';
// Procedura di aggiornamento
include_once $docroot.'/include/init/update.php';
include_once base_dir().'/include/init/update.php';
// Procedura di inizializzazione
include_once $docroot.'/include/init/init.php';
include_once base_dir().'/include/init/init.php';
$pageTitle = tr('Login');
@ -150,7 +150,7 @@ echo' required>
{[ "type": "password", "name": "password", "autocomplete": "current-password", "placeholder": "'.tr('Password').'", "icon-before": "<i class=\"fa fa-lock\"></i>" ]}
<div class="text-right">
<small><a href="'.ROOTDIR.'/reset.php">'.tr('Password dimenticata?').'</a></small>
<small><a href="'.base_path().'/reset.php">'.tr('Password dimenticata?').'</a></small>
</div>
</div>

View File

@ -37,8 +37,8 @@ echo '
<div class="box-body">';
if (file_exists($docroot.'/assistenza.php')) {
include $docroot.'/assistenza.php';
if (file_exists(base_dir().'/assistenza.php')) {
include base_dir().'/assistenza.php';
} else {
echo '
<div class="row">

View File

@ -22,6 +22,7 @@
*
* @since 2.4.2
*/
use Common\Components\Accounting;
/**
* Esegue una somma precisa tra due interi/array.
@ -113,7 +114,7 @@ function orderValue($table, $field, $id)
*
* @return string|null
*/
function discountInfo(\Common\Components\Row $riga, $mostra_maggiorazione = true)
function discountInfo(Accounting $riga, $mostra_maggiorazione = true)
{
if (empty($riga->sconto_unitario) || (!$mostra_maggiorazione && $riga->sconto_unitario < 0)) {
return null;

View File

@ -17,11 +17,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
/*
* Funzioni fondamentali per il corretto funzionamento del nucleo del progetto.
*
* @since 2.3
*/
use HTMLBuilder\HTMLBuilder;
use Models\OperationLog;
/**
@ -62,7 +64,7 @@ function sanitizeFilename($filename)
/**
* Elimina i file indicati.
*
* @param array $files
* @param array|string $files
*
* @return bool
*/
@ -213,8 +215,10 @@ function translateTemplate()
$id_record = filter('id_record');
$id_parent = filter('id_parent');
$id_module = Modules::getCurrent()['id'];
$id_plugin = Plugins::getCurrent()['id'];
$module = Modules::getCurrent();
$plugin = Plugins::getCurrent();
$id_module = $module ? $module['id'] : null;
$id_plugin = $plugin ? $plugin['id'] : null;
$template = ob_get_clean();
@ -225,7 +229,7 @@ function translateTemplate()
];
$template = replace($template, $replaces);
$template = \HTMLBuilder\HTMLBuilder::replace($template);
$template = HTMLBuilder::replace($template);
$template = replace($template, $replaces);
// Informazioni estese sulle azioni dell'utente
@ -308,9 +312,9 @@ function redirectOperation($id_module, $id_record)
$hash = $hash == '#tab_0' ? '' : $hash;
if ($backto == 'record-edit') {
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash);
redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash);
} elseif ($backto == 'record-list') {
redirect(ROOTDIR.'/controller.php?id_module='.$id_module.$hash);
redirect(base_path().'/controller.php?id_module='.$id_module.$hash);
}
exit();
@ -358,7 +362,7 @@ function getURLPath()
if (substr($path, 0, strlen($prefix)) == $prefix) {
$path = substr($path, strlen($prefix));
} else {
$path = str_replace(DOCROOT, ROOTDIR, $path);
$path = str_replace(base_dir(), base_path(), $path);
}
return slashes($path);
@ -406,3 +410,86 @@ function check_query($query)
return true;
}
/**
* Restituisce il valore corrente di un parametro della sessione.
*
* @param string $name Nome del parametro in dot-notation
* @param mixed|null $default
*
* @return array|mixed|null
*/
function session_get($name, $default = null)
{
$session = &$_SESSION;
if (empty($name)) {
return $default;
}
$pieces = explode('.', $name);
foreach ($pieces as $piece) {
if (!isset($session[$piece])) {
return $default;
}
$session = &$session[$piece];
}
return isset($session) ? $session : $default;
}
/**
* Imposta un parametro nella sessione secondo un nome indicato.
*
* @param string $name Nome del parametro in dot-notation
* @param mixed $value Valore da impostare
*
* @return void
*/
function session_set($name, $value)
{
$session = &$_SESSION;
if (!empty($name)) {
$pieces = explode('.', $name);
foreach ($pieces as $piece) {
if (!isset($session[$piece])) {
$session[$piece] = [];
}
$session = &$session[$piece];
}
}
$session = $value;
}
/**
* Restituisce l'URL completo per il gestionale.
*
* @return string
*/
function base_url()
{
return App::$baseurl;
}
/**
* Restituisce l'URL parziale per il gestionale.
*
* @return string
*/
function base_path()
{
return App::$rootdir;
}
/**
* Restituisce il percorso per la cartella principale del gestionale.
*
* @return string
*/
function base_dir()
{
return App::$docroot;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -33,14 +33,14 @@ switch (filter('op')) {
}
// Salvataggio della versione nella cache
Cache::get('Ultima versione di OpenSTAManager disponibile')->set($versione);
Cache::pool('Ultima versione di OpenSTAManager disponibile')->set($versione);
echo $versione;
break;
case 'upload':
include DOCROOT.'/modules/aggiornamenti/upload_modules.php';
include base_dir().'/modules/aggiornamenti/upload_modules.php';
break;
}

View File

@ -49,7 +49,7 @@ $(document).ready(function () {
return;
}
$contents = file_get_contents(DOCROOT.'/checksum.json');
$contents = file_get_contents(base_dir().'/checksum.json');
$checksum = json_decode($contents);
if (empty($checksum)) {
@ -66,7 +66,7 @@ if (empty($checksum)) {
// Controllo degli errori
$errors = [];
foreach ($checksum as $file => $md5) {
$verifica = md5_file(DOCROOT.'/'.$file);
$verifica = md5_file(base_dir().'/'.$file);
if ($verifica != $md5) {
$errors[] = $file;
}

View File

@ -72,7 +72,7 @@ $(document).ready(function () {
return;
}
$contents = file_get_contents(DOCROOT.'/database.json');
$contents = file_get_contents(base_dir().'/database.json');
$data = json_decode($contents, true);
if (empty($data)) {

View File

@ -174,7 +174,7 @@ function search(button) {
</h3>
</div>
<div class="box-body">
<form action="'.ROOTDIR.'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" id="update">
<form action="'.base_path().'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" id="update">
<input type="hidden" name="op" value="upload">
{[ "type": "file", "name": "blob", "required": 1, "accept": ".zip" ]}
@ -236,7 +236,7 @@ echo '
<div>
<h3>'.tr('Requisiti').'</h3>';
include DOCROOT.'/include/init/requirements.php';
include base_dir().'/include/init/requirements.php';
echo '

View File

@ -34,9 +34,9 @@ function customStructure()
// Controlli di personalizzazione fisica
foreach ($dirs as $dir) {
$files = glob(DOCROOT.'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -44,9 +44,9 @@ function customStructure()
}
}
$files = glob(DOCROOT.'/'.$dir.'/*/custom/src/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/src/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -54,9 +54,9 @@ function customStructure()
}
}
$files = glob(DOCROOT.'/'.$dir.'/*/custom/src/Components/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/src/Components/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -64,9 +64,9 @@ function customStructure()
}
}
$files = glob(DOCROOT.'/'.$dir.'/*/custom/src/API/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/src/API/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -74,9 +74,9 @@ function customStructure()
}
}
$files = glob(DOCROOT.'/'.$dir.'/*/custom/ajax/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/ajax/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -84,9 +84,9 @@ function customStructure()
}
}
$files = glob(DOCROOT.'/'.$dir.'/*/custom/widgets/*.{php,html}', GLOB_BRACE);
$files = glob(base_dir().'/'.$dir.'/*/custom/widgets/*.{php,html}', GLOB_BRACE);
foreach ($files as $file) {
$file = str_replace(DOCROOT.'/', '', $file);
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
@ -105,7 +105,7 @@ function customStructure()
*/
function customTables()
{
$tables = include DOCROOT.'/update/tables.php';
$tables = include base_dir().'/update/tables.php';
$names = [];
foreach ($tables as $table) {

View File

@ -49,7 +49,7 @@ class UpdateHook extends CachedManager
}
$module = Modules::get('Aggiornamenti');
$link = ROOTDIR.'/controller.php?id_module='.$module->id;
$link = base_path().'/controller.php?id_module='.$module->id;
$message = tr("E' disponibile la versione _VERSION_ del gestionale", [
'_VERSION_' => $update,

View File

@ -38,13 +38,13 @@ $extraction_dir = Zip::extract($_FILES['blob']['tmp_name']);
// Aggiornamento del progetto
if (file_exists($extraction_dir.'/VERSION')) {
// 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);
} else {
$finder = Symfony\Component\Finder\Finder::create()
->files()
@ -83,7 +83,7 @@ if (file_exists($extraction_dir.'/VERSION')) {
}
// Copia dei file nella cartella relativa
copyr(dirname($file->getRealPath()), $docroot.'/'.$directory.'/'.$info['directory']);
copyr(dirname($file->getRealPath()), base_dir().'/'.$directory.'/'.$info['directory']);
// Eventuale registrazione nel database
if (empty($installed)) {
@ -110,4 +110,4 @@ if (file_exists($extraction_dir.'/VERSION')) {
delete($extraction_dir);
// Redirect
redirect(ROOTDIR.'/editor.php?id_module='.$id_module);
redirect(base_path().'/editor.php?id_module='.$id_module);

View File

@ -196,13 +196,14 @@ switch (post('op')) {
// Se ad aggiungere un cliente è un agente, lo imposto come agente di quel cliente
// Lettura tipologia dell'utente loggato
$agente_is_logged = false;
if (!empty($user['idanagrafica'])) {
$rs = $dbo->fetchArray('SELECT descrizione FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica = an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica = '.prepare($user['idanagrafica']));
$rs = $dbo->fetchArray('SELECT descrizione FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica = an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica = '.prepare($user['idanagrafica']));
for ($i = 0; $i < count($rs); ++$i) {
if ($rs[$i]['descrizione'] == 'Agente') {
$agente_is_logged = true;
$i = count($rs);
for ($i = 0; $i < count($rs); ++$i) {
if ($rs[$i]['descrizione'] == 'Agente') {
$agente_is_logged = true;
$i = count($rs);
}
}
}

View File

@ -67,7 +67,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['ragione_sociale'];
$result['title'] .= !empty($r['deleted_at']) ? ' <small class="text-danger"><em>('.tr('eliminata').')</em></small>' : '';
$result['category'] = 'Anagrafiche';
@ -114,7 +114,7 @@ $plugin = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Referenti'");
foreach ($rs as $r) {
$result = [];
$result['link'] = ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$r['id'].'#tab_'.$plugin[0]['id'];
$result['link'] = base_path().'/editor.php?id_module='.$link_id.'&id_record='.$r['id'].'#tab_'.$plugin[0]['id'];
$result['title'] = $r['nome'];
$result['category'] = 'Referenti';

View File

@ -65,6 +65,8 @@ switch (post('op')) {
break;
}
$operations = [];
if (App::debug()) {
$operations['delete-bulk'] = [
'text' => '<span><i class="fa fa-trash"></i> '.tr('Elimina selezionati').'</span>',

View File

@ -47,6 +47,7 @@ if (!$is_cliente) {
}
}
$nazione_anagrafica = $anagrafica->sedeLegale->nazione;
?>
<form action="" method="post" id="edit-form" autocomplete="<?php echo setting('Autocompletamento form'); ?>" >
@ -129,7 +130,7 @@ if (!$is_cliente) {
$help_codice_destinatario .= ' <b>'.tr("Non è necessario comunicare il proprio codice destinatario ai fornitori in quanto è sufficiente che questo sia registrato nel portale del Sistema Di Interscambio dell'Agenzia Entrate (SDI)").'.</b>';
}
?>
{[ "type": "text", "label": "<?php echo ($record['tipo'] == 'Ente pubblico') ? tr('Codice unico ufficio') : tr('Codice destinatario'); ?>", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": <?php echo ($record['tipo'] == 'Ente pubblico') ? '6' : '7'; ?>, "help": "<?php echo tr($help_codice_destinatario); ?>", "readonly": "<?php echo intval($anagrafica->sedeLegale->nazione->iso2 != 'IT'); ?>" ]}
{[ "type": "text", "label": "<?php echo ($record['tipo'] == 'Ente pubblico') ? tr('Codice unico ufficio') : tr('Codice destinatario'); ?>", "name": "codice_destinatario", "required": 0, "class": "text-center text-uppercase alphanumeric-mask", "value": "$codice_destinatario$", "maxlength": <?php echo ($record['tipo'] == 'Ente pubblico') ? '6' : '7'; ?>, "help": "<?php echo tr($help_codice_destinatario); ?>", "readonly": "<?php echo intval($nazione_anagrafica ? $nazione_anagrafica->iso2 != 'IT' : 0); ?>" ]}
</div>
<div class="col-md-4">

View File

@ -19,7 +19,8 @@
namespace Modules\Anagrafiche;
use Common\Model;
use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Contratti\Contratto;
use Modules\DDT\DDT;
@ -34,6 +35,7 @@ use Util\Generator;
class Anagrafica extends Model
{
use SimpleModelTrait;
use RecordTrait;
use SoftDeletes;
@ -62,7 +64,7 @@ class Anagrafica extends Model
*/
public static function build($ragione_sociale, $nome = '', $cognome = '', array $tipologie = [])
{
$model = parent::build();
$model = new static();
$model->ragione_sociale = $ragione_sociale;

View File

@ -19,10 +19,13 @@
namespace Modules\Anagrafiche;
use Common\Model;
use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
class Nazione extends Model
{
use SimpleModelTrait;
protected $table = 'an_nazioni';
public function anagrafiche()

View File

@ -19,10 +19,13 @@
namespace Modules\Anagrafiche;
use Common\Model;
use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
class Sede extends Model
{
use SimpleModelTrait;
protected $table = 'an_sedi';
/**

View File

@ -19,10 +19,13 @@
namespace Modules\Anagrafiche;
use Common\Model;
use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
class Tipo extends Model
{
use SimpleModelTrait;
protected $table = 'an_tipianagrafiche';
protected $primaryKey = 'idtipoanagrafica';

View File

@ -131,7 +131,7 @@ switch (post('op')) {
// Salvataggio info componente (campo `contenuto`)
if (!empty($componente)) {
$contenuto_precedente_esistente = !empty($articolo->contenuto);
$contenuto = file_get_contents(DOCROOT.'/files/my_impianti/'.$componente);
$contenuto = file_get_contents(base_dir().'/files/impianti/'.$componente);
$contenuto_componente = Ini::read($contenuto);
// Lettura dei campi esistenti per preservarne il valore

View File

@ -43,7 +43,7 @@ switch ($resource) {
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
array_push($ids, '"'.$documenti[$i]['id'].'"');
}
@ -72,7 +72,7 @@ switch ($resource) {
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
array_push($ids, '"'.$documenti[$i]['id'].'"');
}
@ -100,7 +100,7 @@ switch ($resource) {
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
array_push($ids, '"'.$documenti[$i]['id'].'"');
}

View File

@ -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['codice'].' - '.$r['descrizione'];
$result['category'] = 'Articoli';

View File

@ -184,7 +184,9 @@ include_once __DIR__.'/../../core.php';
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
if (empty($prezzi_ivati)) {
echo '
<button type="button" class="btn btn-info btn-xs pull-right tip pull-right" title="'.tr('Scorpora iva dal prezzo di vendita.').'" id="scorpora_iva"><i class="fa fa-calculator" aria-hidden="true"></i></button>';
<button type="button" class="btn btn-info btn-xs pull-right tip pull-right" title="'.tr('Scorpora iva dal prezzo di vendita.').'" id="scorporaIva">
<i class="fa fa-calculator"></i>
</button>';
}
echo '
@ -243,11 +245,11 @@ echo '
<div class="form-group">
<label for="componente_filename">'.tr('Seleziona un componente').':</label>';
echo "
<select class=\"form-control superselect\" id=\"componente_filename\" name=\"componente_filename\" onchange=\"$.post('".$rootdir."/modules/my_impianti/actions.php', {op: 'load_componente', idarticolo: '".$id_record."', filename: $(this).find('option:selected').val() }, function(response){ $('#info_componente').html( response ); start_superselect(); $('.datepicker').datetimepicker({ locale: globals.locale, format: 'L' } ); } );\">\n";
<select class=\"form-control superselect\" id=\"componente_filename\" name=\"componente_filename\" onchange=\"$.post('".base_path()."/modules/impianti/actions.php', {op: 'load_componente', idarticolo: '".$id_record."', filename: $(this).find('option:selected').val() }, function(response){ $('#info_componente').html( response ); start_superselect(); $('.datepicker').datetimepicker({ locale: globals.locale, format: 'L' } ); } );\">\n";
echo '
<option value="0">'.tr('Nessuno').'</option>';
$cmp = Ini::getList($docroot.'/files/my_impianti/');
$cmp = Ini::getList(base_dir().'/files/impianti/');
if (count($cmp) > 0) {
for ($c = 0; $c < count($cmp); ++$c) {
@ -331,15 +333,17 @@ $("#categoria").change(function() {
$("#subcategoria").val(null).trigger("change");
});
function scorpora_iva() {
if ($("#idiva_vendita").val()!=''){
var percentuale = parseFloat($("#idiva_vendita").selectData().percentuale);
function scorporaIva() {
let iva_vendita = $("#idiva_vendita");
if (iva_vendita.val()) {
let percentuale = parseFloat(iva_vendita.selectData().percentuale);
if(!percentuale) return;
var input = $("#prezzo_vendita");
var prezzo = input.val().toEnglish();
let input = $("#prezzo_vendita");
let prezzo = input.val().toEnglish();
var scorporato = prezzo * 100 / (100 + percentuale);
let scorporato = prezzo * 100 / (100 + percentuale);
input.val(scorporato);
}else{
@ -347,8 +351,8 @@ function scorpora_iva() {
}
}
$("#scorpora_iva").click( function() {
scorpora_iva();
$("#scorporaIva").click( function() {
scorporaIva();
});
</script>

View File

@ -27,20 +27,20 @@ echo '
<div class="pull-right">';
if (empty($_GET['movimentazione_completa'])) {
echo '
<a class="btn btn-info btn-xs" href="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&movimentazione_completa=1#tab_'.$id_plugin.'">
<a class="btn btn-info btn-xs" href="'.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&movimentazione_completa=1#tab_'.$id_plugin.'">
<i class="fa fa-eye"></i>
'.tr('Mostra tutti i movimenti').'
</a>';
} else {
echo '
<a class="btn btn-info btn-xs" href="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&movimentazione_completa=0#tab_'.$id_plugin.'">
<a class="btn btn-info btn-xs" href="'.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&movimentazione_completa=0#tab_'.$id_plugin.'">
<i class="fa fa-eye-slash"></i>
'.tr('Mostra gli ultimi 20 movimenti').'
</a>';
}
echo '
<a class="btn btn-warning btn-xs" href="'.$rootdir.'/controller.php?id_module='.Modules::get('Movimenti')->id.'&search_Articolo='.($articolo->codice.' - '.$articolo->descrizione).'">
<a class="btn btn-warning btn-xs" href="'.base_path().'/controller.php?id_module='.Modules::get('Movimenti')->id.'&search_Articolo='.($articolo->codice.' - '.$articolo->descrizione).'">
<i class="fa fa-external-link"></i>
'.tr('Visualizza dettagli').'
</a>';

View File

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

View File

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

View File

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

View File

@ -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 '
<form action="'.$rootdir.'/pdfgen.php?id_print='.$id_print.'" method="post" target="_blank">
<form action="'.base_path().'/pdfgen.php?id_print='.$id_print.'" method="post" target="_blank">
<div class="row">

View File

@ -50,7 +50,7 @@ if (!is_writable($backup_dir) || !is_readable($backup_dir)) {
echo '<p>'.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').'.</p>';
if (starts_with($backup_dir, DOCROOT)) {
if (starts_with($backup_dir, base_dir())) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.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.'");
</script>
<a class="btn btn-primary" href="'.$rootdir.'/modules/backups/actions.php?op=getfile&number='.$id.'" target="_blank"><i class="fa fa-download"></i> '.tr('Scarica').'</a>
<a class="btn btn-primary" href="'.base_path().'/modules/backups/actions.php?op=getfile&number='.$id.'" target="_blank"><i class="fa fa-download"></i> '.tr('Scarica').'</a>
<div class="pull-right">
<a class="btn btn-warning ask" data-backto="record-edit" data-method="post" data-op="restore" data-number="'.$id.'" data-msg="'.tr('Vuoi ripristinare questo backup?').'" data-button="Ripristina" data-class="btn btn-lg btn-warning">

View File

@ -27,7 +27,7 @@ if (isset($id_record)) {
?><form action="<?php
if (isset($id_original)) {
echo ROOTDIR.'/controller.php?id_module='.$id_module;
echo base_path().'/controller.php?id_module='.$id_module;
if (isset($id_record)) {
echo '&id_record='.$id_record;

View File

@ -57,7 +57,7 @@ include_once __DIR__.'/../../core.php';
<div class="panel-body">
<div class="pull-left">
<a class="btn btn-primary" data-href="<?php echo $rootdir; ?>/add.php?id_module=<?php echo $id_module; ?>&id_original=<?php echo $id_record; ?>" data-toggle="modal" data-title="<?php echo tr('Aggiungi riga'); ?>"><i class="fa fa-plus"></i> <?php echo tr('Sottocategoria'); ?></a><br>
<a class="btn btn-primary" data-href="<?php echo base_path(); ?>/add.php?id_module=<?php echo $id_module; ?>&id_original=<?php echo $id_record; ?>" data-toggle="modal" data-title="<?php echo tr('Aggiungi riga'); ?>"><i class="fa fa-plus"></i> <?php echo tr('Sottocategoria'); ?></a><br>
</div>
<div class="clearfix"></div>
<hr>
@ -72,7 +72,7 @@ include_once __DIR__.'/../../core.php';
<th width="20%"><?php echo tr('Opzioni'); ?></th>
</tr>
<?php include $docroot.'/modules/'.Modules::get($id_module)['directory'].'/row-list.php'; ?>
<?php include base_dir().'/modules/'.Modules::get($id_module)['directory'].'/row-list.php'; ?>
</table>
</div>
</div>

View File

@ -29,7 +29,7 @@ foreach ($subcategorie as $sub) {
<td>'.$sub['colore'].'</td>
<td>'.$sub['nota'].'</td>
<td>
<a class="btn btn-warning btn-sm" title="Modifica riga" onclick="launch_modal(\''.tr('Modifica sottocategoria').'\', \''.$rootdir.'/add.php?id_module='.$id_module.'&id_record='.$sub['id'].'&id_original='.$id_record.'\');"><i class="fa fa-edit"></i></a>
<a class="btn btn-warning btn-sm" title="Modifica riga" onclick="launch_modal(\''.tr('Modifica sottocategoria').'\', \''.base_path().'/add.php?id_module='.$id_module.'&id_record='.$sub['id'].'&id_original='.$id_record.'\');"><i class="fa fa-edit"></i></a>
<a class="btn btn-sm btn-danger ask '.(($n_articoli > 0) ? 'disabled tip' : '').'" data-backto="record-edit" data-id="'.$sub['id'].'" title="'.(($n_articoli > 0) ? 'Sottocategoria collegata a '.$n_articoli.' articoli' : '').'">
<i class="fa fa-trash"></i>
</a>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -237,7 +237,7 @@ if (!empty($rs)) {
</td>
<td>
<button type="button" class="btn btn-warning" data-toggle="tooltip" title="Importa valori da tariffe standard" onclick="if( confirm(\'Importare i valori dalle tariffe standard?\') ){ $.post( \''.$rootdir.'/modules/contratti/actions.php\', { op: \'import\', idcontratto: \''.$id_record.'\', idtipointervento: \''.$rs[$i]['idtipointervento'].'\' }, function(data){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'\'; } ); }">
<button type="button" class="btn btn-warning" data-toggle="tooltip" title="Importa valori da tariffe standard" onclick="if( confirm(\'Importare i valori dalle tariffe standard?\') ){ $.post( \''.base_path().'/modules/contratti/actions.php\', { op: \'import\', idcontratto: \''.$id_record.'\', idtipointervento: \''.$rs[$i]['idtipointervento'].'\' }, function(data){ location.href=\''.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'\'; } ); }">
<i class="fa fa-download"></i>
</button>
</td>
@ -289,7 +289,7 @@ if (!empty($rs)) {
</td>
<td>
<button type="button" class="btn btn-warning" data-toggle="tooltip" title="Importa valori da tariffe standard" onclick="if( confirm(\'Importare i valori dalle tariffe standard?\') ){ $.post( \''.$rootdir.'/modules/contratti/actions.php\', { op: \'import\', idcontratto: \''.$id_record.'\', idtipointervento: \''.$rs[$i]['idtipointervento'].'\' }, function(data){ location.href=\''.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'\'; } ); }">
<button type="button" class="btn btn-warning" data-toggle="tooltip" title="Importa valori da tariffe standard" onclick="if( confirm(\'Importare i valori dalle tariffe standard?\') ){ $.post( \''.base_path().'/modules/contratti/actions.php\', { op: \'import\', idcontratto: \''.$id_record.'\', idtipointervento: \''.$rs[$i]['idtipointervento'].'\' }, function(data){ location.href=\''.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'\'; } ); }">
<i class="fa fa-download"></i>
</button>
</td>

View File

@ -51,9 +51,9 @@ foreach ($righe as $riga) {
<td>';
// Aggiunta dei riferimenti ai documenti
if ($riga->hasOriginal()) {
if ($riga->hasOriginalComponent()) {
echo '
<small class="pull-right text-right text-muted">'.reference($riga->getOriginal()->parent, tr('Origine')).'</small>';
<small class="pull-right text-right text-muted">'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine')).'</small>';
}
// Descrizione

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -74,7 +74,7 @@ switch (filter('op')) {
'title' => '<b>Int. '.$sessione['codice'].'</b> '.$sessione['cliente'].'<br><b>'.tr('Tecnici').':</b> '.$sessione['nome_tecnico'].' '.(($sessione['have_attachments']) ? '<i class="fa fa-paperclip" aria-hidden="true"></i>' : ''),
'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'],

View File

@ -31,10 +31,11 @@ echo '
<ul class="dropdown-menu" role="menu">';
// Stati intervento
$stati_sessione = session_get('dashboard.idstatiintervento', []);
$stati_intervento = $dbo->fetchArray('SELECT idstatointervento AS id, descrizione, colore FROM in_statiintervento WHERE deleted_at IS NULL ORDER BY descrizione ASC');
foreach ($stati_intervento as $stato) {
$attr = '';
if (in_array("'".$stato['id']."'", $_SESSION['dashboard']['idstatiintervento'])) {
if (in_array("'".$stato['id']."'", $stati_sessione)) {
$attr = 'checked="checked"';
}
@ -68,10 +69,11 @@ echo '
<ul class="dropdown-menu" role="menu">';
// Tipi intervento
$tipi_sessione = session_get('dashboard.idtipiintervento', []);
$tipi_intervento = $dbo->fetchArray('SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC');
foreach ($tipi_intervento as $tipo) {
$attr = '';
if (in_array("'".$tipo['id']."'", $_SESSION['dashboard']['idtipiintervento'])) {
if (in_array("'".$tipo['id']."'", $tipi_sessione)) {
$attr = 'checked="checked"';
}
@ -104,12 +106,13 @@ echo '
</button>
<ul class="dropdown-menu" role="menu">';
$tecnici_sessione = session_get('dashboard.idtecnici', []);
$tecnici_disponibili = $dbo->fetchArray("SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale, colore FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica
LEFT OUTER JOIN in_interventi_tecnici ON in_interventi_tecnici.idtecnico = an_anagrafiche.idanagrafica INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id
WHERE an_anagrafiche.deleted_at IS NULL AND an_tipianagrafiche.descrizione='Tecnico' ".Modules::getAdditionalsQuery('Interventi').' GROUP BY an_anagrafiche.idanagrafica ORDER BY ragione_sociale ASC');
foreach ($tecnici_disponibili as $tecnico) {
$attr = '';
if (in_array("'".$tecnico['id']."'", $_SESSION['dashboard']['idtecnici'])) {
if (in_array("'".$tecnico['id']."'", $tecnici_sessione)) {
$attr = 'checked="checked"';
}
@ -143,10 +146,11 @@ echo '
<ul class="dropdown-menu" role="menu">';
// Zone
$zone_sessione = session_get('dashboard.idzone', []);
$zone = $dbo->fetchArray('(SELECT 0 AS ordine, \'0\' AS id, \'Nessuna zona\' AS descrizione) UNION (SELECT 1 AS ordine, id, descrizione FROM an_zone) ORDER BY ordine, descrizione ASC');
foreach ($zone as $zona) {
$attr = '';
if (in_array("'".$zona['id']."'", $_SESSION['dashboard']['idzone'])) {
if (in_array("'".$zona['id']."'", $zone_sessione)) {
$attr = 'checked="checked"';
}

View File

@ -51,7 +51,7 @@ if (empty($notes)) {
$moduli = $notes->groupBy('id_module')->sortBy('notification_date');
foreach ($moduli as $module_id => $note) {
$modulo = Module::get($module_id);
$modulo = Module::pool($module_id);
echo '
<h4>'.$modulo->title.'</h4>

View File

@ -35,6 +35,7 @@ if (!empty($id_documento)) {
'serials' => true,
'documento' => $documento,
'documento_finale' => $documento_finale,
'tipo_documento_finale' => DDT::class,
];
echo App::load('importa.php', [], $options, true);

View File

@ -51,7 +51,7 @@ foreach ($rs as $r) {
$numero = empty($r['numero_esterno']) ? $r['numero'] : $r['numero_esterno'];
$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['tipologia'].' num. '.$numero.' del '.Translator::dateToLocale($r['data']);
$result['category'] = $r['tipologia'];

View File

@ -20,6 +20,7 @@
include_once __DIR__.'/../../core.php';
use Modules\DDT\DDT;
use Modules\Fatture\Fattura;
$documento = DDT::find($id_record);
@ -27,6 +28,7 @@ $module = Modules::get($id_module);
$final_module = $module['name'] == 'Ddt di vendita' ? 'Fatture di vendita' : 'Fatture di acquisto';
$dir = $module['name'] == 'Ddt di vendita' ? 'entrata' : 'uscita';
$tipo_documento_finale = Fattura::class;
$options = [
'op' => 'add_documento',
@ -37,6 +39,7 @@ $options = [
'dir' => $dir,
'create_document' => true,
'documento' => $documento,
'tipo_documento_finale' => $tipo_documento_finale,
];
echo App::load('importa.php', [], $options, true);

View File

@ -324,7 +324,7 @@ if (!$block_edit) {
$ordini = $dbo->fetchArray($ordini_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/ddt/add_ordine.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi ordine">
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.base_path().'/modules/ddt/add_ordine.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi ordine">
<i class="fa fa-plus"></i> '.tr('Ordine').'
</a>';

View File

@ -76,9 +76,9 @@ foreach ($righe as $riga) {
</button>';
// Aggiunta dei riferimenti ai documenti
if ($riga->hasOriginal()) {
if ($riga->hasOriginalComponent()) {
echo '
<br>'.reference($riga->getOriginal()->parent, tr('Origine'));
<br>'.reference($riga->getOriginalComponent()->getDocument(), tr('Origine'));
}
echo '
</small>';

View File

@ -29,16 +29,4 @@ class Articolo extends Article
protected $table = 'dt_righe_ddt';
protected $serialRowID = 'ddt';
/**
* Crea un nuovo articolo collegato ad una ddt.
*
* @return self
*/
public static function build(DDT $ddt, Original $articolo)
{
$model = parent::build($ddt, $articolo);
return $model;
}
}

View File

@ -27,16 +27,4 @@ class Descrizione extends Description
use RelationTrait;
protected $table = 'dt_righe_ddt';
/**
* Crea una nuova riga collegata ad una ddt.
*
* @return self
*/
public static function build(DDT $ddt)
{
$model = parent::build($ddt);
return $model;
}
}

View File

@ -23,18 +23,18 @@ use Modules\DDT\DDT;
trait RelationTrait
{
public function getParentID()
public function getDocumentID()
{
return 'idddt';
}
public function parent()
public function document()
{
return $this->belongsTo(DDT::class, $this->getParentID());
return $this->belongsTo(DDT::class, $this->getDocumentID());
}
public function ddt()
{
return $this->parent();
return $this->document();
}
}

Some files were not shown because too many files have changed in this diff Show More