Skip to content

Commit 86a7896

Browse files
committed
feat: modifica del tecnico spostata su popup di modifica sessione
1 parent 2969441 commit 86a7896

5 files changed

Lines changed: 142 additions & 71 deletions

File tree

modules/interventi/actions.php

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,12 @@
12261226
$sessione->orario_fine = post('orario_fine');
12271227
$sessione->km = post('km');
12281228

1229+
// Modifica del tecnico (se cambiato)
1230+
$id_tecnico = post('idtecnico');
1231+
if (!empty($id_tecnico) && $id_tecnico != $sessione->idtecnico) {
1232+
$sessione->setTecnico($id_tecnico);
1233+
}
1234+
12291235
$id_tipo = post('idtipointerventot');
12301236
$sessione->setTipo($id_tipo);
12311237

@@ -1265,18 +1271,6 @@
12651271
$sessione->tipo_sconto = post('tipo_sconto');
12661272
$sessione->scontokm_unitario = post('scontokm_unitario');
12671273
$sessione->tipo_scontokm = post('tipo_sconto_km');
1268-
1269-
// Gestione cambio tecnico
1270-
$id_tecnico = post('id_tecnico');
1271-
if (!empty($id_tecnico) && $id_tecnico != $sessione->idtecnico) {
1272-
$anagrafica = Anagrafica::find($id_tecnico);
1273-
$sessione->anagrafica()->associate($anagrafica);
1274-
1275-
// Aggiorna i prezzi in base al nuovo tecnico
1276-
$id_tipo = $sessione->idtipointervento;
1277-
$sessione->setTipo($id_tipo, true);
1278-
}
1279-
12801274
$sessione->save();
12811275

12821276
// Trigger aggiornamento intervento

modules/interventi/ajax/select.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
include_once __DIR__.'/../../../core.php';
2222

23+
use Modules\Interventi\Intervento;
24+
2325
switch ($resource) {
2426
case 'tipiintervento':
2527
$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`
@@ -92,5 +94,66 @@
9294
'recordsFiltered' => $data['recordsFiltered'],
9395
];
9496

97+
break;
98+
99+
case 'tipiintervento-tecnico':
100+
$idtecnico = $superselect['idtecnico'];
101+
$id_intervento = $superselect['id_intervento'];
102+
103+
if (empty($idtecnico)) {
104+
$results = [
105+
'results' => [],
106+
'recordsFiltered' => 0,
107+
];
108+
break;
109+
}
110+
111+
$intervento = Intervento::find($id_intervento);
112+
113+
// Query per i tipi di intervento in base al contratto o al tecnico
114+
if (!empty($intervento->id_contratto)) {
115+
$query = 'SELECT `in_tipiintervento`.`id`, CONCAT(`codice`, \' - \', `title`) AS descrizione, `co_contratti_tipiintervento`.`costo_ore` AS prezzo_ore_unitario, `co_contratti_tipiintervento`.`costo_km` AS prezzo_km_unitario, `co_contratti_tipiintervento`.`costo_dirittochiamata` AS prezzo_dirittochiamata
116+
FROM `in_tipiintervento`
117+
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).')
118+
INNER JOIN `co_contratti_tipiintervento` ON `in_tipiintervento`.`id` = `co_contratti_tipiintervento`.`idtipointervento`
119+
|where|
120+
ORDER BY `title`';
121+
122+
$where[] = '`co_contratti_tipiintervento`.`idtecnico` = '.prepare($idtecnico);
123+
124+
} else {
125+
$query = 'SELECT `in_tipiintervento`.`id`, CONCAT(`codice`, \' - \', `title`) AS descrizione, `in_tariffe`.`costo_ore` AS prezzo_ore_unitario, `in_tariffe`.`costo_km` AS prezzo_km_unitario, `in_tariffe`.`costo_dirittochiamata` AS prezzo_dirittochiamata
126+
FROM `in_tipiintervento`
127+
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).')
128+
INNER JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento`
129+
|where|
130+
ORDER BY `title`';
131+
132+
$where[] = '`in_tariffe`.`idtecnico` = '.prepare($idtecnico);
133+
134+
}
135+
136+
foreach ($elements as $element) {
137+
$filter[] = '`in_tipiintervento`.`id`='.prepare($element);
138+
}
139+
140+
if (!empty($search)) {
141+
$search_fields[] = '`title` LIKE '.prepare('%'.$search.'%');
142+
}
143+
144+
$data = AJAX::selectResults($query, $where, $filter, $search_fields, $limit, $custom);
145+
$rs = $data['results'];
146+
147+
foreach ($rs as $k => $r) {
148+
$rs[$k] = array_merge($r, [
149+
'text' => $r['descrizione'],
150+
]);
151+
}
152+
153+
$results = [
154+
'results' => $rs,
155+
'recordsFiltered' => $data['recordsFiltered'],
156+
];
157+
95158
break;
96159
}

