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>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$("#idanagrafica_add").change(function () {
|
$("#idanagrafica_add").change(function () {
|
||||||
var data = $(this).selectData();
|
let data = $(this).selectData();
|
||||||
|
|
||||||
if (data !== undefined) {
|
if (data !== undefined) {
|
||||||
if (!data.id){
|
if (!data.id){
|
||||||
|
@ -107,7 +107,7 @@ $(document).ready(function () {
|
||||||
if (results.length === 0){
|
if (results.length === 0){
|
||||||
$("#info-content").html("<p>'.tr('Nessuna fattura in stato Bozza presente per il cliente corrente').'</p>")
|
$("#info-content").html("<p>'.tr('Nessuna fattura in stato Bozza presente per il cliente corrente').'</p>")
|
||||||
} else {
|
} else {
|
||||||
var content = "";
|
let content = "";
|
||||||
|
|
||||||
results.forEach(function(item) {
|
results.forEach(function(item) {
|
||||||
content += "<li>" + item + "</li>";
|
content += "<li>" + item + "</li>";
|
||||||
|
|
|
@ -403,7 +403,7 @@ switch (post('op')) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'firma':
|
case 'firma':
|
||||||
if (directory($docroot.'/files/interventi')) {
|
if (directory(DOCROOT.'/files/interventi')) {
|
||||||
if (post('firma_base64') != '') {
|
if (post('firma_base64') != '') {
|
||||||
// Salvataggio firma
|
// Salvataggio firma
|
||||||
$firma_file = 'firma_'.time().'.jpg';
|
$firma_file = 'firma_'.time().'.jpg';
|
||||||
|
@ -416,7 +416,7 @@ switch (post('op')) {
|
||||||
$constraint->aspectRatio();
|
$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!'));
|
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))) {
|
} 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!'));
|
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').'" ]}
|
{[ "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>
|
</div>
|
||||||
|
|
||||||
|
<div id="info-conflitti"></div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -358,6 +361,10 @@ echo '
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
input("idtecnico").change(function() {
|
||||||
|
calcolaConflittiTecnici();
|
||||||
|
});
|
||||||
|
|
||||||
// Gestione della modifica dell\'anagrafica
|
// Gestione della modifica dell\'anagrafica
|
||||||
anagrafica.change(function() {
|
anagrafica.change(function() {
|
||||||
updateSelectOption("idanagrafica", $(this).val());
|
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.'");
|
//$("#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>';
|
</script>';
|
||||||
|
|
|
@ -198,9 +198,14 @@ if (!empty($sessioni)) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
echo '
|
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) {
|
if (!$is_completato) {
|
||||||
echo '
|
echo '
|
||||||
<!-- AGGIUNTA TECNICO -->
|
<!-- AGGIUNTA TECNICO -->
|
||||||
|
@ -236,12 +241,38 @@ async function modificaSessione(button) {
|
||||||
$(button).tooltipster("close");
|
$(button).tooltipster("close");
|
||||||
|
|
||||||
// Apertura modal
|
// 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)) {
|
if (empty($sessioni)) {
|
||||||
echo '
|
echo '
|
||||||
$(".btn-details").attr("disabled", true);
|
$(".btn-details").attr("disabled", true);
|
||||||
|
@ -274,8 +305,10 @@ echo '
|
||||||
},
|
},
|
||||||
type: "post",
|
type: "post",
|
||||||
success: function() {
|
success: function() {
|
||||||
$("#tecnici").load("'.$module->fileurl('ajax_tecnici.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
caricaTecnici();
|
||||||
$("#costi").load("'.$module->fileurl('ajax_costi.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
calcolaCosti();
|
||||||
|
|
||||||
|
calcolaConflittiTecnici();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -295,8 +328,10 @@ echo '
|
||||||
},
|
},
|
||||||
type: "post",
|
type: "post",
|
||||||
success: function() {
|
success: function() {
|
||||||
$("#tecnici").load("'.$module->fileurl('ajax_tecnici.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
caricaTecnici();
|
||||||
$("#costi").load("'.$module->fileurl('ajax_costi.php').'?id_module=" + globals.id_module + "&id_record=" + globals.id_record);
|
calcolaCosti();
|
||||||
|
|
||||||
|
calcolaConflittiTecnici();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ function duplicaIntervento() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function anteprimaFirma() {
|
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>';
|
</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
|
<?php
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../../core.php';
|
||||||
|
|
||||||
if (get('anteprima') !== null) {
|
if (get('anteprima') !== null) {
|
||||||
// Lettura dati intervento
|
// Lettura dati intervento
|
||||||
|
@ -13,7 +13,7 @@ if (get('anteprima') !== null) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gestione della stampa
|
// Gestione della stampa
|
||||||
$directory = $docroot.'/files/interventi/';
|
$directory = DOCROOT.'/files/interventi/';
|
||||||
$id_print = setting('Stampa per anteprima e firma');
|
$id_print = setting('Stampa per anteprima e firma');
|
||||||
|
|
||||||
// HTML per la visualizzazione
|
// 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
|
<?php
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
|
||||||
include_once __DIR__.'/../../../core.php';
|
include_once __DIR__.'/../../../core.php';
|
||||||
|
include_once __DIR__.'/../../../../core.php';
|
||||||
|
|
||||||
$show_costi = true;
|
$show_costi = true;
|
||||||
// Limitazione delle azioni dei tecnici
|
// Limitazione delle azioni dei tecnici
|
|
@ -15,6 +15,8 @@ use Modules\Interventi\Intervento;
|
||||||
* Recupera il totale delle ore spese per un intervento.
|
* Recupera il totale delle ore spese per un intervento.
|
||||||
*
|
*
|
||||||
* @param int $id_intervento
|
* @param int $id_intervento
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
function get_ore_intervento($id_intervento)
|
function get_ore_intervento($id_intervento)
|
||||||
{
|
{
|
||||||
|
@ -84,6 +86,8 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
|
||||||
* @param string $orario_fine
|
* @param string $orario_fine
|
||||||
*
|
*
|
||||||
* @return float
|
* @return float
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
function calcola_ore_intervento($orario_inizio, $orario_fine)
|
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