This commit is contained in:
Beppe 2020-10-02 16:45:13 +02:00
commit 2ee232f8d6
373 changed files with 9936 additions and 9236 deletions

View File

@ -4,6 +4,7 @@ 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)
@ -28,6 +29,50 @@ 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
- Corretta l'impostazione degli Sconti generici nei Documenti per l'utilizzo dell'importo ivato nel caso dell'impostazione "Utilizza prezzi di vendita comprensivi di IVA"
### 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
@ -42,7 +87,6 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- Fix su calcolo movimenti in caso di insoluto
- Fix raggruppamento movimenti composti
## 2.4.17 (2020-08-24)
### Aggiunto (Added)

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.
*/
@ -207,11 +208,11 @@ jQuery.fn.selectData = function () {
if (this.prop('multiple')) {
return selectData;
} else if (selectData.length === 0) {
return undefined;
} else {
} else if (selectData.length !== 0 && selectData[0].id) {
return selectData[0];
}
return undefined;
};
/**

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,43 +18,47 @@
*/
return [
'modules/aggiornamenti' => 'Modules\Aggiornamenti',
'modules/anagrafiche' => 'Modules\Anagrafiche',
'modules/backups' => 'Modules\Backups',
'modules/emails' => 'Modules\Emails',
'modules/articoli' => 'Modules\Articoli',
'modules/checklists' => 'Modules\Checklists',
'modules/ritenute' => 'Modules\Ritenute',
'modules/ritenute_contributi' => 'Modules\RitenuteContributi',
'modules/rivalse' => 'Modules\Rivalse',
'modules/newsletter' => 'Modules\Newsletter',
'modules/iva' => 'Modules\Iva',
'modules/ddt' => 'Modules\DDT',
'modules/fatture' => 'Modules\Fatture',
'modules/ordini' => 'Modules\Ordini',
'modules/preventivi' => 'Modules\Preventivi',
'modules/contratti' => 'Modules\Contratti',
'modules/interventi' => 'Modules\Interventi',
'modules/pagamenti' => 'Modules\Pagamenti',
'modules/statistiche' => 'Modules\Statistiche',
'modules/scadenzario' => 'Modules\Scadenzario',
'modules/primanota' => 'Modules\PrimaNota',
'modules/utenti' => 'Modules\Utenti',
'modules/stato_servizi' => 'Modules\StatoServizi',
'modules/stati_intervento' => 'Modules\StatiIntervento',
'modules/stati_preventivo' => 'Modules\StatiPreventivo',
'modules/stati_contratto' => 'Modules\StatiContratto',
'modules/tipi_intervento' => 'Modules\TipiIntervento',
'modules/categorie_documenti' => 'Modules\CategorieDocumentali',
'modules/listini' => 'Modules\Listini',
'modules/impianti' => 'Modules\Impianti',
'modules/impostazioni' => 'Modules\Impostazioni',
'plugins/exportFE' => 'Plugins\ExportFE',
'plugins/importFE' => 'Plugins\ImportFE',
'plugins/receiptFE' => 'Plugins\ReceiptFE',
'plugins/dichiarazioni_intento' => 'Plugins\DichiarazioniIntento',
'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi',
'plugins/pianificazione_fatturazione' => 'Plugins\PianificazioneFatturazione',
'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli',
'plugins/dettagli_articolo' => 'Plugins\DettagliArticolo',
'modules/banche' => 'Modules\Banche',
];
/*
'modules/aggiornamenti' => 'Modules\Aggiornamenti',
'modules/anagrafiche' => 'Modules\Anagrafiche',
'modules/backups' => 'Modules\Backups',
'modules/emails' => 'Modules\Emails',
'modules/articoli' => 'Modules\Articoli',
'modules/checklists' => 'Modules\Checklists',
'modules/ritenute' => 'Modules\Ritenute',
'modules/ritenute_contributi' => 'Modules\RitenuteContributi',
'modules/rivalse' => 'Modules\Rivalse',
'modules/newsletter' => 'Modules\Newsletter',
'modules/iva' => 'Modules\Iva',
'modules/ddt' => 'Modules\DDT',
'modules/fatture' => 'Modules\Fatture',
'modules/ordini' => 'Modules\Ordini',
'modules/preventivi' => 'Modules\Preventivi',
'modules/contratti' => 'Modules\Contratti',
'modules/interventi' => 'Modules\Interventi',
'modules/pagamenti' => 'Modules\Pagamenti',
'modules/statistiche' => 'Modules\Statistiche',
'modules/scadenzario' => 'Modules\Scadenzario',
'modules/primanota' => 'Modules\PrimaNota',
'modules/utenti' => 'Modules\Utenti',
'modules/stato_servizi' => 'Modules\StatoServizi',
'modules/stati_intervento' => 'Modules\StatiIntervento',
'modules/stati_preventivo' => 'Modules\StatiPreventivo',
'modules/stati_contratto' => 'Modules\StatiContratto',
'modules/tipi_intervento' => 'Modules\TipiIntervento',
'modules/categorie_documenti' => 'Modules\CategorieDocumentali',
'modules/listini' => 'Modules\Listini',
'modules/impianti' => 'Modules\Impianti',
'modules/impostazioni' => 'Modules\Impostazioni',
'plugins/exportFE' => 'Plugins\ExportFE',
'plugins/importFE' => 'Plugins\ImportFE',
'plugins/receiptFE' => 'Plugins\ReceiptFE',
'plugins/dichiarazioni_intento' => 'Plugins\DichiarazioniIntento',
'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi',
'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');
@ -39,13 +39,16 @@ if (!empty($id_record)) {
]);
Util\Query::setSegments(true);
}
$query = str_replace(['AND `deleted_at` IS NULL', '`deleted_at` IS NULL AND', '`deleted_at` IS NULL', 'AND deleted_at IS NULL', 'deleted_at IS NULL AND', 'deleted_at IS NULL'], '', $query);
// Replace automatico del campo deleted_at se non specifico a una tabella
if (!str_contains($query, '.`deleted_at`') && !str_contains($query, '.deleted_at')) {
$query = str_replace(['AND `deleted_at` IS NULL', '`deleted_at` IS NULL AND', '`deleted_at` IS NULL', 'AND deleted_at IS NULL', 'deleted_at IS NULL AND', 'deleted_at IS NULL'], '', $query);
}
$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) {
@ -58,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>';
@ -142,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>
@ -262,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>';
@ -276,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>';
@ -378,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>';
@ -399,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>';
}
@ -418,8 +421,8 @@ 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" ){
// Nascondo il plugin Note interne ai clienti
if ($user->gruppo == 'Clienti') {
echo '
$("#link-tab_note").hide();';
}
@ -477,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; ?>
},

0
files/impianti/componente.ini Normal file → Executable file
View File

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

@ -23,65 +23,68 @@ echo App::internalLoad('descrizione.php', $result, $options);
// Conti, rivalsa INPS e ritenuta d'acconto
echo App::internalLoad('conti.php', $result, $options);
$incorpora_iva = $options['dir'] == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA');
// Sconto percentuale
echo '
<div class="row">';
<div class="row">';
if ($options['action'] == 'add') {
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto/maggiorazione percentuale').'", "name": "sconto_percentuale", "icon-after": "%", "help": "'.tr('Il valore positivo indica uno sconto: per applicare una maggiorazione inserire un valore negativo').'" ]}
</div>';
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto/maggiorazione percentuale').'", "name": "sconto_percentuale", "icon-after": "%", "help": "'.tr('Il valore positivo indica uno sconto: per applicare una maggiorazione inserire un valore negativo').'" ]}
</div>';
}
// Sconto unitario
echo '
<div class="col-md-'.($options['action'] == 'add' ? 4 : 6).'">
{[ "type": "number", "label": "'.tr('Sconto/maggiorazione unitario').'", "name": "sconto_unitario", "value": "'.$result['sconto_unitario'].'", "icon-after": "'.currency().'", "help": "'.tr('Il valore positivo indica uno sconto: per applicare una maggiorazione inserire un valore negativo').'" ]}
</div>';
<div class="col-md-'.($options['action'] == 'add' ? 4 : 6).'">
{[ "type": "number", "label": "'.tr('Sconto/maggiorazione unitario').'", "name": "sconto_unitario", "value": "'.$result['sconto_unitario_corrente'].'", "icon-after": "'.currency().'", "help": "'.tr('Il valore positivo indica uno sconto: per applicare una maggiorazione inserire un valore negativo').'" ]}
</div>';
// Iva
echo '
<div class="col-md-'.($options['action'] == 'add' ? 4 : 6).'">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$result['idiva'].'", "ajax-source": "iva" ]}
</div>
</div>';
<div class="col-md-'.($options['action'] == 'add' ? 4 : 6).'">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$result['idiva'].'", "ajax-source": "iva" ]}
</div>
</div>';
// Funzione per l'aggiornamento in tempo reale del guadagno
// Funzione per l'aggiornamento in tempo reale dello sconto
$totale_documento = $incorpora_iva ? $options['totale_documento'] : $options['totale_imponibile_documento'];
echo '
<script>
var descrizione = $("#descrizione_riga");
<script>
var descrizione = $("#descrizione_riga");
var form = descrizione.closest("form");
var sconto_percentuale = form.find("#sconto_percentuale");
var sconto_unitario = form.find("#sconto_unitario");
var form = descrizione.closest("form");
var sconto_percentuale = form.find("#sconto_percentuale");
var sconto_unitario = form.find("#sconto_unitario");
var totale = '.($options['totale_imponibile'] ?: 0).';
var totale = '.($totale_documento ?: 0).';
function aggiorna_sconto_percentuale() {
var sconto = sconto_percentuale.val().toEnglish();
var unitario = sconto / 100 * totale;
function aggiorna_sconto_percentuale() {
var sconto = sconto_percentuale.val().toEnglish();
var unitario = sconto / 100 * totale;
var msg = sconto >= 0 ? "'.tr('Sconto percentuale').'" : "'.tr('Maggiorazione percentuale').'";
var msg = sconto >= 0 ? "'.tr('Sconto percentuale').'" : "'.tr('Maggiorazione percentuale').'";
sconto_unitario.val(unitario.toLocale());
sconto_unitario.val(unitario.toLocale());
if (!descrizione.val() && sconto !== 0) {
descrizione.val(msg + " " + Math.abs(sconto).toLocale() + "%");
}
if (!descrizione.val() && sconto !== 0) {
descrizione.val(msg + " " + Math.abs(sconto).toLocale() + "%");
}
}
function aggiorna_sconto_unitario(){
var sconto = sconto_unitario.val().toEnglish();
var msg = sconto >= 0 ? "'.tr('Sconto unitario').'" : "'.tr('Maggiorazione unitaria').'";
function aggiorna_sconto_unitario(){
var sconto = sconto_unitario.val().toEnglish();
var msg = sconto >= 0 ? "'.tr('Sconto unitario').'" : "'.tr('Maggiorazione unitaria').'";
sconto_percentuale.val(0);
sconto_percentuale.val(0);
if (!descrizione.val() && sconto !== 0) {
descrizione.val(msg);
}
if (!descrizione.val() && sconto !== 0) {
descrizione.val(msg);
}
}
sconto_percentuale.keyup(aggiorna_sconto_percentuale);
sconto_unitario.keyup(aggiorna_sconto_unitario);
</script>';
sconto_percentuale.keyup(aggiorna_sconto_percentuale);
sconto_unitario.keyup(aggiorna_sconto_unitario);
</script>';

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

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

@ -334,7 +334,7 @@ switch ($resource) {
* - idanagrafica
*/
case 'dichiarazioni_intento':
$query = "SELECT id, CONCAT_WS(' - ', numero_protocollo, numero_progressivo) as descrizione FROM co_dichiarazioni_intento |where| ORDER BY data";
$query = "SELECT id, CONCAT_WS(' - ', numero_protocollo, numero_progressivo) AS descrizione FROM co_dichiarazioni_intento |where| ORDER BY data";
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);

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

