Miglioramento gestione sessioni di lavoro

This commit is contained in:
Thomas Zilio 2019-07-15 12:27:12 +02:00
parent 9e4e687b3e
commit 0fba9f7c07
4 changed files with 156 additions and 194 deletions

View File

@ -7,6 +7,7 @@ use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Interventi\Components\Articolo;
use Modules\Interventi\Components\Riga;
use Modules\Interventi\Components\Sconto;
use Modules\Interventi\Components\Sessione;
use Modules\Interventi\Intervento;
use Modules\Interventi\Stato;
use Modules\TipiIntervento\Tipo as TipoSessione;
@ -544,102 +545,29 @@ switch (post('op')) {
case 'edit_sessione':
$id_sessione = post('id_sessione');
$sessione = Sessione::find($id_sessione);
// Lettura delle date di inizio e fine intervento
$orario_inizio = post('orario_inizio');
$orario_fine = post('orario_fine');
$sessione->orario_inizio = post('orario_inizio');
$sessione->orario_fine = post('orario_fine');
$sessione->km = post('km');
// Ricalcolo le ore lavorate
$ore = calcola_ore_intervento($orario_inizio, $orario_fine);
$id_tipo = post('idtipointerventot');
$sessione->setTipo($id_tipo);
$km = post('km');
// Prezzi
$sessione->prezzo_ore_unitario = post('prezzo_ore_unitario');
$sessione->prezzo_km_unitario = post('prezzo_km_unitario');
$sessione->prezzo_dirittochiamata = post('prezzo_dirittochiamata');
// Lettura tariffe in base al tipo di intervento ed al tecnico
$idtipointervento_tecnico = post('idtipointerventot');
$rs = $dbo->fetchArray('SELECT * FROM in_interventi_tecnici WHERE idtecnico='.prepare(post('idtecnico')).' AND idintervento='.prepare($id_record));
// Sconto orario
$sessione->sconto_unitario = post('sconto');
$sessione->tipo_sconto = post('tipo_sconto');
if ($idtipointervento_tecnico != $rs[0]['idtipointervento']) {
$rsc = $dbo->fetchArray('SELECT * FROM in_tariffe WHERE idtecnico='.prepare(post('idtecnico')).' AND idtipointervento='.prepare($idtipointervento_tecnico));
// Sconto chilometrico
$sessione->scontokm_unitario = post('sconto_km');
$sessione->tipo_scontokm = post('tipo_sconto_km');
$prezzo_ore_unitario = $rsc[0]['costo_ore'];
$prezzo_km_unitario = $rsc[0]['costo_km'];
$prezzo_dirittochiamata = $rsc[0]['costo_dirittochiamata'];
$prezzo_ore_unitario_tecnico = $rsc[0]['costo_ore_tecnico'];
$prezzo_km_unitario_tecnico = $rsc[0]['costo_km_tecnico'];
$prezzo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico'];
} else {
$prezzo_ore_unitario = post('prezzo_ore_unitario');
$prezzo_km_unitario = post('prezzo_km_unitario');
$prezzo_dirittochiamata = post('prezzo_dirittochiamata');
$prezzo_ore_unitario_tecnico = $rs[0]['prezzo_ore_unitario_tecnico'];
$prezzo_km_unitario_tecnico = $rs[0]['prezzo_km_unitario_tecnico'];
$prezzo_dirittochiamata_tecnico = $rs[0]['prezzo_dirittochiamata_tecnico'];
}
// Totali
$prezzo_ore_consuntivo = $prezzo_ore_unitario * $ore;
$prezzo_km_consuntivo = $prezzo_km_unitario * $km;
$prezzo_ore_consuntivo_tecnico = $prezzo_ore_unitario_tecnico * $ore;
$prezzo_km_consuntivo_tecnico = $prezzo_km_unitario_tecnico * $km;
// Sconti ore
$sconto_unitario = post('sconto');
$tipo_sconto = post('tipo_sconto');
if ($tipo_sconto == 'UNT') {
$sconto = $sconto_unitario * $ore;
} else {
$sconto = calcola_sconto([
'sconto' => $sconto_unitario,
'prezzo' => $prezzo_ore_consuntivo,
'tipo' => $tipo_sconto,
]);
}
// Sconti km
$scontokm_unitario = post('sconto_km');
$tipo_scontokm = post('tipo_sconto_km');
if ($tipo_scontokm == 'UNT') {
$scontokm = $scontokm_unitario * $km;
} else {
$scontokm = calcola_sconto([
'sconto' => $scontokm_unitario,
'prezzo' => $prezzo_km_consuntivo,
'tipo' => $tipo_scontokm,
]);
}
$dbo->update('in_interventi_tecnici', [
'idtipointervento' => $idtipointervento_tecnico,
'orario_inizio' => $orario_inizio,
'orario_fine' => $orario_fine,
'ore' => $ore,
'km' => $km,
'prezzo_ore_unitario' => $prezzo_ore_unitario,
'prezzo_km_unitario' => $prezzo_km_unitario,
'prezzo_dirittochiamata' => $prezzo_dirittochiamata,
'prezzo_ore_unitario_tecnico' => $prezzo_ore_unitario_tecnico,
'prezzo_km_unitario_tecnico' => $prezzo_km_unitario_tecnico,
'prezzo_dirittochiamata_tecnico' => $prezzo_dirittochiamata_tecnico,
'prezzo_ore_consuntivo' => $prezzo_ore_consuntivo,
'prezzo_km_consuntivo' => $prezzo_km_consuntivo,
'prezzo_ore_consuntivo_tecnico' => $prezzo_ore_consuntivo_tecnico,
'prezzo_km_consuntivo_tecnico' => $prezzo_km_consuntivo_tecnico,
'sconto' => $sconto,
'sconto_unitario' => $sconto_unitario,
'tipo_sconto' => $tipo_sconto,
'scontokm' => $scontokm,
'scontokm_unitario' => $scontokm_unitario,
'tipo_scontokm' => $tipo_scontokm,
], ['id' => $id_sessione]);
$sessione->save();
break;
}

