openstamanager/modules/pagamenti/src/Pagamento.php

97 lines
2.8 KiB
PHP
Raw Normal View History

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;
}
}