Miglioramento gestione sessioni di lavoro
This commit is contained in:
parent
9e4e687b3e
commit
0fba9f7c07
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue