2019-07-31 18:22:35 +02:00
< ? php
namespace Modules\PrimaNota ;
use Common\Model ;
use Modules\Fatture\Fattura ;
use Modules\Scadenzario\Scadenza ;
2019-08-01 10:08:34 +02:00
class Mastrino extends Model
2019-07-31 18:22:35 +02:00
{
public $incrementing = false ;
protected $table = 'co_movimenti' ;
protected $primaryKey = 'idmastrino' ;
protected $hidden = [
'idmastrino' ,
'data_documento' ,
'iddocumento' ,
'idanagrafica' ,
];
public static function build ( $descrizione , $data , $is_insoluto = false , $contabile = false )
{
$model = parent :: build ();
$model -> idmastrino = self :: getNextMastrino ();
$model -> data = $data ;
$model -> descrizione = $descrizione ;
$model -> is_insoluto = $is_insoluto ;
$model -> primanota = $contabile ;
return $model ;
}
public function cleanup ()
{
$movimenti = $this -> movimenti ;
foreach ( $movimenti as $movimento ) {
$movimento -> delete ();
}
return $movimenti ;
}
public function save ( array $options = [])
{
}
public function delete ()
{
$movimenti = $this -> cleanup ();
$this -> aggiornaScadenzario ( $movimenti );
return parent :: delete (); // TODO: Change the autogenerated stub
}
// Attributi
public function getIdAttribute ()
{
return $this -> idmastrino ;
}
public function getTotaleAttribute ()
{
$movimenti = $this -> movimenti -> where ( 'totale' , '>' , 0 );
$totale = $movimenti -> sum ( 'totale' );
return $totale ;
}
// Metodi generali
public function aggiornaScadenzario ( $movimenti = null )
{
$movimenti = $movimenti ? : $this -> movimenti ;
$documenti = [];
$scadenze = [];
foreach ( $movimenti as $movimento ) {
$scadenza = $movimento -> scadenza ;
$documento = $movimento -> documento ;
// Retrocompatibilità per versioni <= 2.4.11
if ( ! empty ( $documento )) {
if ( ! in_array ( $documento -> id , $documenti )) {
$documenti [] = $documento -> id ;
$this -> correggiScadenza ( $movimento , $scadenza , $documento );
}
} elseif ( ! empty ( $scadenza )) {
$id_documento = $scadenza -> documento -> id ;
if ( ! in_array ( $id_documento , $documenti ) && ! in_array ( $scadenza -> id , $scadenze )) {
$documenti [] = $id_documento ;
$scadenze [] = $scadenza -> id ;
$this -> correggiScadenza ( $movimento , $scadenza );
}
}
}
// Fix dello stato della Fattura
$database = database ();
foreach ( $documenti as $id_documento ) {
// Verifico se la fattura è stata pagata tutta, così imposto lo stato a "Pagato"
$totali = $database -> fetchOne ( 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario WHERE iddocumento=' . prepare ( $id_documento ));
$totale_pagato = abs ( floatval ( $totali [ 'tot_pagato' ]));
$totale_da_pagare = abs ( floatval ( $totali [ 'tot_da_pagare' ]));
// Aggiorno lo stato della fattura
if ( $totale_pagato == $totale_da_pagare ) {
$stato = 'Pagato' ;
} elseif ( $totale_pagato != $totale_da_pagare && $totale_pagato != 0 ) {
$stato = 'Parzialmente pagato' ;
} else {
$stato = 'Emessa' ;
}
$database -> query ( 'UPDATE co_documenti SET idstatodocumento = (SELECT id FROM co_statidocumento WHERE descrizione = ' . prepare ( $stato ) . ') WHERE id = ' . prepare ( $id_documento ));
}
}
public function correggiScadenza ( Movimento $movimento , Scadenza $scadenza = null , Fattura $documento = null )
{
$documento = $documento ? : $scadenza -> documento ;
if ( $documento ) {
$dir = $documento -> direzione ;
$scadenze = $documento -> scadenze -> sortBy ( 'scadenza' );
$movimenti = $documento -> movimentiContabili ;
$totale_movimenti = $movimenti -> where ( 'totale' , '>' , 0 ) -> where ( 'is_insoluto' , 0 ) -> sum ( 'totale' );
$totale_insoluto = $movimenti -> where ( 'totale' , '>' , 0 ) -> where ( 'is_insoluto' , 1 ) -> sum ( 'totale' );
$totale_pagato = $totale_movimenti - $totale_insoluto ;
} else {
$scadenze = [ $scadenza ];
$dir = 'uscita' ;
$totale_pagato = $movimento -> totale ;
}
$rimanente_da_pagare = abs ( $totale_pagato );
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
foreach ( $scadenze as $scadenza ) {
if ( $rimanente_da_pagare <= 0 ) {
$pagato = 0 ;
}
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
elseif ( abs ( $rimanente_da_pagare ) >= abs ( $scadenza [ 'da_pagare' ])) {
$pagato = abs ( $scadenza [ 'da_pagare' ]);
$rimanente_da_pagare -= abs ( $scadenza [ 'da_pagare' ]);
}
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
elseif ( abs ( $rimanente_da_pagare ) > abs ( $scadenza [ 'da_pagare' ])) {
$pagato = abs ( $scadenza [ 'da_pagare' ]);
$rimanente_da_pagare -= abs ( $scadenza [ 'da_pagare' ]);
}
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs ( $rimanente_da_pagare );
$rimanente_da_pagare -= abs ( $rimanente_da_pagare );
}
$pagato = $dir == 'uscita' ? - $pagato : $pagato ;
$scadenza -> pagato = $pagato ;
$scadenza -> data_pagamento = $pagato ? $this -> data : null ;
$scadenza -> save ();
}
}
// Relazioni Eloquent
public function fattura ()
{
return $this -> belongsTo ( Fattura :: class , 'iddocumento' );
}
public function movimenti ()
{
return $this -> hasMany ( Movimento :: class , 'idmastrino' );
}
// Metodi statici
public static function getNextMastrino ()
{
$ultimo = database () -> fetchOne ( 'SELECT MAX(idmastrino) AS max FROM co_movimenti' );
return intval ( $ultimo [ 'max' ]) + 1 ;
}
}