modules/interventi/ajax_tecnici.php

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
include_once __DIR__.'/../../core.php';
2222
use Models\Module;
23+
use Models\User;
2324

2425
$show_costi = true;
2526
// Limitazione delle azioni dei tecnici
@@ -68,10 +69,21 @@
6869
echo '
6970
<div class="table-responsive">
7071
<table class="table table-striped table-hover table-sm">
71-
<tr><th width="16%">'.tr('Tecnico').'</th>
72-
<th width="12%">'.tr('Tipologia').'</th>
73-
<th width="12%">'.tr('Orario inizio').'</th>
74-
<th width="12%">'.tr('Orario fine').'</th>
72+
<tr><th>';
73+
74+
if ($sessione['id_user']) {
75+
$user = User::where('idanagrafica', $sessione['idtecnico'])->orderByRaw('CASE WHEN idgruppo = 2 THEN -1 ELSE idgruppo END')->first();
76+
echo '
77+
<img class="attachment-img tip" src="'.$user->photo.'" title="'.$user->nome_completo.'">';
78+
} else {
79+
echo '
80+
<i class="fa fa-user-circle-o attachment-img tip" title="'.$sessione['ragione_sociale'].'"></i>';
81+
}
82+
83+
echo '
84+
'.$sessione['ragione_sociale'].' '.(($sessione['anagrafica_deleted_at']) ? '<small class="text-danger"><em>('.tr('Eliminato').')</em></small>' : '').'</th>
85+
<th width="15%">'.tr('Orario inizio').'</th>
86+
<th width="15%">'.tr('Orario fine').'</th>
7587
<th width="2%"> </th>
7688
<th width="8%">'.tr('Ore').'</th>
7789
<th width="8%">'.tr('Km').'</th>';
@@ -84,7 +96,7 @@
8496

8597
if (!$is_bloccato) {
8698
echo '
87-
<th width="10%" class="text-center">&nbsp;</th>';
99+
<th width="100" class="text-center">&nbsp;</th>';
88100
}
89101

90102
echo '
@@ -111,12 +123,9 @@
111123
$ore = $sessione['ore'];
112124
$km = $sessione['km'];
113125

114-
// Tecnico e Tipologia
126+
// Tipologia
115127
echo '
116-
<tr data-id="'.$sessione['id'].'" data-idtecnico="'.$sessione['idtecnico'].'" data-idtipointervento="'.$sessione['idtipointervento'].'">
117-
<td>
118-
{[ "type": "select", "name": "tecnico_'.$sessione['id'].'", "value": "'.$sessione['idtecnico'].'", "ajax-source": "tecnici", "class": "tecnico-sessione", "disabled": "'.$block_edit.'" ]}
119-
</td>
128+
<tr data-id="'.$sessione['id'].'">
120129
<td>
121130
'.$sessione['descrizione_tipo'].' '.(($sessione['tipo_deleted_at']) ? '<small class="text-danger"><em>('.tr('Eliminato').')</em></small>' : '');
122131

