openstamanager/modules/interventi/occupazione_tecnici.php

143 lines
5.1 KiB
PHP

<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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) || setting('Alert occupazione tecnici') != 1) {
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="card card-danger">
<div class="card-header">
<h3 class="card-title">'.tr('⚠️ Sono presenti dei conflitti con le sessioni di lavoro di alcuni tecnici').'</h3>
</div>
<div class="card-body">
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>'.tr('Tecnico').'</th>
<th>'.tr('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>Attività corrente</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>'.$anagrafica_tecnico['ragione_sociale'].' '.(!empty($anagrafica_tecnico['deleted_at']) ? '<small class="text-danger">('.tr('Eliminato').')' : '').'</td>
<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>
</div>';