diff --git a/assets/src/js/functions/functions.js b/assets/src/js/functions/functions.js index 39d0e92e7..df042a5c9 100755 --- a/assets/src/js/functions/functions.js +++ b/assets/src/js/functions/functions.js @@ -523,7 +523,7 @@ function alertPush() { }); } -function salvaForm(button, form) { +function salvaForm(button, form, data = {}) { return new Promise(function (resolve, reject) { // Caricamento visibile nel pulsante let restore = buttonLoading(button); @@ -541,7 +541,7 @@ function salvaForm(button, form) { resolve(false); } - submitAjax(form, {}, function (response) { + submitAjax(form, data, function (response) { buttonRestore(button, restore); resolve(true); }, function (data) { diff --git a/modules/dashboard/actions.php b/modules/dashboard/actions.php index 0e59962cf..c62dfc8ce 100755 --- a/modules/dashboard/actions.php +++ b/modules/dashboard/actions.php @@ -2,37 +2,65 @@ include_once __DIR__.'/../../core.php'; +$modulo_interventi = Modules::get('Interventi'); + if (!isset($user['idanagrafica'])) { $user['idanagrafica'] = ''; } -switch (get('op')) { +switch (filter('op')) { // Lettura calendario tecnici - case 'get_current_month': - $start = get('start'); - $end = get('end'); + case 'interventi_periodo': + $start = filter('start'); + $end = filter('end'); $stati = (array) $_SESSION['dashboard']['idstatiintervento']; $stati[] = prepare(''); $tipi = (array) $_SESSION['dashboard']['idtipiintervento']; + $zone = (array) $_SESSION['dashboard']['idzone']; + $tecnici = (array) $_SESSION['dashboard']['idtecnici']; - $query = 'SELECT in_interventi_tecnici.id, in_interventi_tecnici.idintervento, in_interventi.codice, colore, idtecnico, orario_inizio, orario_fine, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS nome_tecnico, (SELECT id FROM zz_files WHERE id_record=in_interventi.id AND id_module = '.Modules::get('Interventi')['id'].' LIMIT 1) AS have_attachments, (SELECT colore FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS colore_tecnico, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=in_interventi.idanagrafica) AS cliente, (SELECT idzona FROM an_anagrafiche WHERE idanagrafica=in_interventi.idanagrafica) AS idzona FROM in_interventi_tecnici INNER JOIN (in_interventi LEFT OUTER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento) ON in_interventi_tecnici.idintervento=in_interventi.id WHERE ( (in_interventi_tecnici.orario_inizio >= '.prepare($start).' AND in_interventi_tecnici.orario_fine <= '.prepare($end).') OR (in_interventi_tecnici.orario_inizio >= '.prepare($start).' AND in_interventi_tecnici.orario_inizio <= '.prepare($end).') OR (in_interventi_tecnici.orario_fine >= '.prepare($start).' AND in_interventi_tecnici.orario_fine <= '.prepare($end).')) AND idtecnico IN('.implode(',', $_SESSION['dashboard']['idtecnici']).') AND in_interventi.idstatointervento IN('.implode(',', $stati).') AND in_interventi_tecnici.idtipointervento IN('.implode(',', $tipi).') '.Modules::getAdditionalsQuery('Interventi').' HAVING idzona IN ('.implode(',', $_SESSION['dashboard']['idzone']).')'; - $rs = $dbo->fetchArray($query); + $query = 'SELECT + in_interventi_tecnici.id, + in_interventi_tecnici.idintervento, + in_interventi.codice, + colore, + in_interventi_tecnici.idtecnico, + in_interventi_tecnici.orario_inizio, + in_interventi_tecnici.orario_fine, + (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = idtecnico) AS nome_tecnico, + (SELECT id FROM zz_files WHERE id_record = in_interventi.id AND id_module = '.prepare($modulo_interventi->id).' LIMIT 1) AS have_attachments, + (SELECT colore FROM an_anagrafiche WHERE idanagrafica = idtecnico) AS colore_tecnico, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=in_interventi.idanagrafica) AS cliente, + (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = in_interventi.idanagrafica) AS idzona + FROM in_interventi_tecnici + INNER JOIN in_interventi ON in_interventi_tecnici.idintervento = in_interventi.id + LEFT OUTER JOIN in_statiintervento ON in_interventi.idstatointervento = in_statiintervento.idstatointervento + WHERE + ( + (in_interventi_tecnici.orario_inizio >= '.prepare($start).' AND in_interventi_tecnici.orario_fine <= '.prepare($end).') + OR (in_interventi_tecnici.orario_inizio >= '.prepare($start).' AND in_interventi_tecnici.orario_inizio <= '.prepare($end).') + OR (in_interventi_tecnici.orario_fine >= '.prepare($start).' AND in_interventi_tecnici.orario_fine <= '.prepare($end).') + ) AND idtecnico IN('.implode(',', $tecnici).') + AND in_interventi.idstatointervento IN('.implode(',', $stati).') + AND in_interventi_tecnici.idtipointervento IN('.implode(',', $tipi).') + '.Modules::getAdditionalsQuery('Interventi').' + HAVING idzona IN ('.implode(',', $zone).')'; + $sessioni = $dbo->fetchArray($query); $results = []; - foreach ($rs as $r) { + foreach ($sessioni as $sessione) { $results[] = [ - 'id' => $r['id'], - 'idintervento' => $r['idintervento'], - 'idtecnico' => $r['idtecnico'], - 'title' => 'Int. '.$r['codice'].' '.$r['cliente'].'
'.tr('Tecnici').': '.$r['nome_tecnico'].' '.(($r['have_attachments']) ? '' : ''), - 'start' => $r['orario_inizio'], - 'end' => $r['orario_fine'], - 'url' => $rootdir.'/editor.php?id_module='.Modules::get('Interventi')['id'].'&id_record='.$r['idintervento'], - 'backgroundColor' => $r['colore'], - 'textColor' => color_inverse($r['colore']), - 'borderColor' => ($r['colore_tecnico'] == '#FFFFFF') ? color_darken($r['colore_tecnico'], 100) : $r['colore_tecnico'], + 'id' => $sessione['id'], + 'idintervento' => $sessione['idintervento'], + 'idtecnico' => $sessione['idtecnico'], + 'title' => 'Int. '.$sessione['codice'].' '.$sessione['cliente'].'
'.tr('Tecnici').': '.$sessione['nome_tecnico'].' '.(($sessione['have_attachments']) ? '' : ''), + 'start' => $sessione['orario_inizio'], + 'end' => $sessione['orario_fine'], + 'url' => ROOTDIR.'/editor.php?id_module='.$modulo_interventi->id.'&id_record='.$sessione['idintervento'], + 'backgroundColor' => $sessione['colore'], + 'textColor' => color_inverse($sessione['colore']), + 'borderColor' => ($sessione['colore_tecnico'] == '#FFFFFF') ? color_darken($sessione['colore_tecnico'], 100) : $sessione['colore_tecnico'], 'allDay' => false, ]; } @@ -41,11 +69,11 @@ switch (get('op')) { break; - case 'update_intervento': - $sessione = get('id'); - $idintervento = get('idintervento'); - $orario_inizio = get('timeStart'); - $orario_fine = get('timeEnd'); + case 'modifica_intervento': + $sessione = filter('id'); + $idintervento = filter('idintervento'); + $orario_inizio = filter('timeStart'); + $orario_fine = filter('timeEnd'); // Aggiornamento prezzo totale $q = 'SELECT in_interventi_tecnici.prezzo_ore_unitario, idtecnico, in_statiintervento.is_completato FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id LEFT OUTER JOIN in_statiintervento ON in_interventi.idstatointervento = in_statiintervento.idstatointervento WHERE in_interventi.id='.prepare($idintervento).' AND in_statiintervento.is_completato = 0 '.Modules::getAdditionalsQuery('Interventi'); @@ -69,19 +97,19 @@ switch (get('op')) { break; - case 'get_more_info': - $id = get('id'); - $timeStart = get('timeStart'); - $timeEnd = get('timeEnd'); + case 'info_intervento': + $id = filter('id'); + $timeStart = filter('timeStart'); + $timeEnd = filter('timeEnd'); - //Lettura dati intervento di riferimento + // Lettura dati intervento di riferimento $query = 'SELECT in_interventi_tecnici.idintervento, in_interventi.id, idtecnico, orario_inizio, orario_fine, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS nome_tecnico, (SELECT colore FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS colore FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE in_interventi.id='.prepare($id).' '.Modules::getAdditionalsQuery('Interventi'); $rs = $dbo->fetchArray($query); if (!empty($rs)) { $tecnici = []; - foreach ($rs as $r) { - $tecnici[] = $r['nome_tecnico'].' ('.Translator::timestampToLocale($r['orario_inizio']).' - '.Translator::timeToLocale($r['orario_fine']).')'; + foreach ($rs as $sessione) { + $tecnici[] = $sessione['nome_tecnico'].' ('.Translator::timestampToLocale($sessione['orario_inizio']).' - '.Translator::timeToLocale($sessione['orario_fine']).')'; } // Lettura dati intervento @@ -90,54 +118,53 @@ switch (get('op')) { $desc_tipointervento = $rs[0]['tipo']; - $tooltip_text = ''.tr('Numero intervento').': '.$rs[0]['codice'].'
'; - $tooltip_text .= ''.tr('Ragione sociale').': '.nl2br($rs[0]['ragione_sociale']).'
'; + $tooltip = ''.tr('Numero intervento').': '.$rs[0]['codice'].'
'; + $tooltip .= ''.tr('Ragione sociale').': '.nl2br($rs[0]['ragione_sociale']).'
'; if (!empty($rs[0]['telefono'])) { - $tooltip_text .= ''.tr('Telefono').': '.nl2br($rs[0]['telefono']).'
'; + $tooltip .= ''.tr('Telefono').': '.nl2br($rs[0]['telefono']).'
'; } if (!empty($rs[0]['cellulare'])) { - $tooltip_text .= ''.tr('Cellulare').': '.nl2br($rs[0]['cellulare']).'
'; + $tooltip .= ''.tr('Cellulare').': '.nl2br($rs[0]['cellulare']).'
'; } if (!empty($rs[0]['indirizzo']) || !empty($rs[0]['citta']) || !empty($rs[0]['provincia'])) { - $tooltip_text .= ''.tr('Indirizzo').': '.nl2br($rs[0]['indirizzo'].' '.$rs[0]['citta'].' ('.$rs[0]['provincia'].')').'
'; + $tooltip .= ''.tr('Indirizzo').': '.nl2br($rs[0]['indirizzo'].' '.$rs[0]['citta'].' ('.$rs[0]['provincia'].')').'
'; } if (!empty($rs[0]['note'])) { - $tooltip_text .= ''.tr('Note').': '.nl2br($rs[0]['note']).'
'; + $tooltip .= ''.tr('Note').': '.nl2br($rs[0]['note']).'
'; } - $tooltip_text .= ''.tr('Data richiesta').': '.Translator::timestampToLocale($rs[0]['data_richiesta']).'
'; + $tooltip .= ''.tr('Data richiesta').': '.Translator::timestampToLocale($rs[0]['data_richiesta']).'
'; - $tooltip_text .= ''.tr('Tipo intervento').': '.nl2br($desc_tipointervento).'
'; + $tooltip .= ''.tr('Tipo intervento').': '.nl2br($desc_tipointervento).'
'; - $tooltip_text .= ''.tr('Tecnici').': '.implode(', ', $tecnici).'
'; + $tooltip .= ''.tr('Tecnici').': '.implode(', ', $tecnici).'
'; if ($rs[0]['impianti'] != '') { - $tooltip_text .= ''.tr('Impianti').': '.$rs[0]['impianti'].'
'; + $tooltip .= ''.tr('Impianti').': '.$rs[0]['impianti'].'
'; } if ($rs[0]['richiesta'] != '') { - $tooltip_text .= ''.tr('Richiesta').': '.nl2br($rs[0]['richiesta']).'
'; + $tooltip .= ''.tr('Richiesta').': '.nl2br($rs[0]['richiesta']).'
'; } if ($rs[0]['descrizione'] != '') { - $tooltip_text .= ''.tr('Descrizione').': '.nl2br($rs[0]['descrizione']).'
'; + $tooltip .= ''.tr('Descrizione').': '.nl2br($rs[0]['descrizione']).'
'; } if ($rs[0]['informazioniaggiuntive'] != '') { - $tooltip_text .= ''.tr('Informazioni aggiuntive').': '.nl2br($rs[0]['informazioniaggiuntive']).'
'; + $tooltip .= ''.tr('Informazioni aggiuntive').': '.nl2br($rs[0]['informazioniaggiuntive']).'
'; } - echo $tooltip_text; + echo $tooltip; } + break; - break; - - case 'load_intreventi': - $mese = $_GET['mese']; + case 'carica_interventi': + $mese = filter('mese'); // Righe inserite $qp = "SELECT @@ -148,49 +175,47 @@ switch (get('op')) { data_richiesta, an_anagrafiche.ragione_sociale, 'promemoria' AS ref, - (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_promemoria.idtipointervento) AS tipointervento + (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento = co_promemoria.idtipointervento) AS tipointervento FROM co_promemoria - INNER JOIN co_contratti ON co_promemoria.idcontratto=co_contratti.id - INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica - WHERE - idcontratto IN(SELECT id FROM co_contratti WHERE idstato IN(SELECT id FROM co_staticontratti WHERE is_pianificabile = 1)) AND - idintervento IS NULL + INNER JOIN co_contratti ON co_promemoria.idcontratto = co_contratti.id + INNER JOIN an_anagrafiche ON co_contratti.idanagrafica = an_anagrafiche.idanagrafica + WHERE idintervento IS NULL AND + idcontratto IN (SELECT id FROM co_contratti WHERE idstato IN(SELECT id FROM co_staticontratti WHERE is_pianificabile = 1)) ORDER BY data_richiesta ASC"; + $promemoria_contratti = $dbo->fetchArray($qp); - $rsp = $dbo->fetchArray($qp); + $promemoria_interventi = $dbo->fetchArray("SELECT id, richiesta, id_contratto AS idcontratto, DATE_FORMAT(IF(data_scadenza IS NULL, data_richiesta, data_scadenza),'%m%Y') AS mese, IF(data_scadenza IS NULL, data_richiesta, data_scadenza)AS data_richiesta, data_scadenza, an_anagrafiche.ragione_sociale, 'intervento' AS ref, (SELECT descrizione FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento=in_interventi.idtipointervento) AS tipointervento FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica WHERE (SELECT COUNT(*) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento = in_interventi.id) = 0 ORDER BY data_richiesta ASC"); - $interventi = $dbo->fetchArray("SELECT id, richiesta, id_contratto AS idcontratto, DATE_FORMAT(IF(data_scadenza IS NULL, data_richiesta, data_scadenza),'%m%Y') AS mese, IF(data_scadenza IS NULL, data_richiesta, data_scadenza)AS data_richiesta, data_scadenza, an_anagrafiche.ragione_sociale, 'intervento' AS ref, (SELECT descrizione FROM in_tipiintervento WHERE in_tipiintervento.idtipointervento=in_interventi.idtipointervento) AS tipointervento FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica WHERE (SELECT COUNT(*) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento = in_interventi.id) = 0 ORDER BY data_richiesta ASC"); - - $rsp = array_merge($rsp, $interventi); - - if (!empty($rsp)) { + $promemoria = array_merge($promemoria_contratti, $promemoria_interventi); + if (!empty($promemoria)) { $prev_mese = ''; // Elenco interventi da pianificare - foreach ($rsp as $r) { - if ($r['mese'] == $mese) { - if (date('Ymd', strtotime($r['data_richiesta'])) < date('Ymd')) { + foreach ($promemoria as $sessione) { + if ($sessione['mese'] == $mese) { + if (date('Ymd', strtotime($sessione['data_richiesta'])) < date('Ymd')) { $class = 'danger'; } else { $class = 'primary'; } echo ' -
'.(($r['ref'] == 'intervento') ? '' : '').' - '.$r['ragione_sociale'].'
'.Translator::dateToLocale($r['data_richiesta']).' ('.$r['tipointervento'].')
'.(!empty($r['richiesta']) ? ' - '.$r['richiesta'] : '').'
'.(!empty($r['nomecontratto']) ? '
Contratto: '.$r['nomecontratto'] : ''). - (!empty($r['data_scadenza'] and $r['data_scadenza'] != '0000-00-00 00:00:00') ? '
'.tr('entro il: ').Translator::dateToLocale($r['data_scadenza']).'' : ''). - (($r['ref'] == 'intervento') ? (Modules::link('Interventi', $r['id'], '', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'
' : (Modules::link('Contratti', $r['idcontratto'], '', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'
'). +
'.(($sessione['ref'] == 'intervento') ? '' : '').' + '.$sessione['ragione_sociale'].'
'.Translator::dateToLocale($sessione['data_richiesta']).' ('.$sessione['tipointervento'].')
'.(!empty($sessione['richiesta']) ? ' - '.$sessione['richiesta'] : '').'
'.(!empty($sessione['nomecontratto']) ? '
Contratto: '.$sessione['nomecontratto'] : ''). + (!empty($sessione['data_scadenza'] and $sessione['data_scadenza'] != '0000-00-00 00:00:00') ? '
'.tr('entro il: ').Translator::dateToLocale($sessione['data_scadenza']).'' : ''). + (($sessione['ref'] == 'intervento') ? (Modules::link('Interventi', $sessione['id'], '', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'
' : (Modules::link('Contratti', $sessione['idcontratto'], '', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'
'). '
'; } - } ?> + } + + echo ' - '; } else { echo '
'.tr('Non ci sono interventi da pianificare per questo mese').''; } diff --git a/modules/dashboard/edit.php b/modules/dashboard/edit.php index c6b047313..613381663 100755 --- a/modules/dashboard/edit.php +++ b/modules/dashboard/edit.php @@ -2,289 +2,160 @@ include_once __DIR__.'/../../core.php'; -// Impostazione filtri di default a tutte le selezioni la prima volta -if (!isset($_SESSION['dashboard']['idtecnici'])) { - $rs = $dbo->fetchArray("SELECT an_anagrafiche.idanagrafica AS id FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE deleted_at IS NULL AND descrizione='Tecnico'"); - - $_SESSION['dashboard']['idtecnici'] = ["'-1'"]; - - for ($i = 0; $i < count($rs); ++$i) { - $_SESSION['dashboard']['idtecnici'][] = "'".$rs[$i]['id']."'"; - } -} - -if (!isset($_SESSION['dashboard']['idstatiintervento'])) { - $rs = $dbo->fetchArray('SELECT idstatointervento AS id, descrizione FROM in_statiintervento WHERE deleted_at IS NULL'); - - $_SESSION['dashboard']['idstatiintervento'] = ["'-1'"]; - - for ($i = 0; $i < count($rs); ++$i) { - $_SESSION['dashboard']['idstatiintervento'][] = "'".$rs[$i]['id']."'"; - } -} - -if (!isset($_SESSION['dashboard']['idtipiintervento'])) { - $rs = $dbo->fetchArray('SELECT idtipointervento AS id, descrizione FROM in_tipiintervento'); - - $_SESSION['dashboard']['idtipiintervento'] = ["'-1'"]; - - for ($i = 0; $i < count($rs); ++$i) { - $_SESSION['dashboard']['idtipiintervento'][] = "'".$rs[$i]['id']."'"; - } -} - -if (!isset($_SESSION['dashboard']['idzone'])) { - $rs = $dbo->fetchArray('SELECT id, descrizione FROM an_zone'); - - $_SESSION['dashboard']['idzone'] = ["'-1'"]; - - // "Nessuna zona" di default - $_SESSION['dashboard']['idzone'][] = "'0'"; - - for ($i = 0; $i < count($rs); ++$i) { - $_SESSION['dashboard']['idzone'][] = "'".$rs[$i]['id']."'"; - } -} - -// Stati intervento -$checks = ''; -$count = 0; -$total = 0; - -$rs = $dbo->fetchArray('SELECT idstatointervento AS id, descrizione, colore FROM in_statiintervento WHERE deleted_at IS NULL ORDER BY descrizione ASC'); -$total = count($rs); - -$allchecksstati = ''; -for ($i = 0; $i < count($rs); ++$i) { - $attr = ''; - - foreach ($_SESSION['dashboard']['idstatiintervento'] as $idx => $val) { - if ($val == "'".$rs[$i]['id']."'") { - $attr = 'checked="checked"'; - ++$count; - } - } - - $checks .= "
  • \n"; - - $allchecksstati .= "session_set_array( 'dashboard,idstatiintervento', '".$rs[$i]['id']."', 0 ); "; -} - -if ($count == $total) { - $class = 'btn-success'; -} elseif ($count == 0) { - $class = 'btn-danger'; -} else { - $class = 'btn-warning'; -} - -if ($total == 0) { - $class = 'btn-primary disabled'; -} -?> - +echo '
    - '; } @@ -365,368 +236,377 @@ if ($vista == 'mese') { } else { $def = 'agendaWeek'; } -?> +$modulo_interventi = Modules::get('Interventi'); + +echo ' + url: globals.dashboard.load_url + "&op=interventi_periodo", + type: "GET", + error: function () { + alert(globals.dashboard.error); + } + } + }); + + //calendar.render(); + + globals.dashboard.calendar = calendar; + } +'; + +// Prima selezione globale per tutti i filtri +if (!isset($_SESSION['dashboard']['idtecnici'])) { + $_SESSION['dashboard']['idtecnici'] = ["'-1'"]; + + echo ' +'; +} + +if (!isset($_SESSION['dashboard']['idstatiintervento'])) { + $_SESSION['dashboard']['idstatiintervento'] = ["'-1'"]; + + echo ' +'; +} + +if (!isset($_SESSION['dashboard']['idtipiintervento'])) { + $_SESSION['dashboard']['idtipiintervento'] = ["'-1'"]; + + echo ' +'; +} + +if (!isset($_SESSION['dashboard']['idzone'])) { + $_SESSION['dashboard']['idzone'] = ["'-1'"]; + + echo ' +'; +} diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 685e565e6..95be5b0fe 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -49,6 +49,14 @@ switch (post('op')) { $intervento->codice_cig = post('codice_cig'); $intervento->save(); + // Assegnazione dei tecnici all'intervento + $tecnici_assegnati = (array) post('tecnici_assegnati'); + $dbo->sync('in_interventi_tecnici_assegnati', [ + 'id_intervento' => $id_record, + ], [ + 'id_tecnico' => $tecnici_assegnati, + ]); + // Notifica chiusura intervento $stato = $dbo->selectOne('in_statiintervento', '*', ['idstatointervento' => post('idstatointervento')]); if (!empty($stato['notifica']) && !empty($stato['destinatari']) && $stato['idstatointervento'] != $record['idstatointervento']) { @@ -148,6 +156,14 @@ switch (post('op')) { } } + // Assegnazione dei tecnici all'intervento + $tecnici_assegnati = (array) post('tecnici_assegnati'); + $dbo->sync('in_interventi_tecnici_assegnati', [ + 'id_intervento' => $id_record, + ], [ + 'id_tecnico' => $tecnici_assegnati, + ]); + if (post('ref') == 'dashboard') { flash()->clearMessage('info'); flash()->clearMessage('warning'); diff --git a/modules/interventi/add.php b/modules/interventi/add.php index c8af0c3d1..590a359df 100755 --- a/modules/interventi/add.php +++ b/modules/interventi/add.php @@ -4,15 +4,14 @@ use Modules\Interventi\Intervento; include_once __DIR__.'/../../core.php'; -// Rimuovo session usate sui select combinati (sedi, preventivi, contratti, impianti) +// Rimozione dei parametri di sessione usati sui select combinati (sedi, preventivi, contratti, impianti) unset($_SESSION['superselect']['idanagrafica']); unset($_SESSION['superselect']['idsede']); -// Se ho passato l'idanagrafica, carico il tipo di intervento di default +// Lettura dei parametri di interesse $id_anagrafica = filter('idanagrafica'); $id_sede = filter('idsede'); $richiesta = filter('richiesta'); -$impianti = []; $origine_dashboard = get('ref') !== null; $module_anagrafiche = Modules::get('Anagrafiche'); @@ -148,18 +147,56 @@ if (!empty($id_intervento)) { } echo ' - -
    -
    -

    '.tr('Dati cliente').'

    -
    +
    +
    + {[ "type": "select", "label": "'.tr('Cliente').'", "name": "idanagrafica", "required": 1, "value": "'.$id_anagrafica.'", "ajax-source": "clienti", "icon-after": "add|'.$module_anagrafiche['id'].'|tipoanagrafica=Cliente&readonly_tipo=1", "readonly": "'.(empty($id_anagrafica) ? 0 : 1).'" ]} +
    -
    - +
    + {[ "type": "select", "label": "'.tr('Preventivo').'", "name": "idpreventivo", "value": "'.$id_preventivo.'", "ajax-source": "preventivi", "readonly": "'.(empty($id_contratto) ? 0 : 1).'" ]} +
    + +
    + {[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$id_contratto.'", "ajax-source": "contratti", "readonly": "'.(empty($id_contratto) ? 0 : 1).'" ]} +
    +
    + +
    +
    + {[ "type": "timestamp", "label": "'.tr('Data/ora richiesta').'", "name": "data_richiesta", "required": 1, "value": "'.($data_richiesta ?: '-now-').'" ]} +
    + +
    + {[ "type": "select", "label": "'.tr('Tipo').'", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$id_tipo.'", "ajax-source": "tipiintervento" ]} +
    + +
    + {[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL", "value": "'.$id_stato.'" ]} +
    +
    + +
    +
    + {[ "type": "textarea", "label": "'.tr('Richiesta').'", "name": "richiesta", "required": 1, "value": "'.$richiesta.'", "extra": "style=\'max-height:80px;\'" ]} +
    +
    + + +
    +
    +

    '.tr('Dettagli aggiuntivi').'

    +
    + +
    +
    + +
    -
    - {[ "type": "select", "label": "'.tr('Cliente').'", "name": "idanagrafica", "required": 1, "value": "'.$id_anagrafica.'", "ajax-source": "clienti", "icon-after": "add|'.$module_anagrafiche['id'].'|tipoanagrafica=Cliente&readonly_tipo=1", "readonly": "'.(empty($id_anagrafica) ? 0 : 1).'" ]} -
    +
    + {[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "values": "query=SELECT id, CONCAT_WS(\' - \', nome, descrizione) AS descrizione FROM an_zone ORDER BY nome", "value": "'.$id_zona.'", "placeholder": "'.tr('Nessuna zona').'", "help":"'.tr('La zona viene definita automaticamente in base al cliente selezionato').'.", "extra": "readonly", "value": "'.$id_zona.'" ]} +
    {[ "type": "select", "label": "'.tr('Sede destinazione').'", "name": "idsede_destinazione", "value": "'.$id_sede.'", "ajax-source": "sedi" ]} @@ -170,69 +207,43 @@ echo '
    -
    - {[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "values": "query=SELECT id, CONCAT_WS(\' - \', nome, descrizione) AS descrizione FROM an_zone ORDER BY nome", "value": "'.$id_zona.'", "placeholder": "'.tr('Nessuna zona').'", "help":"'.tr('La zona viene definita automaticamente in base al cliente selezionato').'.", "extra": "readonly", "value": "'.$id_zona.'" ]} + {[ "type": "timestamp", "label": "'.tr('Data/ora scadenza').'", "name": "data_scadenza", "required": 0, "value": "'.$data_scadenza.'" ]}
    -
    - {[ "type": "select", "label": "'.tr('Preventivo').'", "name": "idpreventivo", "value": "'.$id_preventivo.'", "ajax-source": "preventivi", "readonly": "'.(empty($id_contratto) ? 0 : 1).'" ]} -
    - -
    - {[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$id_contratto.'", "ajax-source": "contratti", "readonly": "'.(empty($id_contratto) ? 0 : 1).'" ]} -
    -
    - -
    -
    +
    {[ "type": "select", "label": "'.tr('Impianto').'", "multiple": 1, "name": "idimpianti[]", "value": "'.$impianti_collegati.'", "ajax-source": "impianti-cliente", "icon-after": "add|'.Modules::get('Impianti')['id'].'|source=Attività" ]}
    -
    +
    {[ "type": "select", "label": "'.tr('Componenti').'", "multiple": 1, "name": "componenti[]", "placeholder": "'.tr('Seleziona prima un impianto').'", "ajax-source": "componenti" ]}
    - -
    -
    -

    '.tr('Dati intervento').'

    + +
    +
    +

    '.tr('Assegnazione tecnici').'

    +
    + +
    -
    - -
    -
    - {[ "type": "timestamp", "label": "'.tr('Data/ora richiesta').'", "name": "data_richiesta", "required": 1, "value": "'.($data_richiesta ?: '-now-').'" ]} -
    - -
    - {[ "type": "timestamp", "label": "'.tr('Data/ora scadenza').'", "name": "data_scadenza", "required": 0, "value": "'.$data_scadenza.'" ]} -
    - -
    - {[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$id_tipo.'", "ajax-source": "tipiintervento" ]} -
    - -
    - {[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL", "value": "'.$id_stato.'" ]} -
    -
    - - -
    +
    +
    - {[ "type": "textarea", "label": "'.tr('Richiesta').'", "name": "richiesta", "required": 1, "value": "'.$richiesta.'", "extra": "style=\'max-height:80px;\'" ]} + {[ "type": "select", "label": "'.tr('Tecnici assegnati').'", "multiple": "1", "name": "tecnici_assegnati[]", "ajax-source": "tecnici", "value": "", "icon-after": "add|'.$module_anagrafiche['id'].'|tipoanagrafica=Tecnico" ]}
    -
    -
    +
    +
    - +

    '.tr('Ore di lavoro').'

    @@ -284,14 +295,12 @@ if (!empty($id_intervento)) { input("idimpianti").disable(); input("componenti").disable(); input("idanagrafica").disable(); - input("idanagrafica").find("button").disable(); input("idclientefinale").disable(); input("idzona").disable(); input("idtipointervento").disable(); input("idstatointervento").disable(); input("richiesta").disable(); input("data_richiesta").disable(); - input("impianti").find("button").disable(); }); '; } @@ -305,7 +314,6 @@ if (!empty($id_contratto) && !empty($id_promemoria_contratto)) { input("idclientefinale").disable(); input("idzona").disable(); input("idtipointervento").disable(); - input("impianti").find("button").disable(); }); '; } @@ -349,8 +357,8 @@ echo ' updateSelectOption("idanagrafica", $(this).val()); session_set("superselect,idanagrafica", $(this).val(), 0); - var value = !$(this).val(); - var placeholder = value ? "'.tr('Seleziona prima un cliente').'" : "'.tr("Seleziona un'opzione").'"; + let value = !$(this).val(); + let placeholder = value ? "'.tr('Seleziona prima un cliente').'" : "'.tr("Seleziona un'opzione").'"; sede.setDisabled(value) .getElement().selectReset(placeholder); @@ -370,7 +378,7 @@ echo ' // Impostazione del tipo intervento da anagrafica input("idtipointervento").getElement() - .selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione); + .selectSetNew(data.idtipointervento, data.idtipointervento_descrizione); } }); @@ -452,7 +460,9 @@ if (filter('orario_fine') !== null) { } // Submit dinamico tramite AJAX - let valid = await salvaForm(button, "#add-form"); + let valid = await salvaForm(button, "#add-form", { + id_module: "'.$id_module.'", // Fix creazione da Dashboard + }); if (!valid) return; // Se l\'aggiunta intervento proviene dalla scheda di pianificazione ordini di servizio della dashboard, la ricarico diff --git a/modules/interventi/edit.php b/modules/interventi/edit.php index 32b6dcccd..1453c2491 100755 --- a/modules/interventi/edit.php +++ b/modules/interventi/edit.php @@ -3,6 +3,7 @@ include_once __DIR__.'/../../core.php'; $block_edit = $record['flag_completato']; +$module_anagrafiche = Modules::get('Anagrafiche'); unset($_SESSION['superselect']['idanagrafica']); unset($_SESSION['superselect']['idsede_partenza']); @@ -125,6 +126,16 @@ $_SESSION['superselect']['permetti_movimento_a_zero'] = false;
    {[ "type": "select", "label": "", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL", "value": "$idstatointervento$", "class": "unblockable" ]}
    +fetchArray('SELECT id_tecnico FROM in_interventi_tecnici_assegnati WHERE id_intervento = '.prepare($id_record)); +$tecnici_assegnati = array_column($tecnici_assegnati, 'id_tecnico'); +echo ' +
    + {[ "type": "select", "label": "'.tr('Tecnici assegnati').'", "multiple": "1", "name": "tecnici_assegnati[]", "ajax-source": "tecnici", "value": "'.implode(',', $tecnici_assegnati).'", "icon-after": "add|'.$module_anagrafiche['id'].'|tipoanagrafica=Tecnico" ]} +
    '; + +?>
    diff --git a/update/2_4_17.sql b/update/2_4_17.sql index bfa4c2596..afd752b08 100644 --- a/update/2_4_17.sql +++ b/update/2_4_17.sql @@ -153,8 +153,8 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione` -- Impostazioni relative gli stati delle Attività UPDATE `zz_settings` SET `sezione` = 'Attività' WHERE `sezione` = 'Interventi'; INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES -(NULL, 'Stato dell''attività alla chiusura', '1', 'query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento WHERE is_completato = 1', (SELECT idstatointervento AS id FROM in_statiintervento WHERE codice = 'OK'), 'Attività', 1, 'Stato in cui spostare l''attitivà a seguito della chiusura'), -(NULL, 'Stato dell''attività dopo la firma', '1', 'query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento WHERE is_completato = 1', (SELECT idstatointervento AS id FROM in_statiintervento WHERE codice = 'OK'), 'Attività', 2, 'Stato in cui spostare l''attitivà dopo la firma del cliente'); +(NULL, 'Stato dell''attività alla chiusura', (SELECT idstatointervento AS id FROM in_statiintervento WHERE codice = 'OK'), 'query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento WHERE is_completato = 1', '1', 'Attività', 1, 'Stato in cui spostare l''attitivà a seguito della chiusura'), +(NULL, 'Stato dell''attività dopo la firma', (SELECT idstatointervento AS id FROM in_statiintervento WHERE codice = 'OK'), 'query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento WHERE is_completato = 1', '1', 'Attività', 2, 'Stato in cui spostare l''attitivà dopo la firma del cliente'); -- Aggiunta risorsa per il download degli allegati INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`) VALUES (NULL, 'v1', 'retrieve', 'allegato', 'API\\Common\\Allegato', '1'); @@ -222,3 +222,7 @@ UPDATE `co_promemoria` SET `data_richiesta` = NULL WHERE `data_richiesta` = '000 UPDATE `co_preventivi` SET `data_rifiuto` = NULL WHERE `data_rifiuto` = '0000-00-00' OR `data_rifiuto` = '0000-00-00 00:00:00'; UPDATE `co_contratti` SET `data_rifiuto` = NULL WHERE `data_rifiuto` = '0000-00-00' OR `data_rifiuto` = '0000-00-00 00:00:00'; UPDATE `my_impianto_componenti` SET `data_sostituzione` = NULL WHERE `data_sostituzione` = '0000-00-00' OR `data_sostituzione` = '0000-00-00 00:00:00'; + +-- Impostazioni per i tecnici assegnati delle Attività +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES +(NULL, 'Mostra promemoria attività ai soli Tecnici assegnati', '1', 'boolean', '1', 'Attività', 14);