Aggiunta avviso su conflitti di occupazione tecnici in Attività
This commit is contained in:
parent
150474a88c
commit
6a02fb7270
|
@ -84,7 +84,7 @@ if ($dir == 'entrata') {
|
|||
<script>
|
||||
$(document).ready(function () {
|
||||
$("#idanagrafica_add").change(function () {
|
||||
var data = $(this).selectData();
|
||||
let data = $(this).selectData();
|
||||
|
||||
if (data !== undefined) {
|
||||
if (!data.id){
|
||||
|
@ -107,7 +107,7 @@ $(document).ready(function () {
|
|||
if (results.length === 0){
|
||||
$("#info-content").html("<p>'.tr('Nessuna fattura in stato Bozza presente per il cliente corrente').'</p>")
|
||||
} else {
|
||||
var content = "";
|
||||
let content = "";
|
||||
|
||||
results.forEach(function(item) {
|
||||
content += "<li>" + item + "</li>";
|
||||
|
|
|
@ -403,7 +403,7 @@ switch (post('op')) {
|
|||
break;
|
||||
|
||||
case 'firma':
|
||||
if (directory($docroot.'/files/interventi')) {
|
||||
if (directory(DOCROOT.'/files/interventi')) {
|
||||
if (post('firma_base64') != '') {
|
||||
// Salvataggio firma
|
||||
$firma_file = 'firma_'.time().'.jpg';
|
||||
|
@ -416,7 +416,7 @@ switch (post('op')) {
|
|||
$constraint->aspectRatio();
|
||||
});
|
||||
|
||||
if (!$img->save($docroot.'/files/interventi/'.$firma_file)) {
|
||||
if (!$img->save(DOCROOT.'/files/interventi/'.$firma_file)) {
|
||||
flash()->error(tr('Impossibile creare il file!'));
|
||||
} elseif ($dbo->query('UPDATE in_interventi SET firma_file='.prepare($firma_file).', firma_data=NOW(), firma_nome = '.prepare($firma_nome).', idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE codice = \'OK\') WHERE id='.prepare($id_record))) {
|
||||
flash()->info(tr('Firma salvata correttamente!'));
|
||||
|
|
|
@ -276,6 +276,9 @@ echo '
|
|||
{[ "type": "select", "label": "'.tr('Tecnici').'", "multiple": "1", "name": "idtecnico[]", "required": '.($origine_dashboard ? 1 : 0).', "ajax-source": "tecnici", "value": "'.$id_tecnico.'", "icon-after": "add|'.$module_anagrafiche['id'].'|tipoanagrafica=Tecnico||'.(empty($id_tecnico) ? '' : 'disabled').'" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="info-conflitti"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -358,6 +361,10 @@ echo '
|
|||
}
|
||||
});
|
||||
|
||||
input("idtecnico").change(function() {
|
||||
calcolaConflittiTecnici();
|
||||
});
|
||||
|
||||
// Gestione della modifica dell\'anagrafica
|
||||
anagrafica.change(function() {
|
||||
updateSelectOption("idanagrafica", $(this).val());
|
||||
|
@ -488,4 +495,15 @@ if (filter('orario_fine') !== null) {
|
|||
//$("#elenco_interventi > tbody").load(globals.rootdir + "/modules/contratti/plugins/contratti.pianificazioneinterventi.php?op=get_interventi_pianificati&idcontratto='.$id_contratto.'");
|
||||
}
|
||||
}
|
||||
|
||||
function calcolaConflittiTecnici() {
|
||||
let tecnici = input("idtecnico").get();
|
||||
|
||||
return $("#info-conflitti").load("'.$module->fileurl('occupazione_tecnici.php').'", {
|
||||
"id_module": globals.id_module,
|
||||
"tecnici[]": tecnici,
|
||||
"inizio": input("orario_inizio").get(),
|
||||
"fine": input("orario_fine").get(),
|
||||
});
|
||||
}
|
||||
</script>';
|
||||
|
|
|
@ -198,9 +198,14 @@ if (!empty($sessioni)) {
|
|||
}
|
||||
} else {
|
||||
echo '
|
||||
<div class=\'alert alert-info\' ><i class=\'fa fa-info-circle\'></i> '.tr('Nessun tecnico assegnato').'.</div>';
|
||||
<div class="alert alert-info">
|
||||
<i class="fa fa-info-circle"></i> '.tr('Nessun tecnico assegnato').'.
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<div id="info-conflitti"></div>';
|
||||
|
||||
if (!$is_completato) {
|
||||
echo '
|
||||
<!-- AGGIUNTA TECNICO -->
|
||||
|
@ -236,69 +241,99 @@ async function modificaSessione(button) {
|
|||
$(button).tooltipster("close");
|
||||
|
||||
// Apertura modal
|
||||
openModal("'.tr('Modifica sessione').'", "'.$module->fileurl('manage_sessione.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&id_sessione=" + id);
|
||||
openModal("'.tr('Modifica sessione').'", "'.$module->fileurl('modals/manage_sessione.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&id_sessione=" + id);
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {';
|
||||
function caricaTecnici() {
|
||||
return $("#tecnici").load("'.$module->fileurl('ajax_tecnici.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
}
|
||||
|
||||
function calcolaConflittiTecnici() {
|
||||
let tecnici = [input("nuovotecnico").get()];
|
||||
let inizio = moment().startOf("hour");
|
||||
|
||||
return $("#info-conflitti").load("'.$module->fileurl('occupazione_tecnici.php').'", {
|
||||
"id_module": globals.id_module,
|
||||
"id_record": globals.id_record,
|
||||
"tecnici[]": tecnici,
|
||||
"inizio": inizio.format("YYYY-MM-DD HH:mm:ss"),
|
||||
"fine": inizio.add(1, "hours").format("YYYY-MM-DD HH:mm:ss"),
|
||||
});
|
||||
}
|
||||
|
||||
function calcolaCosti() {
|
||||
return $("#costi").load("'.$module->fileurl('ajax_costi.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
}
|
||||
|
||||
input("nuovotecnico").change(function() {
|
||||
calcolaConflittiTecnici();
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
calcolaConflittiTecnici();
|
||||
';
|
||||
if (empty($sessioni)) {
|
||||
echo '
|
||||
$(".btn-details").attr("disabled", true);
|
||||
$(".btn-details").addClass("disabled");
|
||||
$("#showall_dettagli").removeClass("hide");
|
||||
$("#dontshowall_dettagli").addClass("hide");';
|
||||
$(".btn-details").attr("disabled", true);
|
||||
$(".btn-details").addClass("disabled");
|
||||
$("#showall_dettagli").removeClass("hide");
|
||||
$("#dontshowall_dettagli").addClass("hide");';
|
||||
} else {
|
||||
echo '
|
||||
$(".btn-details").attr("disabled", false);
|
||||
$(".btn-details").removeClass("disabled");';
|
||||
$(".btn-details").attr("disabled", false);
|
||||
$(".btn-details").removeClass("disabled");';
|
||||
}
|
||||
|
||||
echo '
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
* Aggiunge una nuova riga per la sessione di lavoro in base al tecnico selezionato.
|
||||
*/
|
||||
function add_tecnici(id_tecnico) {
|
||||
/*
|
||||
* Aggiunge una nuova riga per la sessione di lavoro in base al tecnico selezionato.
|
||||
*/
|
||||
function add_tecnici(id_tecnico) {
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
beforeSubmit: function(arr, $form, options) {
|
||||
return $form.parsley().validate();
|
||||
},
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
id_record: globals.id_record,
|
||||
op: "add_sessione",
|
||||
id_tecnico: id_tecnico,
|
||||
},
|
||||
type: "post",
|
||||
success: function() {
|
||||
caricaTecnici();
|
||||
calcolaCosti();
|
||||
|
||||
calcolaConflittiTecnici();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Rimuove la sessione di lavoro dall\'intervento.
|
||||
*/
|
||||
function elimina_sessione(id_sessione) {
|
||||
if (confirm("Eliminare sessione di lavoro?")) {
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
beforeSubmit: function(arr, $form, options) {
|
||||
return $form.parsley().validate();
|
||||
},
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
id_record: globals.id_record,
|
||||
op: "add_sessione",
|
||||
id_tecnico: id_tecnico,
|
||||
op: "delete_sessione",
|
||||
id_sessione: id_sessione,
|
||||
},
|
||||
type: "post",
|
||||
success: function() {
|
||||
$("#tecnici").load("'.$module->fileurl('ajax_tecnici.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
$("#costi").load("'.$module->fileurl('ajax_costi.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
caricaTecnici();
|
||||
calcolaCosti();
|
||||
|
||||
calcolaConflittiTecnici();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Rimuove la sessione di lavoro dall\'intervento.
|
||||
*/
|
||||
function elimina_sessione(id_sessione) {
|
||||
if (confirm("Eliminare sessione di lavoro?")) {
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
id_record: globals.id_record,
|
||||
op: "delete_sessione",
|
||||
id_sessione: id_sessione,
|
||||
},
|
||||
type: "post",
|
||||
success: function() {
|
||||
$("#tecnici").load("'.$module->fileurl('ajax_tecnici.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
$("#costi").load("'.$module->fileurl('ajax_costi.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>';
|
||||
|
|
|
@ -33,7 +33,7 @@ function duplicaIntervento() {
|
|||
}
|
||||
|
||||
function anteprimaFirma() {
|
||||
openModal("'.tr('Anteprima e firma').'", "'.$module->fileurl('add_firma.php').'?id_module='.$id_module.'&id_record='.$id_record.'&anteprima=1");
|
||||
openModal("'.tr('Anteprima e firma').'", "'.$module->fileurl('modals/anteprima_firma.php').'?id_module='.$id_module.'&id_record='.$id_record.'&anteprima=1");
|
||||
}
|
||||
</script>';
|
||||
|
||||
|
|
4
modules/interventi/add_firma.php → modules/interventi/modals/anteprima_firma.php
Executable file → Normal file
4
modules/interventi/add_firma.php → modules/interventi/modals/anteprima_firma.php
Executable file → Normal file
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
include_once __DIR__.'/../../../core.php';
|
||||
|
||||
if (get('anteprima') !== null) {
|
||||
// Lettura dati intervento
|
||||
|
@ -13,7 +13,7 @@ if (get('anteprima') !== null) {
|
|||
}
|
||||
|
||||
// Gestione della stampa
|
||||
$directory = $docroot.'/files/interventi/';
|
||||
$directory = DOCROOT.'/files/interventi/';
|
||||
$id_print = setting('Stampa per anteprima e firma');
|
||||
|
||||
// HTML per la visualizzazione
|
2
modules/interventi/manage_sessione.php → modules/interventi/modals/manage_sessione.php
Executable file → Normal file
2
modules/interventi/manage_sessione.php → modules/interventi/modals/manage_sessione.php
Executable file → Normal file
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
include_once __DIR__.'/../../../core.php';
|
||||
include_once __DIR__.'/../../../../core.php';
|
||||
|
||||
$show_costi = true;
|
||||
// Limitazione delle azioni dei tecnici
|
|
@ -15,6 +15,8 @@ use Modules\Interventi\Intervento;
|
|||
* Recupera il totale delle ore spese per un intervento.
|
||||
*
|
||||
* @param int $id_intervento
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
function get_ore_intervento($id_intervento)
|
||||
{
|
||||
|
@ -84,6 +86,8 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
|
|||
* @param string $orario_fine
|
||||
*
|
||||
* @return float
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
function calcola_ore_intervento($orario_inizio, $orario_fine)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
<?php
|
||||
|
||||
use Modules\Interventi\Intervento;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$tecnici = [];
|
||||
if (!empty($id_record)) {
|
||||
$documento = Intervento::find($id_record);
|
||||
$sessioni = $documento->sessioni;
|
||||
|
||||
foreach ($sessioni as $sessione) {
|
||||
$id_tecnico = $sessione->idtecnico;
|
||||
$inizio = $sessione->orario_inizio;
|
||||
$fine = $sessione->orario_fine;
|
||||
if (!isset($tecnici[$id_tecnico])) {
|
||||
$tecnici[$id_tecnico] = [];
|
||||
}
|
||||
|
||||
$tecnici[$id_tecnico][] = [
|
||||
'inizio' => $inizio,
|
||||
'fine' => $fine,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Lettura dei dati da URL
|
||||
$tecnici_selezionati = filter('tecnici');
|
||||
if (!empty($tecnici_selezionati)) {
|
||||
$inizio = filter('inizio');
|
||||
$fine = filter('fine');
|
||||
|
||||
foreach ($tecnici_selezionati as $id_tecnico) {
|
||||
if (empty($id_tecnico)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($tecnici[$id_tecnico])) {
|
||||
$tecnici[$id_tecnico] = [];
|
||||
}
|
||||
|
||||
$tecnici[$id_tecnico][] = [
|
||||
'inizio' => $inizio,
|
||||
'fine' => $fine,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Blocco dei controlli se non sono presenti tecnici
|
||||
if (empty($tecnici)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Individuazione dei conflitti con altri interventi
|
||||
$elenco_conflitti = [];
|
||||
foreach ($tecnici as $id_tecnico => $ore) {
|
||||
$query = 'SELECT idintervento, orario_inizio, orario_fine FROM in_interventi_tecnici WHERE idtecnico = '.prepare($id_tecnico).($id_record ? ' AND idintervento != '.prepare($id_record) : '');
|
||||
|
||||
// Conflitti ristretti per orario
|
||||
foreach ($ore as $orario) {
|
||||
$query_conflitto = $query.' AND (orario_inizio > '.prepare($orario['inizio']).' AND orario_inizio < '.prepare($orario['fine']).') OR
|
||||
(orario_fine > '.prepare($orario['inizio']).' AND orario_fine < '.prepare($orario['fine']).') OR
|
||||
(orario_inizio < '.prepare($orario['inizio']).' AND orario_fine > '.prepare($orario['inizio']).') OR
|
||||
(orario_inizio < '.prepare($orario['fine']).' AND orario_fine > '.prepare($orario['fine']).')';
|
||||
|
||||
$conflitto = $database->fetchArray($query_conflitto);
|
||||
if (!empty($conflitto)) {
|
||||
$elenco_conflitti[$id_tecnico][] = [
|
||||
'inizio' => $orario['inizio'],
|
||||
'fine' => $orario['fine'],
|
||||
'conflitti' => $conflitto,
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($elenco_conflitti)) {
|
||||
return;
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<p>'.tr('Sono presenti dei conflitti con le sessioni di lavoro di alcuni tecnici').'.</p>
|
||||
|
||||
<table class="table table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Tecnico/attività').'</th>
|
||||
<th>'.tr('Orario di conflitto').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>';
|
||||
|
||||
foreach ($elenco_conflitti as $id_tecnico => $elenco_conflitti_tecnico) {
|
||||
$anagrafica_tecnico = $database->fetchOne('SELECT ragione_sociale, deleted_at FROM an_anagrafiche WHERE idanagrafica = '.prepare($id_tecnico));
|
||||
|
||||
foreach ($elenco_conflitti_tecnico as $conflitto) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$anagrafica_tecnico['ragione_sociale'].' '.(!empty($anagrafica_tecnico['deleted_at']) ? '<small class="text-danger">('.tr('Eliminato').')' : '').'</td>
|
||||
<td>'.timestampFormat($conflitto['inizio']).' - '.timestampFormat($conflitto['fine']).'</td>
|
||||
</tr>';
|
||||
|
||||
foreach ($conflitto['conflitti'] as $conflitto_intervento) {
|
||||
$intervento = Intervento::find($conflitto_intervento['idintervento']);
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.Modules::link('Interventi', $intervento->id, $intervento->getReference()).'</td>
|
||||
<td>'.timestampFormat($conflitto_intervento['orario_inizio']).' - '.timestampFormat($conflitto_intervento['orario_fine']).'</td>
|
||||
</tr>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>
|
||||
</div>';
|
Loading…
Reference in New Issue