View File

@ -2,6 +2,10 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\Components\Sessione;
use Modules\Interventi\Intervento;
/**
* Recupera il totale delle ore spese per un intervento.
*
@ -54,105 +58,17 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
{
$dbo = database();
// Controllo sull'identità del tecnico
$tecnico = $dbo->fetchOne('SELECT an_anagrafiche.idanagrafica, an_anagrafiche.email FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE an_anagrafiche.idanagrafica = '.prepare($idtecnico)." AND an_tipianagrafiche.descrizione = 'Tecnico'");
if (empty($tecnico)) {
return false;
}
$intervento = Intervento::find($idintervento);
$anagrafica = Anagrafica::find($idtecnico);
$rs = $dbo->fetchArray('SELECT idanagrafica, idsede_destinazione, idtipointervento FROM in_interventi WHERE id='.prepare($idintervento));
$idanagrafica = $rs[0]['idanagrafica'];
$idsede_destinazione = $rs[0]['idsede_destinazione'];
$idtipointervento = $rs[0]['idtipointervento'];
// Calcolo km in base a quelli impostati nell'anagrafica
// Nessuna sede
if ($idsede_destinazione == '-1') {
$km = 0;
}
// Sede legale
elseif (empty($idsede_destinazione)) {
$rs2 = $dbo->fetchArray('SELECT km FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
$km = $rs2[0]['km'];
}
// Sede secondaria
else {
$rs2 = $dbo->fetchArray('SELECT km FROM an_sedi WHERE id='.prepare($idsede_destinazione));
$km = $rs2[0]['km'];
}
$km = empty($km) ? 0 : $km;
// Calcolo il totale delle ore lavorate
$diff = date_diff(date_create($inizio), date_create($fine));
$ore = calcola_ore_intervento($inizio, $fine);
// Leggo i costi unitari dalle tariffe se almeno un valore è stato impostato
$rsc = $dbo->fetchArray('SELECT * FROM in_tariffe WHERE idtecnico='.prepare($idtecnico).' AND idtipointervento='.prepare($idtipointervento));
$costo_ore = $rsc[0]['costo_ore'];
$costo_km = $rsc[0]['costo_km'];
$costo_dirittochiamata = $rsc[0]['costo_dirittochiamata'];
$costo_ore_tecnico = $rsc[0]['costo_ore_tecnico'];
$costo_km_tecnico = $rsc[0]['costo_km_tecnico'];
$costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico'];
// Sovrascrivo i costi unitari da contratto se l'intervento è legato ad un contratto e c'è almeno un record...
if (!empty($idcontratto)) {
$rsc = $dbo->fetchArray('SELECT * FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($idcontratto).' AND idtipointervento='.prepare($idtipointervento));
if (!empty($rsc)) {
$costo_ore = $rsc[0]['costo_ore'];
$costo_km = $rsc[0]['costo_km'];
$costo_dirittochiamata = $rsc[0]['costo_dirittochiamata'];
//per le attività collegate a contratti, i costi interni del tecnico vengono sempre presi da quelli globali o da quelli specificati per il singolo tecnico
//$costo_ore_tecnico = $rsc[0]['costo_ore_tecnico'];
//$costo_km_tecnico = $rsc[0]['costo_km_tecnico'];
//$costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico'];
}
}
// Azzeramento forzato del diritto di chiamata nel caso questa non sia la prima sessione dell'intervento per il giorno di inizio [Luca]
$rs = $dbo->fetchArray('SELECT id FROM in_interventi_tecnici WHERE (DATE(orario_inizio)=DATE('.prepare($inizio).') OR DATE(orario_fine)=DATE('.prepare($inizio).')) AND idintervento='.prepare($idintervento));
if (!empty($rs)) {
$costo_dirittochiamata_tecnico = 0;
$costo_dirittochiamata = 0;
}
// Inserisco le ore dei tecnici nella tabella "in_interventi_tecnici"
$dbo->insert('in_interventi_tecnici', [
'idintervento' => $idintervento,
'idtipointervento' => $idtipointervento,
'idtecnico' => $idtecnico,
'km' => $km,
'orario_inizio' => $inizio,
'orario_fine' => $fine,
'ore' => $ore,
'prezzo_ore_unitario' => $costo_ore,
'prezzo_km_unitario' => $costo_km,
'prezzo_ore_consuntivo' => $costo_ore * $ore + $costo_dirittochiamata,
'prezzo_km_consuntivo' => 0,
'prezzo_dirittochiamata' => $costo_dirittochiamata,
'prezzo_ore_unitario_tecnico' => $costo_ore_tecnico,
'prezzo_km_unitario_tecnico' => $costo_km_tecnico,
'prezzo_ore_consuntivo_tecnico' => $costo_ore_tecnico * $ore + $costo_dirittochiamata_tecnico,
'prezzo_km_consuntivo_tecnico' => 0,
'prezzo_dirittochiamata_tecnico' => $costo_dirittochiamata_tecnico,
]);
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
// Notifica nuovo intervento al tecnico
if (!empty($tecnico['email'])) {
$n = new Notifications\EmailNotification();
$n->setTemplate('Notifica intervento', $idintervento);
$n->setReceivers($tecnico['email']);
$n->setReceivers($anagrafica['email']);
$n->send();
}

View File

@ -3,6 +3,8 @@
namespace Modules\Interventi\Components;
use Common\Model;
use DateTime;
use http\Exception\InvalidArgumentException;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\Intervento;
use Modules\Iva\Aliquota;
@ -21,6 +23,118 @@ class Sessione extends Model
protected $aliquota_iva = null;
/**
* Crea un nuova sessione collegata ad un intervento.
*
* @param Intervento $intervento
* @param Anagrafica $anagrafica
* @param string $inizio
* @param string $fine
*
* @return self
*/
public static function build(Intervento $intervento, Anagrafica $anagrafica, $inizio, $fine)
{
if (!$anagrafica->isTipo('Tecnico')) {
throw new InvalidArgumentException();
}
$model = parent::build();
$model->parent()->associate($intervento);
$model->anagrafica()->associate($anagrafica);
$id_tipo = $intervento['idtipointervento'];
$tipo_sessione = TipoSessione::find($id_tipo);
$model->tipo()->associate($tipo_sessione);
$model->orario_inizio = $inizio;
$model->orario_fine = $fine;
// Sede secondaria
if (!empty($intervento['idsede_destinazione'])) {
$sede = database()->fetchOne('SELECT km FROM an_sedi WHERE id = '.prepare($intervento['idsede_destinazione']));
$km = $sede['km'];
}
// Sede legale dell'anagrafica
else {
$km = $intervento->anagrafica->sedeLegale->km;
}
$model->km = empty($km) ? 0 : $km;
$model->save();
$model->setTipo($id_tipo, true);
$model->save();
return $model;
}
public function setTipo($id_tipo, $reset = false)
{
$tipo_sessione = TipoSessione::find($id_tipo);
$this->tipo()->associate($tipo_sessione);
$tariffa = $this->getTariffa($id_tipo);
// Azzeramento forzato del diritto di chiamata nel caso la sessione non sia la prima dell'intervento nel giorno di inizio o fine
$sessioni = database()->fetchArray('SELECT id FROM in_interventi_tecnici WHERE (DATE(orario_inizio) = DATE('.prepare($this->orario_inizio).') OR DATE(orario_fine) = DATE('.prepare($this->orario_fine).')) AND (prezzo_dirittochiamata != 0 OR prezzo_dirittochiamata_tecnico != 0) AND id != '.prepare($this->id).' AND idintervento = '.prepare($this->intervento->id));
if (!empty($sessioni)) {
$tariffa['costo_dirittochiamata_tecnico'] = 0;
$tariffa['costo_dirittochiamata'] = 0;
// Fix se reset non attivo
$this->prezzo_dirittochiamata = $tariffa['costo_dirittochiamata'];
}
// Modifica dei costi
$this->prezzo_ore_unitario_tecnico = $tariffa['costo_ore_tecnico'];
$this->prezzo_km_unitario_tecnico = $tariffa['costo_km_tecnico'];
$this->prezzo_dirittochiamata_tecnico = $tariffa['costo_dirittochiamata_tecnico'];
// Modifica dei prezzi
if ($reset) {
$this->prezzo_ore_unitario = $tariffa['costo_ore'];
$this->prezzo_km_unitario = $tariffa['costo_km'];
$this->prezzo_dirittochiamata = $tariffa['costo_dirittochiamata'];
}
}
public function getOreAttribute()
{
$inizio = new DateTime($this->orario_inizio);
$diff = $inizio->diff(new DateTime($this->orario_fine));
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
return $ore;
}
/**
* Salva la sessione, impostando i campi dipendenti dai singoli parametri.
*
* @param array $options
*
* @return bool
*/
public function save(array $options = [])
{
$this->attributes['ore'] = $this->ore;
$this->attributes['prezzo_ore_consuntivo'] = $this->prezzo_manodopera + $this->prezzo_diritto_chiamata;
$this->attributes['prezzo_km_consuntivo'] = $this->prezzo_viaggio;
$this->attributes['prezzo_ore_consuntivo_tecnico'] = $this->costo_manodopera + $this->costo_diritto_chiamata;
$this->attributes['prezzo_km_consuntivo_tecnico'] = $this->costo_viaggio;
$this->attributes['sconto'] = $this->sconto_totale_manodopera;
$this->attributes['scontokm'] = $this->sconto_totale_viaggio;
return parent::save($options);
}
public function getParentID()
{
return 'idintervento';
@ -273,19 +387,23 @@ class Sessione extends Model
return $this->aliquota_iva;
}
/**
* Crea un nuova sessione collegata ad un intervento.
*
* @param Intervento $intervento
*
* @return self
*/
public static function build(Intervento $intervento)
protected function getTariffa($id_tipo)
{
$model = parent::build($intervento);
$database = database();
$model->parent()->associate($intervento);
// Costi unitari dalla tariffa del tecnico
$result = $database->fetchOne('SELECT * FROM in_tariffe WHERE idtecnico='.prepare($this->anagrafica->id).' AND idtipointervento = '.prepare($id_tipo));
return $model;
// Costi unitari del contratto
$id_contratto = $this->intervento->idcontratto;
if (!empty($id_contratto)) {
$tariffa_contratto = $database->fetchOne('SELECT costo_ore, costo_km, costo_dirittochiamata FROM co_contratti_tipiintervento WHERE idcontratto = '.prepare($id_contratto).' AND idtipointervento = '.prepare($id_tipo));
if (!empty($tariffa_contratto)) {
$result = array_merge($result, $tariffa_contratto);
}
}
return $result;
}
}

View File

@ -16,7 +16,7 @@ class Intervento extends Document
protected $info = [];
/**
* Crea un nuovo preventivo.
* Crea un nuovo intrevento.
*
* @param Anagrafica $anagrafica
* @param TipoSessione $tipo_sessione