Skip to content

Commit acc7d24

Browse files
committed
fix: impostazione ricorrenze in creazione nuova attività
1 parent be9dbc2 commit acc7d24

3 files changed

Lines changed: 168 additions & 36 deletions

File tree

assets/src/css/style.css

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3661,4 +3661,41 @@ section.content, .main-footer {
36613661
padding: 8px 12px;
36623662
vertical-align: top;
36633663
line-height: 1.2;
3664+
}
3665+
3666+
/* ===== RICORRENZA INTERVENTI ===== */
3667+
3668+
/* Configurazione ricorrenza */
3669+
.ricorrenza-config {
3670+
transition: all 0.3s ease;
3671+
background: #f8f9fc;
3672+
border-radius: 6px;
3673+
padding: 1rem;
3674+
border: 1px solid #e3e6f0;
3675+
}
3676+
3677+
/* Responsive per 4 colonne */
3678+
.ricorrenza-config .col-md-3 {
3679+
padding-left: 0.5rem;
3680+
padding-right: 0.5rem;
3681+
}
3682+
3683+
@media (max-width: 1200px) {
3684+
.ricorrenza-config .col-md-3 {
3685+
flex: 0 0 50%;
3686+
max-width: 50%;
3687+
margin-bottom: 1rem;
3688+
}
3689+
}
3690+
3691+
@media (max-width: 768px) {
3692+
.ricorrenza-config .col-md-3 {
3693+
flex: 0 0 100%;
3694+
max-width: 100%;
3695+
margin-bottom: 1rem;
3696+
}
3697+
3698+
.ricorrenza-config {
3699+
padding: 0.75rem;
3700+
}
36643701
}

modules/interventi/actions.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,29 @@
359359
if (!empty(post('ricorsiva_add'))) {
360360
// Validazione dei campi obbligatori per la ricorrenza
361361
$periodicita = post('periodicita');
362-
$data_inizio = post('data_inizio_ricorrenza');
363362
$metodo_ricorrenza = post('metodo_ricorrenza');
364363
$idstatoricorrenze = post('idstatoricorrenze');
365364

365+
// Calcolo automatico della data di inizio ricorrenza
366+
$data_inizio = post('data_inizio_ricorrenza'); // Campo nascosto calcolato dal JavaScript
367+
368+
// Se il campo nascosto è vuoto, calcola la data dal backend
369+
if (empty($data_inizio)) {
370+
// Prima priorità: orario inizio della prima sessione
371+
$orario_inizio_sessione = post('orario_inizio');
372+
373+
if (!empty($orario_inizio_sessione) && strlen($orario_inizio_sessione) >= 16) {
374+
// Se abbiamo l'orario completo della sessione, usalo
375+
$data_inizio = $orario_inizio_sessione;
376+
} else {
377+
// Seconda priorità: data richiesta con orario di default
378+
$data_richiesta = post('data_richiesta') ?: date('Y-m-d');
379+
$data_inizio = $data_richiesta . ' 09:00:00';
380+
}
381+
}
382+
366383
// Controllo campi obbligatori
367-
if (empty($periodicita) || empty($data_inizio) || empty($metodo_ricorrenza) || empty($idstatoricorrenze)) {
384+
if (empty($periodicita) || empty($metodo_ricorrenza) || empty($idstatoricorrenze)) {
368385
flash()->error(tr('Tutti i campi della ricorrenza sono obbligatori quando si crea un\'attività ricorrente.'));
369386
break;
370387
}
@@ -519,8 +536,6 @@
519536
'id_tecnico' => $tecnici_assegnati,
520537
]);
521538
}
522-
523-
++$ricorrenze_create;
524539
}
525540

526541
// Messaggio di successo per le ricorrenze create

modules/interventi/add.php

