Skip to content

Commit 89c3b0c

Browse files
authored
Merge branch 'master' into add-module-ubicaz
2 parents 5543b80 + 36c50d2 commit 89c3b0c

22 files changed

Lines changed: 578 additions & 306 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
44

55
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.
66

7-
- [2.8.3 (2025-07-29)](#283-2025-07-29)
7+
- [2.8.3 (2025-07-30)](#283-2025-07-30)
88
- [2.8.2 (2025-07-09)](#282-2025-07-09)
99
- [2.8.1 (2025-06-10)](#281-2025-06-10)
1010
- [2.8 (2025-05-20)](#28-2025-05-20)
@@ -58,7 +58,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
5858
- [2.4.22 (2021-03-01)](#2422-2021-03-01)
5959
- [2.4.21 (2021-01-14)](#2421-2021-01-14)
6060

61-
## 2.8.3 (2025-07-29)
61+
## 2.8.3 (2025-07-30)
6262
### Modificato (Changed)
6363
- Migliorie grafiche minori
6464
- Miglioria form selezione riferimenti
@@ -1973,85 +1973,4 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
19731973
- Fix visualizzazione referenti nel plugin **Sedi**
19741974
- Fix stampa *Registro IVA*
19751975
- Fix inclusione CSS personalizzato da **Impostazioni**
1976-
- Fix esportazione footer delle tabelle principali
1977-
1978-
## 2.4.23 (2021-05-18)
1979-
1980-
### Aggiunto (Added)
1981-
- Nuovo *Sconto finale* per gli **Ordini**, **Preventivi**, **DDT** e **Contratti**, influenza il valore *Netto a pagare* del documento.
1982-
- Nuovo filtro in attività per mostrare al tecnico solo le attività assegnate.
1983-
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
1984-
- Nuovo pulsante **Duplica Template** per copiare un template già esistente.
1985-
- Aggiunto controllo nelle fatture di vendita per segnalare l'eventuale fatturazione di un'attività con la data di una sessione futura rispetto alla data della fattura.
1986-
- Aggiunta possibilità di creare un ordine fornitore da un preventivo.
1987-
- Aggiunto eventuale numero di telefono e/o cellulare nella stampa dei ddt con sede di destinazione diversa.
1988-
- Aggiunta azione di gruppo in articoli per modificare il prezzo di vendita applicando una percentuale di sconto/rincaro al prezzo già esistente.
1989-
- Aggiunta colonna unità di misura **UM** in movimenti di magazzino.
1990-
- Aggiunta colonna **Tecnici assegnati** nel widget promemoria attività.
1991-
- Aggiunto flag nella tabella **Spedizioni** per rendere obbligatoria la selezione del vettore nei ddt.
1992-
- Aggiunta importazione del campo referente tra i documenti.
1993-
- Aggiunta stampa dettaglio anagrafica e dati aziendali nel modulo **Anagrafiche**.
1994-
- Aggiunta ora evasione negli ordini e in stampa.
1995-
- Aggiunta possibilità di duplicare una sessione di lavoro.
1996-
- Aggiunta colonna Prev. evasione nel modulo **Ordini**.
1997-
- Aggiunta descrizione modificabile al momento della creazione di una revisione in un **Preventivo**.
1998-
1999-
### Fixed
2000-
- Aggiornamento prezzo di listino quando viene cambiato il prezzo di acquisto (se collegato ad un fornitore).
2001-
- Fix plugin **Pianificazione fatturazione** in **Interventi**
2002-
- Rimossa l'obbligatorietà di inserire la data del documento nel modulo **Gestione documentale**
2003-
2004-
## 2.4.22 (2021-03-01)
2005-
2006-
### Aggiunto (Added)
2007-
- Introduzione di nuove **Aliquote IVA** con specifiche più dettagliate
2008-
- Nuovo campo condizioni generali di fornitura in **Preventivi**
2009-
- Introduzione stampe del *Bilancio* e della *Fattura elettronica* per **Fatture di vendita e di acquisto**
2010-
- Nuove azioni di massa sui record per
2011-
- Creare **Preventivi** da **Articoli**
2012-
- Cambiare lo stato a più **Ordini** e **DDT**
2013-
- Allineare la quantità degli **Articoli**
2014-
- Esportare le stampe delle Fatture Elettroniche
2015-
- Aggiunta possibilità di importare **DDT di acquisto** in **DDT di vendita**
2016-
- Aggiunta la possibilità di creare una **Nota di credito** da un **DDT di acquisto**
2017-
- Nuova funzionalità di notifica automatica al *Cliente/Tecnico* quando viene cambiato lo stato dell'**Attività**
2018-
- Nuovo flag per escludere la generazione della **Scadenza** di una Ritenuta d'Acconto se viene versata dal *Fornitore*
2019-
- Introduzione del sistema di controllo sull'integrità delle logiche interne del gestionale
2020-
- Nuovo sistema di registrazione delle procedure di importazione
2021-
- Nuovo hook *Notifiche su Ricevute FE* per indicare graficamente eventuali **Fatture di vendita** che necessitano controlli manuali sullo stato
2022-
- Nuovo *Sconto finale* per le **Fatture di vendita**: influenza il valore *Netto a pagare* della fattura in relazione alle singole scadenze, senza modificare il comportamento per i movimenti contabili
2023-
2024-
### Modificato (Changed)
2025-
- Modifica della gestione degli importi per le Note di credito e debito: i campi di riepilogo (*qta*, *qta_evasa*, *subtotale*, *iva*, *ritenutaacconto*, *rivalsainps*) sono ora positivi.
2026-
- Impostazione CAP automatico a 99999 nella FE per clienti esteri
2027-
- Aggiornamento di CKEditor al fine di permettere l'utilizzo dell'intero insieme di plugin per funzionalità di editing più avanzate
2028-
- Correzione del tipo di Fattura predefinito in caso di importazione da DDT (*Fattura differita*)
2029-
- Correzioni varie sul sistema di sincronizzazione via API per l'applicazione mobile
2030-
2031-
### Fixed
2032-
- Correzione movimenti di magazzino con sedi diverse
2033-
- Correzione JS su input di tipo select con stesso ID
2034-
- Correzione dimensione del campo *Tempo standard* in **Tipi di attività**
2035-
- Correzione dei redirect al modulo **Impostazioni**
2036-
- Fix del calcolo sullo spazio disponibili in GB
2037-
- Fix procedura di pagamento automatico delle **Scadenze** sulla base dei movimenti in **Prima Nota**
2038-
2039-
## 2.4.21 (2021-01-14)
2040-
2041-
### Aggiunto (Added)
2042-
- Aggiunto fallback selezione IVA per natura mancante in fase di import fattura di acquisto
2043-
- Aggiunto filtro periodo anche per stampe mastrini di livello 1 e 2
2044-
- Aggiunta gestione peso e volume automatici per DDT e Fatture
2045-
2046-
### Fixed
2047-
- Fix falsi positivi su warning verifica numero fatture di vendita (#919)
2048-
- Fix fornitore predefinito articoli (#928)
2049-
- Correzioni in importazione FE
2050-
- Fix per invio email (#923)
2051-
- Correzione sconto unitario (#925)
2052-
- Fix validazione codice fiscale
2053-
- Fix dichiarazione intento su data fattura
2054-
- Fix inclusione nel filtro periodo degli estremi temporali
2055-
- Fix sul calcolo in base alla validità della data conclusione del contratto
2056-
- Correzzione aggiunta **Codice destinatario** in fase di creazione **Anagrafica**
2057-
- Correzzione selezione aliq. IVA in fase di import **Fatture di acquisto**
1976+
- Fix esportazione footer delle tabelle principali

actions.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,16 @@
421421

422422
// Allegati originali
423423
$files = post('uploads');
424+
425+
// Assicuriamoci che $files sia un array
426+
if (!is_array($files)) {
427+
$files = $files ? [$files] : [];
428+
}
429+
424430
foreach ($files as $file) {
425-
$mail->addUpload($file);
431+
if (!empty($file)) {
432+
$mail->addUpload($file);
433+
}
426434
}
427435

428436
// Salvataggio email nella coda di invio

api/index.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ function serverError()
4141
header('Access-Control-Allow-Origin: *');
4242
header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS');
4343

44+
$dbo->insert('zz_api_log', [
45+
'level' => 'warning',
46+
'message' => 'Richiesta API ricevuta',
47+
'name' => "API ".get('resource'),
48+
'context' => json_encode([
49+
'token' => get('token'),
50+
'resource' => get('resource'),
51+
]),
52+
]);
53+
$id_log = $dbo->lastInsertedID();
54+
4455
try {
4556
$response = Response::manage();
4657
} catch (Exception $e) {
@@ -56,6 +67,18 @@ function serverError()
5667
$response = Response::error('ok');
5768
}
5869

70+
$result = json_decode((string) $response, true);
71+
$level = ($result['status']=='200' ? 'info' : 'error');
72+
$dbo->update('zz_api_log', [
73+
'level' => $level,
74+
'message' => $result['message'],
75+
'context' => json_encode([
76+
'token' => get('token'),
77+
'resource' => get('resource'),
78+
'total-count' => $result['total-count'],
79+
]),
80+
],['id' => $id_log]);
81+
5982
json_decode((string) $response);
6083

6184
// Impostazioni di Content-Type e Charset Header

include/common/importa.php

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -560,24 +560,24 @@
560560
function controllaMagazzino() {
561561
if(!abilita_scorte) return;
562562
563-
let righe = $("#righe_documento_importato tr");
563+
let righe = $("#righe_documento_importato tr", "#modals");
564564
565565
// Lettura delle righe selezionate per l\'improtazione
566566
let richieste = {};
567567
for(const r of righe) {
568568
let riga = $(r);
569569
let id = $(riga).data("local_id");
570-
let id_articolo = riga.find("[id^=id_articolo_]").text();
570+
let id_articolo = riga.find("#modals [id^=id_articolo_]").text();
571571
572-
if (!$("#checked_" + id).is(":checked") || !id_articolo) {
572+
if (!$("#checked_" + id, "#modals").is(":checked") || !id_articolo) {
573573
continue;
574574
}
575575
576-
let qta = parseFloat(riga.find("input[id^=qta_]").val());
576+
let qta = parseFloat(riga.find("#modals input[id^=qta_]").val());
577577
richieste[id_articolo] = richieste[id_articolo] ? richieste[id_articolo] + qta : qta;
578578
}
579579
580-
let sottoscorta = $("#articoli_sottoscorta");
580+
let sottoscorta = $("#modals #articoli_sottoscorta");
581581
let body = sottoscorta.find("tbody");
582582
body.html("");
583583
@@ -601,15 +601,15 @@ function controllaMagazzino() {
601601
}
602602
}
603603
604-
$("input[name=righe]").each(function() {
604+
$("#modals input[name=righe]").each(function() {
605605
ricalcolaTotaleRiga($(this).val(), first = true);
606606
});
607607
608608
function ricalcolaTotaleRiga(r, first) {
609-
let prezzo_unitario = $("#prezzo_unitario_" + r).val();
610-
let sconto = $("#sconto_unitario_" + r).val();
609+
let prezzo_unitario = $("#modals #prezzo_unitario_" + r).val();
610+
let sconto = $("#modals #sconto_unitario_" + r).val();
611611
612-
let max_qta_input = $("#max_qta_" + r);
612+
let max_qta_input = $("#modals #max_qta_" + r);
613613
let qta_max = max_qta_input.val();
614614
615615
prezzo_unitario = parseFloat(prezzo_unitario);
@@ -618,30 +618,30 @@ function ricalcolaTotaleRiga(r, first) {
618618
619619
let prezzo_scontato = prezzo_unitario - sconto;
620620
621-
let qta = ($("#qta_" + r).val()).toEnglish();
621+
let qta = ($("#modals #qta_" + r).val()).toEnglish();
622622
623623
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
624624
if (qta > qta_max) {
625625
qta = qta_max;
626626
627-
$("#qta_" + r).val(qta);
627+
$("#modals #qta_" + r).val(qta);
628628
}
629629
630630
// Se tolgo la spunta della casella dell\'evasione devo azzerare i conteggi
631-
if (isNaN(qta) || !$("#checked_" + r).is(":checked")) {
631+
if (isNaN(qta) || !$("#modals #checked_" + r).is(":checked")) {
632632
qta = 0;
633633
}
634634
635635
if (!first) {
636-
let serial_select = $("#serial_" + r);
636+
let serial_select = $("#modals #serial_" + r);
637637
serial_select.selectClear();
638638
serial_select.data("maximum", qta);
639-
initSelectInput("#serial_" + r);
639+
initSelectInput("#modals #serial_" + r);
640640
}
641641
642642
let subtotale = (prezzo_scontato * qta).toLocale();
643643
644-
$("#subtotale_" + r).html(subtotale + " " + globals.currency);
644+
$("#modals #subtotale_" + r).html(subtotale + " " + globals.currency);
645645
646646
647647
ricalcolaTotale();
@@ -651,16 +651,16 @@ function ricalcolaTotale() {
651651
let totale = 0.00;
652652
let totale_qta = 0;
653653
654-
$("input[id*=qta_]").each(function() {
654+
$("#modals input[id*=qta_]").each(function() {
655655
let qta = $(this).val().toEnglish();
656656
let r = $(this).attr("id").replace("qta_", "");
657657
658-
if (!$("#checked_" + r).is(":checked") || isNaN(qta)) {
658+
if (!$("#modals #checked_" + r).is(":checked") || isNaN(qta)) {
659659
qta = 0;
660660
}
661661
662-
let prezzo_unitario = $("#prezzo_unitario_" + r).val();
663-
let sconto = $("#sconto_unitario_" + r).val();
662+
let prezzo_unitario = $("#modals #prezzo_unitario_" + r).val();
663+
let sconto = $("#modals #sconto_unitario_" + r).val();
664664
665665
prezzo_unitario = parseFloat(prezzo_unitario);
666666
sconto = parseFloat(sconto);
@@ -674,31 +674,31 @@ function ricalcolaTotale() {
674674
totale_qta += qta;
675675
});
676676
677-
$("#totale").html((totale.toLocale()) + " " + globals.currency);
677+
$("#modals #totale").html((totale.toLocale()) + " " + globals.currency);
678678
679679
controllaMagazzino();
680680
}
681681
682682
$(document).ready(function(){
683683
if(input("id_ritenuta_acconto").get()) {
684-
$("#calcolo_ritenuta_acconto").prop("required", true);
684+
$("#modals #calcolo_ritenuta_acconto").prop("required", true);
685685
} else{
686-
$("#calcolo_ritenuta_acconto").prop("required", false);
686+
$("#modals #calcolo_ritenuta_acconto").prop("required", false);
687687
input("calcolo_ritenuta_acconto").set("");
688688
}
689689
690-
$("#id_ritenuta_acconto").on("change", function(){
690+
$("#modals #id_ritenuta_acconto").on("change", function(){
691691
if(input("id_ritenuta_acconto").get()) {
692-
$("#calcolo_ritenuta_acconto").prop("required", true);
692+
$("#modals #calcolo_ritenuta_acconto").prop("required", true);
693693
} else{
694-
$("#calcolo_ritenuta_acconto").prop("required", false);
694+
$("#modals #calcolo_ritenuta_acconto").prop("required", false);
695695
input("calcolo_ritenuta_acconto").set("");
696696
}
697697
});
698698
ricalcolaTotale();
699699
});
700700
701-
$("#import_all").click(function(){
701+
$("#modals #import_all").click(function(){
702702
if( $(this).is(":checked") ){
703703
$(".check").each(function(){
704704
if( !$(this).is(":checked") ){

mail.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,18 +157,24 @@
157157
</div>';
158158

159159
$uploads = [];
160+
160161
if ($smtp['pec'] == 1 && $module->name == 'Fatture di vendita') {
161-
$uploads = $dbo->fetchArray('SELECT id FROM zz_files WHERE id_module = '.prepare($module['id']).' AND id_record = '.prepare($id_record).' AND category = \'Fattura Elettronica\'');
162-
$uploads = array_column($uploads, 'id');
162+
$pec_uploads = $dbo->fetchArray('SELECT zz_files.id FROM zz_files LEFT JOIN zz_files_categories ON zz_files.id_category = zz_files_categories.id WHERE zz_files.id_module = '.prepare($module['id']).' AND zz_files.id_record = '.prepare($id_record).' AND (zz_files_categories.name = \'Fattura Elettronica\' OR zz_files_categories.name = \'Fattura elettronica\')');
163+
$uploads = array_merge($uploads, array_column($pec_uploads, 'id'));
163164
}
164165

165-
// Ottieni gli allegati dalle categorie associate al template
166166
$template_uploads = $template->uploads($id_record);
167167
if (!empty($template_uploads)) {
168168
$uploads = array_merge($uploads, $template_uploads->pluck('id')->toArray());
169-
$uploads = array_unique($uploads);
170169
}
171170

171+
if (empty($template->categories) && empty($uploads)) {
172+
$all_document_uploads = $dbo->fetchArray('SELECT `id` FROM `zz_files` WHERE `id_module` = '.prepare($id_module).' AND `id_record` = '.prepare($id_record));
173+
$uploads = array_merge($uploads, array_column($all_document_uploads, 'id'));
174+
}
175+
176+
$uploads = array_unique($uploads);
177+
172178
// Allegati
173179
echo '
174180

modules/emails/src/Mail.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public function addUpload($file_id, $name = null)
7272
{
7373
$file = Upload::find($file_id);
7474

75+
if (!$file) {
76+
return false;
77+
}
78+
7579
// duplica il file
7680
$upload = $file->copia([
7781
'id_module' => \Models\Module::where('name', 'Stato email')->first()->id,
@@ -81,6 +85,8 @@ public function addUpload($file_id, $name = null)
8185
$name = $name ?: $file->name;
8286

8387
$this->attachments()->attach($upload->id, ['id_email' => $this->id, 'name' => $name, 'type' => 'file']);
88+
89+
return true;
8490
}
8591

8692
public function resetUploads()
@@ -102,12 +108,12 @@ public function addPrint($print_id, $name = null)
102108
{
103109
// Genera la stampa come PDF
104110
$print = \Prints::render($print_id, $this->id_record, null, true);
105-
111+
106112
// Ottieni il modulo "Coda d'invio"
107113
$id_module = \Models\Module::where("name", "Stato email")->first()->id;
108114

109115
$name = $name ?: $print['name'];
110-
116+
111117
// Salva il file nella tabella zz_files
112118
$upload = \Uploads::upload($print['pdf'], [
113119
'name' => $name,
@@ -116,7 +122,7 @@ public function addPrint($print_id, $name = null)
116122
'id_module' => $id_module,
117123
'id_record' => $this->id,
118124
]);
119-
125+
120126
// Collega il file alla tabella em_email_attachment
121127
$this->attachments()->attach($upload->id, ['id_email' => $this->id, 'name' => $name, 'type' => 'print']);
122128
}

modules/mansioni/ajax/select.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
$search_fields[] = 'nome LIKE '.prepare('%'.$search.'%');
3333
}
3434

35-
$custom['link'] = 'module:Mansioni';
35+
$custom['link'] = 'module:Mansioni referenti';
3636

3737
break;
3838
}

0 commit comments

Comments
 (0)