@ -18,6 +18,7 @@
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
include_once __DIR__.'/../../core.php';
@ -47,6 +48,7 @@ if (!$is_cliente) {
}
}
$nazione_anagrafica = $anagrafica->sedeLegale->nazione;
?>
<form action="" method="post" id="edit-form" autocomplete="<?php echo setting('Autocompletamento form'); ?>" >
@ -129,7 +131,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">
@ -378,7 +380,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="tab-content '.(!$is_cliente && !$is_fornitore && !$is_tecnico ? 'hide' : '').'">
<div class="tab-pane '.(!$is_cliente && !$is_fornitore ? ' hide' : '').'" id="cliente_fornitore">
<div class="row">
<!--div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Appoggio bancario').'", "name": "appoggiobancario", "value": "$appoggiobancario$" ]}
</div>
@ -387,6 +389,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
{[ "type": "text", "label": "'.tr('Filiale banca').'", "name": "filiale", "value": "$filiale$" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Codice IBAN').'", "name": "codiceiban", "value": "$codiceiban$" ]}
@ -395,7 +398,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Codice BIC').'", "name": "bic", "value": "$bic$" ]}
</div>
</div>
</div-->
<div class="row">
<div class="col-md-3">
@ -405,10 +408,36 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="col-md-9">
{[ "type": "text", "label": "'.tr('Dicitura fissa in fattura').'", "name": "diciturafissafattura", "value": "$diciturafissafattura$" ]}
</div>
</div>
</div>';
</div>';
$banche = Banca::where('id_anagrafica', $anagrafica->id)->get();
$banca_predefinita = $banche->first(function ($item) {
return !empty($item['predefined']);
});
$modulo_banche = Modules::get('Banche');
if (!$banche->isEmpty()) {
echo '
<div class="row">
<div class="col-md-6">
<a href="'.base_path().'/editor.php?id_module='.$modulo_banche['id'].'&id_record='.$banca_predefinita->id.'">
'.tr("Visualizza la banca predefinita per l'Anagrafica").' <i class="fa fa-external-link"></i>
</a>
</div>
<div class="col-md-6">
<a href="'.base_path().'/controller.php?id_module='.$modulo_banche['id'].'&search_Anagrafica='.rawurlencode($anagrafica['ragione_sociale']).'">
'.tr("Visualizza le banche disponibili per l'Anagrafica").' <i class="fa fa-external-link"></i>
</a>
</div>
</div>';
} else {
echo '
<p>'.tr("Nessuna banca disponibile per l'Anagrafica").'</p>';
}
echo '
</div>
<div class="tab-pane '.(!$is_cliente ? 'hide' : 'active').'" id="cliente">
<div class="row">
<div class="col-md-6">
@ -426,7 +455,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Banca predefinita').'", "name": "idbanca_vendite", "values": "query=SELECT id, nome AS descrizione FROM co_banche WHERE deleted_at IS NULL ORDER BY nome ASC", "value": "$idbanca_vendite$", "icon-after": "add|'.Modules::get('Banche')['id'].'", "help": "'.tr('Banca predefinita su cui accreditare i pagamenti.').'" ]}
{[ "type": "select", "label": "'.tr('Banca predefinita per accrediti').'", "name": "idbanca_vendite", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "$idbanca_vendite$", "help": "'.tr("Banca predefinita dell'Azienda su cui accreditare i pagamenti").'" ]}
</div>
</div>
@ -461,7 +490,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
</div>';
// Collegamento con il conto
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_cliente']));
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione AS descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_cliente']));
echo '
<div class="row">
@ -488,7 +517,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Banca predefinita').'", "name": "idbanca_acquisti", "values": "query=SELECT id, nome AS descrizione FROM co_banche ORDER BY nome ASC", "value": "$idbanca_acquisti$", "icon-after": "add|'.Modules::get('Banche')['id'].'" ]}
{[ "type": "select", "label": "'.tr('Banca predefinita per addebiti').'", "name": "idbanca_acquisti", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "$idbanca_acquisti$", "help": "'.tr("Banca predefinita dell'Azienda da cui addebitare i pagamenti").'" ]}
</div>
</div>
@ -508,7 +537,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
</div>';
// Collegamento con il conto
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione AS descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
echo '
<div class="col-md-6">
@ -561,7 +590,6 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
]); ?>" ]}
</div>
<!-- campi già specificati in Codice R.E.A., da eliminare nelle prossime release -->
<!--div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. C.C.I.A.A.'); ?>", "name": "cciaa", "value": "$cciaa$" ]}
@ -570,8 +598,8 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Città iscr. C.C.I.A.A.'); ?>", "name": "cciaa_citta", "value": "$cciaa_citta$" ]}
</div-->
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. tribunale'); ?>", "name": "iscrizione_tribunale", "value": "$iscrizione_tribunale$" ]}

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

@ -50,7 +50,8 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie" ]}
<?php echo Modules::link('Categorie articoli', $record['id_categoria'], null, null, 'class="pull-right"'); ?>
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie", "icon-after": "add|<?php echo Modules::get('Categorie articoli')['id']; ?>" ]}
</div>
<div class="col-md-6">
@ -184,7 +185,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 +246,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/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/impianti/');
$cmp = Ini::getList(base_dir().'/files/impianti/');
if (count($cmp) > 0) {
for ($c = 0; $c < count($cmp); ++$c) {
@ -331,15 +334,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 +352,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

@ -17,59 +17,58 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
include_once __DIR__.'/../../core.php';
switch (filter('op')) {
case 'update':
case 'add':
$id_anagrafica = filter('id_anagrafica');
$anagrafica = Anagrafica::find($id_anagrafica);
$nome = filter('nome');
$iban = filter('iban');
$bic = filter('bic');
if (isset($nome)) {
$array = [
'nome' => $nome,
'filiale' => post('filiale'),
'iban' => post('iban'),
'bic' => post('bic'),
'id_pianodeiconti3' => post('id_pianodeiconti3'),
'note' => post('note'),
];
$banca = Banca::build($anagrafica, $nome, $iban, $bic);
$id_record = $banca->id;
if (!empty($id_record)) {
$dbo->update('co_banche', $array, ['id' => $id_record]);
}
flash()->info(tr('Salvataggio completato.'));
} else {
flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio!'));
if (isAjaxRequest()) {
echo json_encode([
'id' => $id_record,
'text' => $nome,
]);
}
flash()->info(tr('Aggiunta nuova _TYPE_', [
'_TYPE_' => 'banca',
]));
break;
case 'add':
case 'update':
$nome = filter('nome');
$bic = filter('bic');
$iban = filter('iban');
if (isset($nome)) {
$dbo->query('INSERT INTO `co_banche` (`nome`, `bic`, `iban`) VALUES ('.prepare($nome).', '.prepare($bic).', '.prepare($iban).')');
$id_record = $dbo->lastInsertedID();
$banca->nome = post('nome');
$banca->iban = post('iban');
$banca->bic = post('bic');
if (isAjaxRequest()) {
echo json_encode(['id' => $id_record, 'text' => $nome]);
}
$banca->note = post('note');
$banca->id_pianodeiconti3 = post('id_pianodeiconti3');
$banca->filiale = post('filiale');
$banca->creditor_id = post('creditor_id');
flash()->info(tr('Aggiunta nuova _TYPE_', [
'_TYPE_' => 'banca',
]));
} else {
flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio!'));
}
$banca->predefined = post('predefined');
$banca->save();
flash()->info(tr('Salvataggio completato'));
break;
case 'delete':
$dbo->update('co_banche', [
'deleted_at' => date('Y-m-d H:i:s'),
], ['id' => $id_record]);
$banca->delete();
flash()->info(tr('_TYPE_ eliminata con successo!', [
'_TYPE_' => 'Banca',

View File

@ -19,29 +19,38 @@
include_once __DIR__.'/../../core.php';
?><form action="" method="post" id="add-form">
$id_anagrafica = filter('id_anagrafica');
echo '
<form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": "1" ]}
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Anagrafica').'", "name": "id_anagrafica", "required": "1", "value": "$id_anagrafica$", "ajax-source": "anagrafiche", "value": "'.$id_anagrafica.'", "disabled": "'.intval(!empty($id_anagrafica)).'" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Nome').'", "name": "nome", "required": "1" ]}
</div>
</div>
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$" ]}
{[ "type": "text", "label": "'.tr('IBAN').'", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('BIC'); ?>", "name": "bic", "class": "alphanumeric-mask", "maxlength": 11, "value": "$bic$" ]}
{[ "type": "text", "label": "'.tr('BIC').'", "name": "bic", "required": "1", "class": "alphanumeric-mask", "maxlength": 11, "value": "$bic$" ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></button>
<button type="submit" class="btn btn-primary">
<i class="fa fa-plus"></i> '.tr('Aggiungi').'
</button>
</div>
</div>
</form>
</form>';

View File

@ -0,0 +1,47 @@
<?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/>.
*/
include_once __DIR__.'/../../../core.php';
switch ($resource) {
/*
* Opzioni utilizzate:
* - id_anagrafica
*/
case 'banche':
$query = "SELECT id, CONCAT (nome, ' - ' , iban) AS descrizione FROM co_banche |where| ORDER BY nome";
foreach ($elements as $element) {
$filter[] = 'id = '.prepare($element);
}
if (empty($filter)) {
$where[] = 'deleted_at IS NULL';
}
$where[] = 'id_anagrafica='.prepare($superselect['id_anagrafica']);
if (!empty($search)) {
$search_fields[] = 'nome LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'filiale LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'iban LIKE '.prepare('%'.$search.'%');
}
break;
}

View File

@ -20,7 +20,6 @@
include_once __DIR__.'/../../core.php';
?><form action="" method="post" id="edit-form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -32,24 +31,43 @@ include_once __DIR__.'/../../core.php';
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": "1", "value": "$nome$" ]}
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Anagrafica'); ?>", "name": "id_anagrafica", "required": "1", "value": "$id_anagrafica$", "ajax-source": "anagrafiche", "disabled": 1 ]}
</div>
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Predefinito'); ?>", "name": "predefined", "value": "$predefined$", "disabled": "<?php echo intval($record['predefined']); ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": "1", "value": "$nome$" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Filiale'); ?>", "name": "filiale", "value": "$filiale$" ]}
</div>
<div class="col-md-4">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Conto predefinito'); ?>", "name": "id_pianodeiconti3", "value": "$id_pianodeiconti3$", "values": "query=SELECT id, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2 = 1" ]}
</div>
</div>
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('BIC'); ?>", "name": "bic", "class": "alphanumeric-mask", "maxlength": 11, "value": "$bic$" ]}
{[ "type": "text", "label": "<?php echo tr('BIC'); ?>", "name": "bic", "required": "1", "class": "alphanumeric-mask", "maxlength": 11, "value": "$bic$" ]}
</div>
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('ID Creditore SEPA'); ?>", "name": "creditor_id", "class": "alphanumeric-mask", "value": "$creditor_id$", "help": "<?php echo tr("Codice identificativo per l'azienda nell'area SEPA. Nel caso di aziende aderenti alla procedura Allineamento Elettronico Archivio per le quali non risulta reperibile in CF/PIVA viene generato un codice identificativo non significativo (NOTPROVIDEDXXXXXXXXXXXX)."); ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$" ]}
@ -62,15 +80,15 @@ include_once __DIR__.'/../../core.php';
<?php
// Collegamenti diretti (numerici)
$documenti = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_vendite='.prepare($id_record).'
$numero_documenti = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_vendite='.prepare($id_record).'
UNION SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_acquisti='.prepare($id_record).'
UNION SELECT idanagrafica FROM co_documenti WHERE idbanca='.prepare($id_record));
UNION SELECT idanagrafica FROM co_documenti WHERE id_banca_azienda = '.prepare($id_record).' OR id_banca_controparte = '.prepare($id_record));
if (!empty($documenti)) {
if (!empty($numero_documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),
'_NUM_' => $numero_documenti,
]).'.
</div>';
}

View File

@ -17,8 +17,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Banche\Banca;
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$record = $dbo->fetchOne('SELECT * FROM `co_banche` WHERE id='.prepare($id_record));
$banca = Banca::find($id_record);
if (!empty($banca)) {
$record = $banca->toArray();
}
}

View File

@ -0,0 +1,93 @@
<?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 Modules\Banche;
use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Anagrafiche\Anagrafica;
class Banca extends Model
{
use SimpleModelTrait;
use SoftDeletes;
protected $table = 'co_banche';
/**
* Crea una nuovo banca.
*
* @param string $nome
* @param string $iban
* @param string $bic
*
* @return self
*/
public static function build(Anagrafica $anagrafica, $nome, $iban, $bic)
{
$model = new static();
// Informazioni di base
$model->anagrafica()->associate($anagrafica);
$model->nome = $nome;
$model->iban = $iban;
$model->bic = $bic;
// Salvataggio delle informazioni
$model->save();
return $model;
}
public function anagrafica()
{
return $this->belongsTo(Anagrafica::class, 'id_anagrafica');
}
public function save(array $options = [])
{
$this->fixPredefined();
return parent::save($options);
}
protected function fixPredefined()
{
$predefined = isset($this->predefined) ? $this->predefined : false;
// Selezione automatica per primo record
$count = self::where('id_anagrafica', $this->id_anagrafica)
->where('id', '!=', $this->id)
->count();
if (empty($predefined) && empty($count)) {
$predefined = true;
}
if (!empty($predefined)) {
self::where('id_anagrafica', $this->id_anagrafica)
->where('id', '!=', $this->id)
->update([
'predefined' => 0,
]);
$this->attributes['predefined'] = $predefined;
}
}
}

View File

@ -43,15 +43,15 @@ include_once __DIR__.'/../../core.php';
<?php
// Collegamenti diretti (numerici)
$documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idaspettobeni='.prepare($id_record).'
$numero_documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idaspettobeni='.prepare($id_record).'
UNION SELECT id FROM co_documenti WHERE idaspettobeni='.prepare($id_record));
if (!empty($documenti)) {
if (!empty($numero_documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),
'_NUM_' => $numero_documenti,
]).'.
</div>';
}

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

@ -54,14 +54,14 @@ include_once __DIR__.'/../../core.php';
<?php
// Collegamenti diretti (numerici)
$documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idcausalet='.prepare($id_record).'
$numero_documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idcausalet='.prepare($id_record).'
UNION SELECT id FROM co_documenti WHERE idcausalet='.prepare($id_record));
if (!empty($documenti)) {
if (!empty($numero_documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),
'_NUM_' => $numero_documenti,
]).'.
</div>';
}

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();
@ -205,10 +205,7 @@ switch (post('op')) {
}
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');
$sconto->sconto_unitario = post('sconto_unitario');
$sconto->tipo_sconto = 'UNT';
$sconto->setScontoUnitario(post('sconto_unitario'), post('idiva'));
$sconto->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

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

@ -30,7 +30,8 @@ $options = [
'action' => 'add',
'dir' => $documento->direzione,
'idanagrafica' => $documento['idanagrafica'],
'totale_imponibile' => $documento->totale_imponibile,
'totale_imponibile_documento' => $documento->totale_imponibile,
'totale_documento' => $documento->totale,
'select-options' => [
'articoli' => [
'idanagrafica' => $documento->idanagrafica,

View File

@ -30,7 +30,8 @@ $options = [
'action' => 'edit',
'dir' => $documento->direzione,
'idanagrafica' => $documento['idanagrafica'],
'totale_imponibile' => $documento->totale_imponibile,
'totale_imponibile_documento' => $documento->totale_imponibile,
'totale_documento' => $documento->totale,
'select-options' => [
'articoli' => [
'idanagrafica' => $documento->idanagrafica,

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

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