Lines changed: 112 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -359,37 +359,33 @@
359359
<div class="col-md-4">
360360
{[ "type": "checkbox", "label": "'.tr('Attività ricorrente').'", "name": "ricorsiva_add", "value": "" ]}
361361
</div>
362-
363-
<div class="col-md-4 ricorrenza">
364-
{[ "type": "timestamp", "label": "'.tr('Data/ora inizio').'", "name": "data_inizio_ricorrenza", "value": "'.($data_richiesta ?: '-now-').'" ]}
365-
</div>
366-
367-
<div class="col-md-4 ricorrenza">
368-
{[ "type": "number", "label": "'.tr('Periodicità').'", "name": "periodicita", "decimals": "0", "icon-after": "choice|period|months", "value": "1" ]}
369-
</div>
370362
</div>
371363
372-
<div class="row ricorrenza mt-3">
373-
<div class="col-md-4">
374-
{[ "type": "select", "label": "'.tr('Metodo fine ricorrenza').'", "name": "metodo_ricorrenza", "values": "list=\"data\":\"Data fine\",\"numero\":\"Numero ricorrenze\"" ]}
375-
</div>
376-
377-
<div class="col-md-4">
378-
{[ "type": "timestamp", "label": "'.tr('Data/ora fine').'", "name": "data_fine_ricorrenza" ]}
379-
</div>
380-
381-
<div class="col-md-4">
382-
{[ "type": "number", "label": "'.tr('Numero ricorrenze').'", "name": "numero_ricorrenze", "decimals": "0" ]}
383-
</div>
384-
</div>
364+
<div class="ricorrenza-config" style="display: none;">
365+
<input type="hidden" name="data_inizio_ricorrenza" id="data_inizio_ricorrenza_hidden" value="">
385366
386-
<div class="row ricorrenza mt-3">
387-
<div class="col-md-4">
388-
{[ "type": "select", "label": "'.tr('Stato ricorrenze').'", "name": "idstatoricorrenze", "values": "query=SELECT `in_statiintervento`.`id`,`in_statiintervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_statiintervento` LEFT JOIN `in_statiintervento_lang` ON (`in_statiintervento`.`id` = `in_statiintervento_lang`.`id_record` AND `in_statiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL AND `is_bloccato`=0 ORDER BY `title`" ]}
367+
<div class="row">
368+
<div class="col-md-3">
369+
{[ "type": "number", "label": "'.tr('Periodicità').'", "name": "periodicita", "decimals": "0", "icon-after": "choice|period|months", "value": "1" ]}
370+
</div>
371+
<div class="col-md-3">
372+
{[ "type": "select", "label": "'.tr('Metodo fine ricorrenza').'", "name": "metodo_ricorrenza", "values": "list=\"data\":\"Data fine\",\"numero\":\"Numero ricorrenze\"" ]}
373+
</div>
374+
<div class="col-md-3 metodo-data">
375+
{[ "type": "timestamp", "label": "'.tr('Data/ora fine').'", "name": "data_fine_ricorrenza" ]}
376+
</div>
377+
<div class="col-md-3 metodo-numero">
378+
{[ "type": "number", "label": "'.tr('Numero ricorrenze').'", "name": "numero_ricorrenze", "decimals": "0" ]}
379+
</div>
389380
</div>
390381
391-
<div class="col-md-4">
392-
{[ "type": "checkbox", "label": "'.tr('Riporta sessioni di lavoro').'", "name": "riporta_sessioni_add", "value": "" ]}
382+
<div class="row mt-3">
383+
<div class="col-md-6">
384+
{[ "type": "select", "label": "'.tr('Stato ricorrenze').'", "name": "idstatoricorrenze", "values": "query=SELECT `in_statiintervento`.`id`,`in_statiintervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_statiintervento` LEFT JOIN `in_statiintervento_lang` ON (`in_statiintervento`.`id` = `in_statiintervento_lang`.`id_record` AND `in_statiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL AND `is_bloccato`=0 ORDER BY `title`" ]}
385+
</div>
386+
<div class="col-md-6">
387+
{[ "type": "checkbox", "label": "'.tr('Riporta sessioni di lavoro').'", "name": "riporta_sessioni_add", "value": "" ]}
388+
</div>
393389
</div>
394390
</div>
395391
</div>
@@ -718,6 +714,43 @@ function() {
718714
var ref = "'.get('ref').'";
719715
720716
async function salva(button) {
717+
// Validazione ricorrenza prima del salvataggio
718+
if ($("#ricorsiva_add").is(":checked")) {
719+
calculateDataInizioRicorrenza();
720+
var dataInizio = $("#data_inizio_ricorrenza_hidden").val();
721+
if (!dataInizio) {
722+
swal("Errore", "Impossibile calcolare la data di inizio ricorrenza", "error");
723+
return false;
724+
}
725+
726+
var periodicita = $("#periodicita").val();
727+
if (!periodicita || periodicita <= 0) {
728+
swal("Errore", "La periodicità deve essere un numero positivo", "error");
729+
return false;
730+
}
731+
732+
var metodo = $("#metodo_ricorrenza").val();
733+
if (!metodo) {
734+
swal("Errore", "Seleziona un metodo per terminare la ricorrenza", "error");
735+
return false;
736+
}
737+
738+
if (metodo === "data" && !$("#data_fine_ricorrenza").val()) {
739+
swal("Errore", "La data di fine ricorrenza è obbligatoria", "error");
740+
return false;
741+
}
742+
743+
if (metodo === "numero" && (!$("#numero_ricorrenze").val() || $("#numero_ricorrenze").val() <= 0)) {
744+
swal("Errore", "Il numero di ricorrenze deve essere maggiore di zero", "error");
745+
return false;
746+
}
747+
748+
if (!$("#idstatoricorrenze").val()) {
749+
swal("Errore", "Seleziona uno stato per le ricorrenze", "error");
750+
return false;
751+
}
752+
}
753+
721754
// Submit attraverso ricaricamento della pagina
722755
if (!ref) {
723756
$("#add-form").submit();
@@ -777,34 +810,81 @@ function deassegnaTuttiTecnici() {
777810
input("tecnici_assegnati").getElement().selectReset();
778811
}
779812
813+
// Gestione ricorrenza
780814
$("#ricorsiva_add").on("change", function(){
781815
if ($(this).is(":checked")) {
782-
$(".ricorrenza").removeClass("hidden");
783-
$("#data_inizio_ricorrenza").attr("required", true);
816+
$(".ricorrenza-config").slideDown(300);
784817
$("#metodo_ricorrenza").attr("required", true);
785818
$("#idstatoricorrenze").attr("required", true);
819+
$("#periodicita").attr("required", true);
820+
calculateDataInizioRicorrenza();
786821
} else {
787-
$(".ricorrenza").addClass("hidden");
788-
$("#data_inizio_ricorrenza").attr("required", false);
822+
$(".ricorrenza-config").slideUp(300);
789823
$("#metodo_ricorrenza").attr("required", false);
790824
$("#idstatoricorrenze").attr("required", false);
825+
$("#periodicita").attr("required", false);
826+
$("#data_fine_ricorrenza").attr("required", false);
827+
$("#numero_ricorrenze").attr("required", false);
791828
}
792829
});
793830
794831
$("#metodo_ricorrenza").on("change", function(){
795-
if ($(this).val()=="data") {
832+
if ($(this).val() === "data") {
833+
$(".metodo-data").fadeIn(200);
834+
$(".metodo-numero").fadeOut(200);
796835
input("data_fine_ricorrenza").enable();
797836
$("#data_fine_ricorrenza").attr("required", true);
798837
input("numero_ricorrenze").disable();
799838
input("numero_ricorrenze").set("");
800-
} else {
839+
$("#numero_ricorrenze").attr("required", false);
840+
} else if ($(this).val() === "numero") {
841+
$(".metodo-numero").fadeIn(200);
842+
$(".metodo-data").fadeOut(200);
801843
input("numero_ricorrenze").enable();
844+
$("#numero_ricorrenze").attr("required", true);
802845
input("data_fine_ricorrenza").disable();
803846
input("data_fine_ricorrenza").set("");
804847
$("#data_fine_ricorrenza").attr("required", false);
848+
} else {
849+
$(".metodo-data, .metodo-numero").fadeOut(200);
850+
input("data_fine_ricorrenza").disable();
851+
input("numero_ricorrenze").disable();
852+
$("#data_fine_ricorrenza").attr("required", false);
853+
$("#numero_ricorrenze").attr("required", false);
854+
}
855+
});
856+
857+
function calculateDataInizioRicorrenza() {
858+
var dataInizio = "";
859+
var orarioInizio = $("#orario_inizio").val();
860+
861+
if (orarioInizio && orarioInizio.length >= 16) {
862+
dataInizio = orarioInizio;
863+
} else {
864+
var dataRichiesta = $("#data_richiesta").val();
865+
if (dataRichiesta) {
866+
dataInizio = dataRichiesta + " 09:00:00";
867+
} else {
868+
var now = new Date();
869+
var year = now.getFullYear();
870+
var month = String(now.getMonth() + 1).padStart(2, "0");
871+
var day = String(now.getDate()).padStart(2, "0");
872+
dataInizio = year + "-" + month + "-" + day + " 09:00:00";
873+
}
805874
}
875+
$("#data_inizio_ricorrenza_hidden").val(dataInizio);
876+
}
877+
878+
$("#orario_inizio, #data_richiesta").on("change", function() {
879+
setTimeout(calculateDataInizioRicorrenza, 100);
806880
});
807881
882+
// Inizializzazione
883+
if (!$("#metodo_ricorrenza").val()) {
884+
$(".metodo-data, .metodo-numero").hide();
885+
}
886+
calculateDataInizioRicorrenza();
887+
808888
var map = null;
809889
function caricaMappa(lat, lng) {
810890
if (!autoload_mappa){

0 commit comments

Comments
 (0)