Aggiunta avviso su conflitti di occupazione tecnici in Attività

This commit is contained in:
Thomas Zilio 2020-08-17 09:47:18 +02:00
parent 150474a88c
commit 6a02fb7270
9 changed files with 227 additions and 51 deletions

View File

@ -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>";

View File

@ -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!'));

View File

@ -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>';

View File

@ -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>';

View File

@ -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>';

View 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

View 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

View File

@ -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)
{

View File

@ -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>';