Skip to content

Commit ce150d9

Browse files
committed
feat: aggiunta tipo di intervento nelle righe dei contratti, e gestione delle sessioni intervento collegate ai contratti
1 parent 8127ab6 commit ce150d9

8 files changed

Lines changed: 250 additions & 76 deletions

File tree

include/common/riga.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ function aggiorna_guadagno() {
266266
267267
<div class="col-md-4">
268268
{[ "type": "date", "label": "'.tr('Data fine competenza').'", "name": "data_fine_competenza", "value": "'.$result['data_fine_competenza'].'" ]}
269+
</div>
270+
271+
<div class="col-md-4">
272+
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "id_tipointervento", "value": "'.$result['id_tipointervento'].'", "ajax-source": "tipiintervento", "placeholder": "'.tr('Seleziona un tipo di intervento...').'" ]}
269273
</div>';
270274

271275
if (isset($result['type']) && isset($result['id'])) {

modules/contratti/actions.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@
261261
$riga->data_fine_competenza = post('data_fine_competenza') ?: null;
262262

263263
$riga->id_iva = post('idiva');
264+
$riga->id_tipointervento = post('id_tipointervento') ?: null;
264265

265266
$riga->costo_unitario = post('costo_unitario') ?: 0;
266267
$riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva'));

modules/interventi/add.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@
206206
</div>
207207
208208
<div class="col-md-4">
209-
{[ "type": "select", "label": "'.tr('Tipo').'", "name": "idtipointervento", "required": 1, "value": "'.$id_tipo.'", "ajax-source": "tipiintervento" ]}
209+
{[ "type": "select", "label": "'.tr('Tipo').'", "name": "idtipointervento", "required": 1, "value": "'.$id_tipo.'", "ajax-source": "tipiintervento", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica, 'idcontratto' => $id_contratto]).' ]}
210210
</div>
211211
212212
<div class="col-md-4">
@@ -341,7 +341,7 @@
341341
<h5 class="text-primary border-bottom pb-2 mb-4"><i class="fa fa-clock-o"></i> '.tr('Sessioni di lavoro').'</h5>
342342
<div class="row">
343343
<div class="col-md-4">
344-
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtiposessione", "value": "'.$id_tipo.'", "ajax-source": "tipiintervento", "help": "'.tr('Seleziona il tipo di attività per calcolare automaticamente la durata prevista').'." ]}
344+
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtiposessione", "value": "'.$id_tipo.'", "ajax-source": "tipiintervento", "select-options": '.json_encode(['idanagrafica' => $id_anagrafica, 'idcontratto' => $id_contratto]).', "help": "'.tr('Seleziona il tipo di attività per calcolare automaticamente la durata prevista').'." ]}
345345
</div>
346346
347347
<div class="col-md-2">
@@ -682,13 +682,25 @@ function() {
682682
683683
$("input[name=idcontratto_riga]").val("");
684684
685+
// Aggiorna le opzioni del tipo di intervento in base al contratto selezionato
686+
updateSelectOption("idcontratto", contratto.get());
687+
session_set("superselect,idcontratto",contratto.get(), 0);
688+
689+
// Precompila il tipo di intervento con quello del contratto
685690
if ($(this).selectData().idtipointervento) {
686691
input("idtipointervento").getElement()
687692
.selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
688693
}
689-
690-
updateSelectOption("idcontratto", contratto.get());
691-
session_set("superselect,idcontratto",contratto.get(), 0);
694+
695+
// Aggiorna anche il tipo attività delle sessioni
696+
if ($(this).selectData().idtipointervento) {
697+
input("idtiposessione").getElement()
698+
.selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
699+
}
700+
} else {
701+
// Se il contratto viene deselezionato, rimuovi il filtro
702+
updateSelectOption("idcontratto", "");
703+
session_set("superselect,idcontratto", "", 0);
692704
}
693705
});
694706

modules/interventi/ajax/select.php

Lines changed: 73 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,39 @@
2424

