2019-03-08 16:59:55 +01:00
< ? php
namespace Modules\Pagamenti ;
use Common\Model ;
use DateTime ;
class Pagamento extends Model
{
protected $table = 'co_pagamenti' ;
public function fatture ()
{
return $this -> hasMany ( Fattura :: class , 'idpagamento' );
}
public function rate ()
{
return $this -> hasMany ( Pagamento :: class , 'descrizione' , 'descrizione' );
}
public function calcola ( $importo , $data )
{
$rate = $this -> rate -> sortBy ( 'num_giorni' );
$number = count ( $rate );
$totale = 0.0 ;
$results = [];
2019-05-10 18:02:27 +02:00
$count = 0 ;
2019-03-08 16:59:55 +01:00
foreach ( $rate as $key => $rata ) {
2020-01-10 19:15:36 +01:00
$date = new DateTime ( $data );
2019-03-08 16:59:55 +01:00
// X giorni esatti
if ( $rata [ 'giorno' ] == 0 ) {
2020-01-10 19:15:36 +01:00
// Offset della rata
$date -> modify ( '+' . ( $rata [ 'num_giorni' ]) . ' day' );
2019-03-08 16:59:55 +01:00
}
// Ultimo del mese
elseif ( $rata [ 'giorno' ] < 0 ) {
2020-01-10 19:15:36 +01:00
// Offset della rata in mesi
2019-03-08 16:59:55 +01:00
$add = floor ( $rata [ 'num_giorni' ] / 30 );
for ( $c = 0 ; $c < $add ; ++ $c ) {
$date -> modify ( 'last day of next month' );
}
2020-01-10 19:15:36 +01:00
// Opzione ultimo del mese più X giorni
2019-03-08 16:59:55 +01:00
$giorni = - $rata [ 'giorno' ] - 1 ;
if ( $giorni > 0 ) {
$date -> modify ( '+' . ( $giorni ) . ' day' );
} else {
$date -> modify ( 'last day of this month' );
}
}
// Giorno preciso del mese
else {
2020-01-10 19:15:36 +01:00
// Offset della rata
$date -> modify ( '+' . ( $rata [ 'num_giorni' ]) . ' day' );
// Individuazione giorno effettivo (se il giorno indicato è eccessivamente grande, viene preso il massimo possibile)
$date -> modify ( 'last day of this month' );
$last_day = $date -> format ( 'd' );
$day = $rata [ 'giorno' ] > $last_day ? $last_day : $rata [ 'giorno' ];
// Correzione data
$date -> setDate ( $date -> format ( 'Y' ), $date -> format ( 'm' ), $day );
2019-03-08 16:59:55 +01:00
}
2020-01-10 19:15:36 +01:00
// Comversione della data in stringa standard
$scadenza = $date -> format ( 'Y-m-d' );
2019-03-08 16:59:55 +01:00
// All'ultimo ciclo imposto come cifra da pagare il totale della fattura meno gli importi già inseriti in scadenziario per evitare di inserire cifre arrotondate "male"
2019-05-10 18:02:27 +02:00
if ( $count + 1 == $number ) {
2019-03-08 16:59:55 +01:00
$da_pagare = sum ( $importo , - $totale , 2 );
}
// Totale da pagare (totale x percentuale di pagamento nei casi pagamenti multipli)
else {
$da_pagare = sum ( $importo / 100 * $rata [ 'prc' ], 0 , 2 );
}
$totale = sum ( $da_pagare , $totale , 2 );
$results [] = [
'scadenza' => $scadenza ,
'importo' => $da_pagare ,
];
2019-05-10 18:02:27 +02:00
2019-05-16 04:52:16 +02:00
++ $count ;
2019-03-08 16:59:55 +01:00
}
return $results ;
}
}