openstamanager/plugins/pianificazione_interventi/actions.php

286 lines
11 KiB
PHP
Executable File

<?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/>.
*/
include_once __DIR__.'/../../core.php';
use Carbon\Carbon;
use Carbon\CarbonInterval;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Contratti\Contratto;
use Modules\Interventi\Intervento;
use Modules\Interventi\Stato;
use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\PianificazioneInterventi\Components\Articolo;
use Plugins\PianificazioneInterventi\Components\Riga;
use Plugins\PianificazioneInterventi\Promemoria;
$operazione = filter('op');
// Pianificazione intervento
switch ($operazione) {
case 'add-promemoria':
$contratto = Contratto::find($id_parent);
$tipo = TipoSessione::find(filter('idtipointervento'));
$promemoria = Promemoria::build($contratto, $tipo, filter('data_richiesta'));
echo $promemoria->id;
break;
case 'edit-promemoria':
$dbo->update('co_promemoria', [
'data_richiesta' => post('data_richiesta'),
'idtipointervento' => post('idtipointervento'),
'richiesta' => post('richiesta'),
'idimpianti' => implode(',', post('idimpianti') ?: []),
'idsede' => post('idsede_c') ?: 0,
'data_scadenza' => post('data_scadenza') ?: null,
'idtecnici' => implode(',', post('idtecnici') ?: []),
], ['id' => $id_record]);
flash()->info(tr('Promemoria inserito!'));
break;
// Eliminazione pianificazione
case 'delete-promemoria':
$id = post('id');
$dbo->query('DELETE FROM `co_promemoria` WHERE id='.prepare($id));
$dbo->query('DELETE FROM `co_righe_promemoria` WHERE id_promemoria='.prepare($id));
flash()->info(tr('Pianificazione eliminata!'));
break;
// Eliminazione tutti i promemoria di questo contratto con non hanno l'intervento associato
case 'delete-non-associati':
$dbo->query('DELETE FROM `co_righe_promemoria` WHERE id_promemoria IN (SELECT id FROM `co_promemoria` WHERE idcontratto = :id_contratto AND idintervento IS NULL)', [
':id_contratto' => $id_record,
]);
$dbo->query('DELETE FROM `co_promemoria` WHERE idcontratto = :id_contratto AND idintervento IS NULL', [
':id_contratto' => $id_record,
]);
flash()->info(tr('Tutti i promemoria non associati sono stati eliminati!'));
break;
// Pianificazione ciclica
case 'pianificazione':
$intervallo = post('intervallo');
$data_inizio = post('data_inizio');
$count = 0;
$count_interventi = 0;
$count_promemoria = 0;
$date_con_promemoria = [];
$date_con_intervento = [];
if (post('pianifica_promemoria')) {
$promemoria_originale = Promemoria::find($id_record);
$contratto = $promemoria_originale->contratto;
// Promemoria del contratto raggruppati per data
$promemoria_contratto = $contratto->promemoria()
->where('idtipointervento', $promemoria_originale->tipo->id)
->get()
->groupBy(fn ($item) => $item->data_richiesta->toDateString());
$date_preimpostate = $promemoria_contratto->keys()->toArray();
$data_conclusione = $contratto->data_conclusione;
$data_inizio = new Carbon($data_inizio);
$data_richiesta = $data_inizio->copy();
$interval = CarbonInterval::make($intervallo.' days');
$stato = Stato::where('codice', 'WIP')->first(); // Stato "In programmazione"
// Ciclo partendo dalla data_richiesta fino alla data conclusione del contratto
while ($data_richiesta->lessThanOrEqualTo($data_conclusione)) {
// Creazione ciclica del promemoria se non ne esiste uno per la data richiesta
$data_promemoria = $data_richiesta->format('Y-m-d');
if (!in_array($data_promemoria, $date_preimpostate)) {
$promemoria_corrente = $promemoria_originale->replicate();
$promemoria_corrente->data_richiesta = $data_richiesta;
$promemoria_corrente->idintervento = null;
$promemoria_corrente->save();
// Copia delle righe
$righe = $promemoria_originale->getRighe();
foreach ($righe as $riga) {
$copia = $riga->replicate();
$copia->setDocument($promemoria_corrente);
$copia->save();
}
// Copia degli allegati
$allegati = $promemoria_originale->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $allegato->id_module,
'id_plugin' => $allegato->id_plugin,
'id_record' => $promemoria_corrente->id,
]);
}
++$count_promemoria;
} else {
$promemoria_corrente = $promemoria_contratto[$data_promemoria]->first();
$date_con_promemoria[] = dateFormat($data_promemoria);
}
// Creazione intervento collegato se non presente
if (post('pianifica_intervento') && empty($promemoria->intervento)) {
// Creazione intervento
$intervento = Intervento::build($contratto->anagrafica, $promemoria_originale->tipo, $stato, $data_richiesta, post('id_segment'));
$intervento->idsede_destinazione = $promemoria_corrente->idsede ?: 0;
$intervento->richiesta = $promemoria_corrente->richiesta;
$intervento->idclientefinale = post('idclientefinale') ?: 0;
$intervento->id_contratto = $contratto->id;
$intervento->save();
// Aggiungo i tecnici selezionati
$idtecnici = post('idtecnico');
foreach ($idtecnici as $idtecnico) {
add_tecnico($intervento->id, $idtecnico, $data_promemoria.' '.post('orario_inizio'), $data_promemoria.' '.post('orario_fine'));
}
// Copia delle informazioni del promemoria
$promemoria_corrente->pianifica($intervento);
++$count_interventi;
} elseif (post('pianifica_intervento')) {
$date_con_intervento[] = dateFormat($data_promemoria);
}
// Calcolo nuova data richiesta, non considero l'intervallo al primo ciclo
$data_richiesta = $data_richiesta->add($interval);
++$count;
}
}
if ($count == 0) {
flash()->warning(tr('Nessun promemoria pianificato'));
} else {
flash()->info(tr('Sono stati creati _NUM_ promemoria!', [
'_NUM_' => $count_promemoria,
]));
if (!empty($date_con_promemoria)) {
flash()->warning(tr('Le seguenti date presentano già un promemoria pianificato: _LIST_', [
'_LIST_' => implode(', ', $date_con_promemoria),
]));
}
if (post('pianifica_intervento')) {
flash()->info(tr('Sono stati pianificati _NUM_ interventi!', [
'_NUM_' => $count_interventi,
]));
if (!empty($date_con_intervento)) {
flash()->warning(tr('I promemoria delle seguenti date presentano già un intervento collegato: _LIST_', [
'_LIST_' => implode(', ', $date_con_intervento),
]));
}
}
}
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));
} else {
$originale = ArticoloOriginale::find(post('idarticolo'));
$articolo = Articolo::build($promemoria, $originale);
$articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null;
}
$qta = post('qta');
$articolo->descrizione = post('descrizione');
$articolo->um = post('um') ?: null;
$articolo->costo_unitario = post('costo_unitario') ?: 0;
$articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva'));
$articolo->setSconto(post('sconto'), post('tipo_sconto'));
try {
$articolo->qta = $qta;
} catch (UnexpectedValueException) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}
$articolo->save();
if (post('idriga') != null) {
flash()->info(tr('Articolo modificato!'));
} else {
flash()->info(tr('Articolo aggiunto!'));
}
break;
case 'manage_riga':
if (post('idriga') != null) {
$riga = Riga::find(post('idriga'));
} else {
$riga = Riga::build($promemoria);
}
$qta = post('qta');
$riga->descrizione = post('descrizione');
$riga->um = post('um') ?: null;
$riga->costo_unitario = post('costo_unitario') ?: 0;
$riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva'));
$riga->setSconto(post('sconto'), post('tipo_sconto'));
$riga->qta = $qta;
$riga->save();
if (post('idriga') != null) {
flash()->info(tr('Riga modificata!'));
} else {
flash()->info(tr('Riga aggiunta!'));
}
break;
case 'delete_riga':
$id_riga = post('idriga');
$type = post('type');
$riga = $promemoria->getRiga($type, $id_riga);
if (!empty($riga)) {
try {
$riga->delete();
flash()->info(tr('Riga rimossa!'));
} catch (InvalidArgumentException) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}
}
break;
}