2525
switch ($resource) {
2626
case 'tipiintervento':
27-
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`, IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\', IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) END AS descrizione, `tempo_standard`
28-
FROM `in_tipiintervento`
29-
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
30-
|where|
31-
ORDER BY `title`';
27+
// Verifica se è presente un contratto collegato
28+
$id_contratto = $superselect['idcontratto'] ?? null;
29+
$id_intervento = $superselect['id_intervento'] ?? null;
30+
31+
if (!empty($id_contratto)) {
32+
// Se c'è un contratto: mostra SOLO tipi presenti nelle righe del contratto
33+
$query = 'SELECT DISTINCT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`, IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\', IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) END AS descrizione, `tempo_standard`
34+
FROM `in_tipiintervento`
35+
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
36+
INNER JOIN `co_righe_contratti` ON `in_tipiintervento`.`id` = `co_righe_contratti`.`id_tipointervento` AND `co_righe_contratti`.`idcontratto` = '.prepare($id_contratto).'
37+
|where|
38+
ORDER BY `title`';
39+
40+
// Filtro: mostra SOLO tipi presenti nelle righe del contratto
41+
$where[] = '`co_righe_contratti`.`idcontratto` = '.prepare($id_contratto);
42+
} else {
43+
// Altrimenti mostra tutti i tipi di intervento
44+
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`, IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\', IF(`in_tipiintervento`.`deleted_at` IS NULL, "", " ('.tr('eliminato').')")) END AS descrizione, `tempo_standard`
45+
FROM `in_tipiintervento`
46+
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
47+
|where|
48+
ORDER BY `title`';
49+
}
3250

3351
foreach ($elements as $element) {
3452
$filter[] = '`in_tipiintervento`.`id`='.prepare($element);
3553
}
3654

37-
if (empty($filter)) {
38-
$where[] = '`in_tipiintervento`.`deleted_at` IS NULL';
55+
// Applica il filtro deleted_at solo se non c'è un contratto
56+
if (empty($id_contratto)) {
57+
if (empty($filter)) {
58+
$where[] = '`in_tipiintervento`.`deleted_at` IS NULL';
59+
}
3960
}
4061

4162
if (!empty($search)) {
@@ -99,57 +120,72 @@
99120
case 'tipiintervento-tecnico':
100121
$idtecnico = $superselect['idtecnico'];
101122
$id_intervento = $superselect['id_intervento'];
102-
123+
103124
if (empty($idtecnico)) {
104125
$results = [
105126
'results' => [],
106127
'recordsFiltered' => 0,
107128
];
108129
break;
109130
}
110-
131+
111132
$intervento = Intervento::find($id_intervento);
112-
133+
113134
// Query per i tipi di intervento in base alla sede al contratto o al tecnico
114135
// Priorità: tariffe contratto > tariffe sede > tariffe tecnico
115136
if (!empty($intervento->idsede_destinazione)) {
116137
// Se c'è una sede configurata: prova prima tariffe contratto, poi sede, poi tecnico
117-
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
118-
COALESCE(`co_contratti_tipiintervento`.`costo_ore`, `in_tariffe_sedi`.`costo_ore`, `in_tariffe`.`costo_ore`) AS prezzo_ore_unitario,
119-
COALESCE(`co_contratti_tipiintervento`.`costo_km`, `in_tariffe_sedi`.`costo_km`, `in_tariffe`.`costo_km`) AS prezzo_km_unitario,
120-
COALESCE(`co_contratti_tipiintervento`.`costo_dirittochiamata`, `in_tariffe_sedi`.`costo_dirittochiamata`, `in_tariffe`.`costo_dirittochiamata`) AS prezzo_dirittochiamata
121-
FROM `in_tipiintervento`
122-
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
123-
LEFT JOIN `co_contratti_tipiintervento` ON `in_tipiintervento`.`id` = `co_contratti_tipiintervento`.`idtipointervento` AND `co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).'
124-
LEFT JOIN `in_tariffe_sedi` ON `in_tipiintervento`.`id` = `in_tariffe_sedi`.`idtipointervento` AND `in_tariffe_sedi`.`idsede` = '.prepare($intervento->idsede_destinazione).'
125-
LEFT JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` AND `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
126-
|where|
127-
ORDER BY `title`';
128-
129-
// Filtro: mostra tipi con tariffe contratto, o sede, o tecnico
130-
$where[] = '(
131-
`co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).'
132-
OR `in_tariffe_sedi`.`idsede` = '.prepare($intervento->idsede_destinazione).'
133-
OR `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
134-
)';
138+
// Se c'è un contratto: mostra SOLO tipi presenti nelle righe del contratto
139+
if (!empty($intervento->id_contratto)) {
140+
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
141+
COALESCE(`co_contratti_tipiintervento`.`costo_ore`, `in_tariffe_sedi`.`costo_ore`, `in_tariffe`.`costo_ore`) AS prezzo_ore_unitario,
142+
COALESCE(`co_contratti_tipiintervento`.`costo_km`, `in_tariffe_sedi`.`costo_km`, `in_tariffe`.`costo_km`) AS prezzo_km_unitario,
143+
COALESCE(`co_contratti_tipiintervento`.`costo_dirittochiamata`, `in_tariffe_sedi`.`costo_dirittochiamata`, `in_tariffe`.`costo_dirittochiamata`) AS prezzo_dirittochiamata
144+
FROM `in_tipiintervento`
145+
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
146+
INNER JOIN `co_righe_contratti` ON `in_tipiintervento`.`id` = `co_righe_contratti`.`id_tipointervento` AND `co_righe_contratti`.`idcontratto` = '.prepare($intervento->id_contratto).'
147+
LEFT JOIN `co_contratti_tipiintervento` ON `in_tipiintervento`.`id` = `co_contratti_tipiintervento`.`idtipointervento` AND `co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).'
148+
LEFT JOIN `in_tariffe_sedi` ON `in_tipiintervento`.`id` = `in_tariffe_sedi`.`idtipointervento` AND `in_tariffe_sedi`.`idsede` = '.prepare($intervento->idsede_destinazione).'
149+
LEFT JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` AND `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
150+
|where|
151+
ORDER BY `title`';
152+
153+
// Filtro: mostra SOLO tipi presenti nelle righe del contratto
154+
$where[] = '`co_righe_contratti`.`idcontratto` = '.prepare($intervento->id_contratto);
155+
} else {
156+
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
157+
COALESCE(`in_tariffe_sedi`.`costo_ore`, `in_tariffe`.`costo_ore`) AS prezzo_ore_unitario,
158+
COALESCE(`in_tariffe_sedi`.`costo_km`, `in_tariffe`.`costo_km`) AS prezzo_km_unitario,
159+
COALESCE(`in_tariffe_sedi`.`costo_dirittochiamata`, `in_tariffe`.`costo_dirittochiamata`) AS prezzo_dirittochiamata
160+
FROM `in_tipiintervento`
161+
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
162+
LEFT JOIN `in_tariffe_sedi` ON `in_tipiintervento`.`id` = `in_tariffe_sedi`.`idtipointervento` AND `in_tariffe_sedi`.`idsede` = '.prepare($intervento->idsede_destinazione).'
163+
LEFT JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` AND `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
164+
|where|
165+
ORDER BY `title`';
166+
167+
// Filtro: mostra tipi con tariffe sede o tecnico
168+
$where[] = '(
169+
`in_tariffe_sedi`.`idsede` = '.prepare($intervento->idsede_destinazione).'
170+
OR `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
171+
)';
172+
}
135173
} elseif (!empty($intervento->id_contratto)) {
136-
// Se c'è un contratto: prova tariffe contratto, poi tecnico
137-
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
174+
// Se c'è un contratto: mostra SOLO tipi presenti nelle righe del contratto
175+
$query = 'SELECT DISTINCT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
138176
COALESCE(`co_contratti_tipiintervento`.`costo_ore`, `in_tariffe`.`costo_ore`) AS prezzo_ore_unitario,
139177
COALESCE(`co_contratti_tipiintervento`.`costo_km`, `in_tariffe`.`costo_km`) AS prezzo_km_unitario,
140178
COALESCE(`co_contratti_tipiintervento`.`costo_dirittochiamata`, `in_tariffe`.`costo_dirittochiamata`) AS prezzo_dirittochiamata
141179
FROM `in_tipiintervento`
142180
LEFT JOIN `in_tipiintervento_lang` ON (`in_tipiintervento`.`id` = `in_tipiintervento_lang`.`id_record` AND `in_tipiintervento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
181+
INNER JOIN `co_righe_contratti` ON `in_tipiintervento`.`id` = `co_righe_contratti`.`id_tipointervento` AND `co_righe_contratti`.`idcontratto` = '.prepare($intervento->id_contratto).'
143182
LEFT JOIN `co_contratti_tipiintervento` ON `in_tipiintervento`.`id` = `co_contratti_tipiintervento`.`idtipointervento` AND `co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).'
144183
LEFT JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` AND `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
145184
|where|
146185
ORDER BY `title`';
147-
148-
// Filtro: mostra tipi con tariffe contratto o tecnico
149-
$where[] = '(
150-
`co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).'
151-
OR `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
152-
)';
186+
187+
// Filtro: mostra SOLO tipi presenti nelle righe del contratto
188+
$where[] = '`co_righe_contratti`.`idcontratto` = '.prepare($intervento->id_contratto);
153189
} else {
154190
// Altrimenti usa solo tariffe tecnico
155191
$query = 'SELECT `in_tipiintervento`.`id`, CASE WHEN ISNULL(`tempo_standard`) OR `tempo_standard` <= 0 THEN CONCAT(`codice`, \' - \', `title`) WHEN `tempo_standard` > 0 THEN CONCAT(`codice`, \' - \', `title`, \' (\', REPLACE(FORMAT(`tempo_standard`, 2), \'.\', \',\'), \' ore)\') END AS descrizione, `tempo_standard`,
@@ -161,7 +197,7 @@
161197
INNER JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` AND `in_tariffe`.`idtecnico` = '.prepare($idtecnico).'
162198
|where|
163199
ORDER BY `title`';
164-
200+
165201
$where[] = '`in_tariffe`.`idtecnico` = '.prepare($idtecnico);
166202
}
167203

modules/interventi/edit.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
{[ "type": "timestamp", "label": "<?php echo tr('Data/ora scadenza'); ?>", "name": "data_scadenza", "required": 0, "value": "$data_scadenza$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
162162
</div>
163163
<div class="col-md-3">
164-
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "ajax-source": "tipiintervento", "value": "$idtipointervento$", "readonly": "<?php echo $record['flag_completato']; ?>", "select-options": <?php echo json_encode(['idanagrafica' => $record['idanagrafica']]); ?> ]}
164+
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "ajax-source": "tipiintervento", "value": "$idtipointervento$", "readonly": "<?php echo $record['flag_completato']; ?>", "select-options": <?php echo json_encode(['idanagrafica' => $record['idanagrafica'], 'idcontratto' => $record['id_contratto']]); ?> ]}
165165
</div>
166166
<div class="col-md-3">
167167
<?php
@@ -670,6 +670,20 @@ function caricaCosti() {
670670
ordine.getElement().selectReset();
671671
672672
$("input[name=idcontratto_riga]").val("");
673+
674+
// Aggiorna le opzioni del tipo di intervento in base al contratto selezionato
675+
updateSelectOption("idcontratto", $(this).val());
676+
session_set("superselect,idcontratto", $(this).val(), 0);
677+
678+
// Precompila il tipo di intervento con quello del contratto
679+
if ($(this).selectData().idtipointervento) {
680+
input("idtipointervento").getElement()
681+
.selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
682+
}
683+
} else {
684+
// Se il contratto viene deselezionato, rimuovi il filtro
685+
updateSelectOption("idcontratto", "");
686+
session_set("superselect,idcontratto", "", 0);
673687
}
674688
});
675689

0 commit comments

Comments
 (0)