From ade54ab39f41c9b2475c0eb618e9183c7e2bef18 Mon Sep 17 00:00:00 2001 From: maulapi Date: Sat, 26 Sep 2026 15:44:36 +0200 Subject: [PATCH] feat: ordina gli stati degli interventi --- modules/interventi/add.php | 50 ++++++++++++---------------- modules/interventi/bulk.php | 4 +-- modules/stati_intervento/actions.php | 3 +- modules/stati_intervento/add.php | 12 ++++--- modules/stati_intervento/edit.php | 19 +++++++---- update/2_12.sql | 7 +++- 6 files changed, 52 insertions(+), 43 deletions(-) diff --git a/modules/interventi/add.php b/modules/interventi/add.php index 7cdcdc0fd..9bdae0715 100755 --- a/modules/interventi/add.php +++ b/modules/interventi/add.php @@ -62,19 +62,18 @@ $id_anagrafica = Modules\Interventi\Intervento::where('id', $id_intervento)->first()->id_anagrafica; } -$anagrafica = database()->table('an_anagrafiche')->where('id', $id_anagrafica)->first(['id_tipo_intervento_default', 'id_zona']); -$id_tipo = $anagrafica->id_tipo_intervento_default; -$id_zona = $anagrafica->id_zona; +$anagrafica = $dbo->fetchOne('SELECT id_tipo_intervento_default, id_zona FROM an_anagrafiche WHERE id='.prepare($id_anagrafica)); +$id_tipo = $anagrafica['id_tipo_intervento_default']; +$id_zona = $anagrafica['id_zona']; // Trasformazione di un Promemoria dei Contratti in Intervento if (!empty($id_contratto) && !empty($id_promemoria_contratto)) { - // Recupero id_zona dell'anagrafica in un'unica query - $contratto = $dbo->fetchOne('SELECT co_contratti.*, an_anagrafiche.id_zona FROM co_contratti INNER JOIN an_anagrafiche ON an_anagrafiche.id = co_contratti.id_anagrafica WHERE co_contratti.id = '.prepare($id_contratto)); + $contratto = $dbo->fetchOne('SELECT *, (SELECT id_zona FROM an_anagrafiche WHERE id = co_contratti.id_anagrafica) AS id_zona FROM co_contratti WHERE id = '.prepare($id_contratto)); $id_anagrafica = $contratto['id_anagrafica']; $id_zona = $contratto['id_zona']; - // Informazioni del Promemoria con tempo_standard - $promemoria = $dbo->fetchOne('SELECT co_promemoria.*, in_tipi_intervento.tempo_standard FROM co_promemoria INNER JOIN in_tipi_intervento ON in_tipi_intervento.id = co_promemoria.id_tipo_intervento WHERE co_promemoria.id_contratto='.prepare($id_contratto).' AND co_promemoria.id = '.prepare($id_promemoria_contratto)); + // Informazioni del Promemoria + $promemoria = $dbo->fetchOne('SELECT *, (SELECT `tempo_standard` FROM `in_tipi_intervento` WHERE `id` = `co_promemoria`.`id_tipo_intervento`) AS tempo_standard FROM `co_promemoria` WHERE `id_contratto`='.prepare($id_contratto).' AND `co_promemoria`.`id` = '.prepare($id_promemoria_contratto)); $id_tipo = $promemoria['id_tipo_intervento']; $data = filter('data') ?? $promemoria['data_richiesta']; $richiesta = $promemoria['richiesta']; @@ -91,14 +90,14 @@ // Caricamento degli impianti a Contratto se non definiti in Promemoria if (empty($impianti_collegati)) { - $rs = database()->table('my_impianti_contratti')->where('id_contratto', $id_contratto)->pluck('id_impianto')->toArray(); - $impianti_collegati = implode(',', $rs); + $rs = $dbo->fetchArray('SELECT id_impianto FROM my_impianti_contratti WHERE id_contratto = '.prepare($id_contratto)); + $impianti_collegati = implode(',', array_column($rs, 'id_impianto')); } } // Gestione dell'aggiunta di una sessione a un Intervento senza sessioni (Promemoria intervento) da Dashboard elseif (!empty($id_intervento)) { - $intervento = $dbo->fetchOne('SELECT `in_interventi`.*, `co_promemoria`.`id_contratto`, `in_tipi_intervento`.`tempo_standard` FROM `in_interventi` LEFT JOIN `co_promemoria` ON `co_promemoria`.`id_intervento` = `in_interventi`.`id` LEFT JOIN `in_tipi_intervento` ON `in_tipi_intervento`.`id` = `in_interventi`.`id_tipo_intervento` WHERE `in_interventi`.`id` = '.prepare($id_intervento)); + $intervento = $dbo->fetchOne('SELECT *, (SELECT `id_contratto` FROM `co_promemoria` WHERE `id_intervento` = `in_interventi`.`id` LIMIT 0,1) AS id_contratto, `in_interventi`.`id_preventivo` as id_preventivo, (SELECT `tempo_standard` FROM `in_tipi_intervento` WHERE `id` = `in_interventi`.`id_tipo_intervento`) AS tempo_standard FROM `in_interventi` WHERE `id` = '.prepare($id_intervento)); $id_tipo = $intervento['id_tipo_intervento']; $data = filter('data') ?? $intervento['data_richiesta']; @@ -118,17 +117,17 @@ $orario_fine = date('H:i:s', strtotime($orario_inizio) + ((60 * 60) * $intervento['tempo_standard'])); } - $rs = database()->table('my_impianti_interventi')->where('id_intervento', $id_intervento)->pluck('id_impianto')->toArray(); - $impianti_collegati = implode(',', $rs); + $rs = $dbo->fetchArray('SELECT id_impianto FROM my_impianti_interventi WHERE id_intervento = '.prepare($id_intervento)); + $impianti_collegati = implode(',', array_column($rs, 'id_impianto')); - $rs = database()->table('in_interventi_tecnici_assegnati')->where('id_intervento', $id_intervento)->pluck('id_tecnico')->toArray(); - $tecnici_assegnati = implode(',', $rs); + $rs = $dbo->fetchArray('SELECT id_tecnico FROM in_interventi_tecnici_assegnati WHERE id_intervento = '.prepare($id_intervento)); + $tecnici_assegnati = implode(',', array_column($rs, 'id_tecnico')); } // Selezione dei tecnici predefiniti per gli impianti selezionati if (!empty($impianti_collegati)) { - $tecnici_impianti = database()->table('my_impianti')->whereIn('id', explode(',', $impianti_collegati))->pluck('id_tecnico')->toArray(); - $id_tecnico = array_unique($tecnici_impianti); + $tecnici_impianti = $dbo->fetchArray('SELECT id_tecnico FROM my_impianti WHERE id IN ('.prepare($impianti_collegati).')'); + $id_tecnico = array_unique(array_column($tecnici_impianti, 'id_tecnico')); } // Impostazione della data se mancante @@ -219,7 +218,7 @@
- {[ "type": "select", "label": "'.tr('Stato').'", "name": "id", "required": 1, "values": "query=SELECT `in_stati_intervento`.`id`, `in_stati_intervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL ORDER BY `title`", "value": "'.($origine_dashboard ? setting('Stato predefinito dell\'attività da Dashboard') : setting('Stato predefinito dell\'attività')).'" ]} + {[ "type": "select", "label": "'.tr('Stato').'", "name": "id", "required": 1, "values": "query=SELECT `in_stati_intervento`.`id`, `in_stati_intervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL ORDER BY `sort_order`, `title`", "value": "'.($origine_dashboard ? setting('Stato predefinito dell\'attività da Dashboard') : setting('Stato predefinito dell\'attività')).'" ]}
@@ -414,7 +413,7 @@
- {[ "type": "select", "label": "'.tr('Stato ricorrenze').'", "name": "id_statoricorrenze", "values": "query=SELECT `in_stati_intervento`.`id`,`in_stati_intervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL AND `is_bloccato`=0 ORDER BY `title`" ]} + {[ "type": "select", "label": "'.tr('Stato ricorrenze').'", "name": "id_statoricorrenze", "values": "query=SELECT `in_stati_intervento`.`id`,`in_stati_intervento_lang`.`title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL AND `is_bloccato`=0 ORDER BY `sort_order`, `title`" ]}
{[ "type": "checkbox", "label": "'.tr('Riporta sessioni di lavoro').'", "name": "riporta_sessioni_add", "value": "" ]} @@ -521,15 +520,10 @@ // Refresh modulo dopo la chiusura di una pianificazione attività derivante dalle attività // da pianificare, altrimenti il promemoria non si vede più nella lista a destra - const id_contratto_riga = $("input[name=id_contratto_riga]").val(); - if(id_contratto_riga) { - $("#modals").on("hidden.bs.modal", function(e) { - // Ricarica le DataTables per aggiornare la lista dei promemoria - $(".main-records, .datatables").each(function() { - if($.fn.DataTable.isDataTable($(this))) { - $(this).DataTable().ajax.reload(); - } - }); + // TODO: da gestire via ajax + if($("input[name=id_contratto_riga]").val()) { + $("#modals > div button.close").on("click", function() { + location.reload(); }); } @@ -572,7 +566,7 @@ function() { let selected = !$(this).val(); let placeholder = selected ? "'.tr('Seleziona prima un cliente').'" : "'.tr("Seleziona un'opzione").'"; - let selected_sede = !$(this).val() || ($(this).prop("disabled") && sede.get()) ? 1 : 0; + let selected_sede = !$(this).val() || $(this).prop("disabled") ? 1 : 0; sede.setDisabled(selected_sede) .getElement().selectReset(placeholder); diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php index e2cd4aca1..2b5b997dd 100755 --- a/modules/interventi/bulk.php +++ b/modules/interventi/bulk.php @@ -97,7 +97,7 @@ $raggruppamento = post('raggruppamento'); $where = ''; - $query = 'SELECT `in_interventi`.*, IFNULL(`sessioni_min`.`min_orario_inizio`, `in_interventi`.`data_richiesta`) AS data, `in_stati_intervento_lang`.`title` AS stato, `in_interventi`.`codice` AS codice_intervento FROM `in_interventi` INNER JOIN `in_stati_intervento` ON `in_interventi`.`id_stato`=`in_stati_intervento`.`id` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento_lang`.`id_record`=`in_stati_intervento`.`id` AND `in_stati_intervento_lang`.`id_lang`='.prepare(Models\Locale::getDefault()->id).') LEFT JOIN (SELECT `id_intervento`, MIN(`orario_inizio`) AS min_orario_inizio FROM `in_interventi_tecnici` GROUP BY `id_intervento`) AS `sessioni_min` ON `sessioni_min`.`id_intervento` = `in_interventi`.`id` WHERE `in_stati_intervento`.`is_fatturabile`=1 AND `in_interventi`.`id` NOT IN (SELECT `id_intervento` FROM `co_righe_documenti` WHERE `id_intervento` IS NOT NULL) AND `in_interventi`.`id` IN ('.implode(',', $id_records).')'; + $query = 'SELECT `in_interventi`.*, IFNULL((SELECT MIN(`orario_inizio`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`id_intervento` = `in_interventi`.`id`), `in_interventi`.`data_richiesta`) AS data, `in_stati_intervento_lang`.`title` AS stato, `in_interventi`.`codice` AS codice_intervento FROM `in_interventi` INNER JOIN `in_stati_intervento` ON `in_interventi`.`id_stato`=`in_stati_intervento`.`id` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento_lang`.`id_record`=`in_stati_intervento`.`id` AND `in_stati_intervento_lang`.`id_lang`='.prepare(Models\Locale::getDefault()->id).') WHERE `in_stati_intervento`.`is_fatturabile`=1 AND `in_interventi`.`id` NOT IN (SELECT `id_intervento` FROM `co_righe_documenti` WHERE `id_intervento` IS NOT NULL) AND `in_interventi`.`id` IN ('.implode(',', $id_records).')'; // Se non è attiva la relativa impostazione considero solo interventi non collegati a contratti, ordini o preventivi (default) if (!setting('Permetti fatturazione delle attività collegate a contratti')) { @@ -450,7 +450,7 @@ 'data' => [ 'title' => tr('Vuoi davvero cambiare lo stato per questi interventi?'), 'msg' => tr('Seleziona lo stato in cui spostare tutti gli interventi non completati').'.
-
{[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT `in_stati_intervento`.`id`, `title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL ORDER BY `title`" ]}', +
{[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT `in_stati_intervento`.`id`, `title` as descrizione, `colore` AS _bgcolor_ FROM `in_stati_intervento` LEFT JOIN `in_stati_intervento_lang` ON (`in_stati_intervento`.`id` = `in_stati_intervento_lang`.`id_record` AND `in_stati_intervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `deleted_at` IS NULL ORDER BY `sort_order`, `title`" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', 'blank' => false, diff --git a/modules/stati_intervento/actions.php b/modules/stati_intervento/actions.php index 662a3cbbb..2fc522240 100755 --- a/modules/stati_intervento/actions.php +++ b/modules/stati_intervento/actions.php @@ -42,6 +42,7 @@ $stato->notifica_tecnico_assegnato = post('notifica_tecnico_assegnato'); $stato->id_email = post('email') ?: null; $stato->destinatari = post('destinatari'); + $stato->sort_order = post('sort_order'); $stato->save(); $stato->setTranslation('title', $descrizione); @@ -54,7 +55,6 @@ $codice = post('codice'); $descrizione = post('descrizione'); $colore = post('colore'); - $stato_new = Stato::where('name', $descrizione)->first()->id; if ($stato_new) { @@ -62,6 +62,7 @@ } else { $stato = Stato::build($codice, $colore); $stato->name = $descrizione; + $stato->sort_order = post('sort_order'); $id_record = $dbo->lastInsertedID(); $stato->save(); diff --git a/modules/stati_intervento/add.php b/modules/stati_intervento/add.php index 2472895c8..76d664c32 100755 --- a/modules/stati_intervento/add.php +++ b/modules/stati_intervento/add.php @@ -31,7 +31,11 @@
{[ "type": "text", "label": "", "name": "descrizione", "required": 1 ]}
- +
+ {[ "type": "text", "label": "", "name": "sort_order" ]} +
+
+
{[ "type": "text", "label": "", "name": "colore", "id": "colore_", "required": 1, "class": "colorpicker text-center", "value": "#ffffff", "extra": "maxlength='7'", "icon-after": "
" ]}
@@ -49,10 +53,10 @@ \ No newline at end of file + diff --git a/modules/stati_intervento/edit.php b/modules/stati_intervento/edit.php index a6eec15d4..1de768d6f 100755 --- a/modules/stati_intervento/edit.php +++ b/modules/stati_intervento/edit.php @@ -23,7 +23,7 @@ use Modules\Interventi\Stato; $stato = Stato::find($id_record); -if ($stato->can_delete) { +if ($record['can_delete']) { $attr = ''; } else { $attr = 'readonly'; @@ -56,17 +56,22 @@
{[ "type": "checkbox", "label": "", "name": "notifica", "help": ".", "value": "$notifica$" ]}
+ +
+ {[ "type": "text", "label": "", "name": "sort_order", "help": ".", "value": "$sort_order$" ]} +
+

- {[ "type": "select", "label": "", "name": "email", "value": "$id_email$", "values": "query=SELECT `em_templates`.`id`, `em_templates_lang`.`title` AS descrizione FROM `em_templates` LEFT JOIN `em_templates_lang` ON (`em_templates`.`id` = `em_templates_lang`.`id_record` AND `em_templates_lang`.`id_lang` = id); ?>) WHERE `id_module` = first()->id; ?> AND `deleted_at` IS NULL", "disabled": notifica)); ?>, "required":1 ]} + {[ "type": "select", "label": "", "name": "email", "value": "$id_email$", "values": "query=SELECT `em_templates`.`id`, `em_templates_lang`.`title` AS descrizione FROM `em_templates` LEFT JOIN `em_templates_lang` ON (`em_templates`.`id` = `em_templates_lang`.`id_record` AND `em_templates_lang`.`id_lang` = id); ?>) WHERE `id_module` = first()->id; ?> AND `deleted_at` IS NULL", "disabled": , "required":1 ]}
- {[ "type": "text", "label": "", "name": "destinatari", "value": "$destinatari$", "icon-before": "", "disabled": notifica)); ?> ]} + {[ "type": "text", "label": "", "name": "destinatari", "value": "$destinatari$", "icon-before": "", "disabled": ]}
@@ -105,7 +110,7 @@ can_delete) { +if ($record['can_delete']) { ?> @@ -115,11 +120,11 @@ ?>