@@ -346,17 +355,6 @@ function calcolaConflittiTecnici() {
346355
data_inizio.data("DateTimePicker").date(e.date);
347356
}
348357
});
349-
350-
// Event handler per il cambio tecnico
351-
$(document).on("change", ".tecnico-sessione", function() {
352-
let riga = $(this).closest("tr");
353-
let id_sessione = riga.data("id");
354-
let id_tecnico = $(this).val();
355-
let id_tipo_intervento = riga.data("idtipointervento");
356-
357-
// Salva automaticamente con il nuovo tecnico
358-
aggiornaSessioneInline(id_sessione, id_tecnico);
359-
});
360358
});
361359
362360
/*
@@ -462,7 +460,7 @@ function caricaTecnici() {
462460
});
463461
}
464462
465-
function aggiornaSessioneInline(id, id_tecnico) {
463+
function aggiornaSessioneInline(id) {
466464
var id_sessione = id;
467465
var data_inizio = $("#data_inizio_" + id_sessione).val();
468466
var data_fine = $("#data_fine_" + id_sessione).val();
@@ -472,29 +470,22 @@ function aggiornaSessioneInline(id, id_tecnico) {
472470
var scontokm_unitario = $("#scontokm_unitario_" + id_sessione).val();
473471
var tipo_sconto_km =$("[id^=tipo_scontokm_unitario_" + id_sessione + "]").val()
474472
475-
var data = {
476-
id_module: globals.id_module,
477-
id_record: globals.id_record,
478-
op: "update_inline_sessione",
479-
id_sessione: id_sessione,
480-
data_inizio: data_inizio,
481-
data_fine: data_fine,
482-
km: km,
483-
sconto_unitario: sconto_unitario,
484-
tipo_sconto: tipo_sconto,
485-
scontokm_unitario: scontokm_unitario,
486-
tipo_sconto_km: tipo_sconto_km,
487-
};
488-
489-
// Aggiungi id_tecnico se fornito
490-
if (id_tecnico !== undefined) {
491-
data.id_tecnico = id_tecnico;
492-
}
493-
494473
$.ajax({
495474
url: globals.rootdir + "/actions.php",
496475
type: "POST",
497-
data: data,
476+
data: {
477+
id_module: globals.id_module,
478+
id_record: globals.id_record,
479+
op: "update_inline_sessione",
480+
id_sessione: id_sessione,
481+
data_inizio: data_inizio,
482+
data_fine: data_fine,
483+
km: km,
484+
sconto_unitario: sconto_unitario,
485+
tipo_sconto: tipo_sconto,
486+
scontokm_unitario: scontokm_unitario,
487+
tipo_sconto_km: tipo_sconto_km,
488+
},
498489
success: function(response) {
499490
caricaTecnici();
500491
caricaCosti();

modules/interventi/modals/manage_sessione.php

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
include_once __DIR__.'/../../../core.php';
2222
include_once __DIR__.'/../../../../core.php';
2323

24-
use Modules\Interventi\Intervento;
24+
use Models\Module;
2525

2626
$show_prezzi = true;
2727
// Limitazione delle azioni dei tecnici
@@ -33,30 +33,21 @@
3333

3434
$op = 'edit_sessione';
3535
$button = '<i class="fa fa-edit"></i> '.tr('Modifica');
36-
37-
$intervento = Intervento::find($id_record);
38-
39-
if (!empty($intervento->id_contratto)) {
40-
$query = 'SELECT `in_tipiintervento`.`id`, `title` as `descrizione`, `co_contratti_tipiintervento`.`costo_ore` AS prezzo_ore_unitario, `co_contratti_tipiintervento`.`costo_km` AS prezzo_km_unitario, `co_contratti_tipiintervento`.`costo_dirittochiamata` AS prezzo_dirittochiamata FROM `in_tipiintervento` 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).') INNER JOIN `co_contratti_tipiintervento` ON `in_tipiintervento`.`id` = `co_contratti_tipiintervento`.`idtipointervento` WHERE `co_contratti_tipiintervento`.`idcontratto` = '.prepare($intervento->id_contratto).' AND `in_tipiintervento`.`deleted_at` IS NULL ORDER BY `title`';
41-
} else {
42-
$query = 'SELECT `in_tipiintervento`.`id`, `title` as `descrizione`, `in_tariffe`.`costo_ore` AS prezzo_ore_unitario, `in_tariffe`.`costo_km` AS prezzo_km_unitario, `in_tariffe`.`costo_dirittochiamata` AS prezzo_dirittochiamata FROM `in_tipiintervento` 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).') INNER JOIN `in_tariffe` ON `in_tipiintervento`.`id` = `in_tariffe`.`idtipointervento` WHERE `in_tariffe`.`idtecnico` = '.prepare($sessione['idtecnico']).' AND `in_tipiintervento`.`deleted_at` IS NULL ORDER BY `title`';
43-
}
4436
echo '
4537
<form id="add_form" action="'.base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.get('id_record').'" method="post">
4638
<input type="hidden" name="op" value="'.$op.'">
4739
<input type="hidden" name="backto" value="record-edit">
48-
<input type="hidden" name="id_sessione" value="'.$sessione['id'].'">
49-
<input type="hidden" name="idtecnico" value="'.$sessione['idtecnico'].'">';
40+
<input type="hidden" name="id_sessione" value="'.$sessione['id'].'">';
5041

5142
// Tecnico
5243
echo '
5344
<div class="row">
5445
<div class="col-md-4">
55-
{[ "type": "span", "label": "'.tr('Tecnico').'", "name": "tecnico", "required": 0, "value": "'.$sessione['ragione_sociale'].' '.(!empty($sessione['deleted_at']) ? '<small class="text-danger"><em>('.tr('Eliminato').')</em></small>' : '').'" ]}
46+
{[ "type": "select", "label": "'.tr('Tecnico').'", "name": "idtecnico", "value": "'.$sessione['idtecnico'].'", "required": 1, "ajax-source": "tecnici", "icon-after": "add|'.Module::where('name', 'Anagrafiche')->first()->id.'|tipoanagrafica=Tecnico&readonly_tipo=1" ]}
5647
</div>
5748
5849
<div class="col-md-4">
59-
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtipointerventot", "value": "'.$sessione['idtipointervento'].'", "required": 1, "values": "query='.$query.'" ]}
50+
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtipointerventot", "value": "'.$sessione['idtipointervento'].'", "required": 1, "ajax-source": "tipiintervento-tecnico", "select-options": '.json_encode(['idtecnico' => $sessione['idtecnico'], 'id_intervento' => $id_record]).' ]}
6051
</div>
6152
</div>';
6253

@@ -141,12 +132,31 @@
141132
}
142133
});
143134
135+
// Quando cambio il tecnico, aggiorno le select-options del tipo attività
136+
$("#idtecnico").change(function() {
137+
var idtecnico = $(this).val();
138+
139+
if (!idtecnico) {
140+
return;
141+
}
142+
143+
// Aggiorno le select-options per ricaricare i tipi di intervento del nuovo tecnico
144+
$("#idtipointerventot").setSelectOption("idtecnico", idtecnico);
145+
$("#idtipointerventot").setSelectOption("id_intervento", globals.id_record);
146+
147+
// Resetto e ricarico il select dei tipi di intervento
148+
$("#idtipointerventot").selectReset();
149+
});
150+
151+
// Quando cambio il tipo di intervento, aggiorno i prezzi
144152
$("#idtipointerventot").change(function() {
145-
data = $(this).selectData();
153+
var data = $(this).selectData();
146154
147-
$("#prezzo_ore_unitario").val(data.prezzo_ore_unitario);
148-
$("#prezzo_km_unitario").val(data.prezzo_km_unitario);
149-
$("#prezzo_dirittochiamata").val(data.prezzo_dirittochiamata);
155+
if (data) {
156+
$("#prezzo_ore_unitario").val(data.prezzo_ore_unitario);
157+
$("#prezzo_km_unitario").val(data.prezzo_km_unitario);
158+
$("#prezzo_dirittochiamata").val(data.prezzo_dirittochiamata);
159+
}
150160
});
151161
});
152162

modules/interventi/src/Components/Sessione.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ public function setTipo($id_tipo, $reset = false)
130130
}
131131
}
132132

133+
public function setTecnico($id_tecnico)
134+
{
135+
$previous = $this->idtecnico;
136+
137+
$anagrafica = Anagrafica::find($id_tecnico);
138+
$this->anagrafica()->associate($anagrafica);
139+
140+
// Se il tecnico è cambiato, ricarico le tariffe per il tipo di intervento corrente
141+
if ($previous != $id_tecnico && !empty($this->idtipointervento)) {
142+
$this->setTipo($this->idtipointervento, false);
143+
}
144+
}
145+
133146
public function getOreCalcolateAttribute()
134147
{
135148
$inizio = new \DateTime($this->orario_inizio);

0 commit comments

Comments
 (0)