143 lines
5.1 KiB
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-sm 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>';
|