akaunting/app/Utilities/Recurring.php

54 lines
1.7 KiB
PHP
Raw Normal View History

<?php
namespace App\Utilities;
2020-12-24 01:28:38 +03:00
use App\Models\Document\Document;
use App\Traits\DateTime;
use Date;
class Recurring
{
use DateTime;
2020-01-18 13:11:19 +03:00
public static function reflect(&$items, $issued_date_field)
{
$financial_year = (new static)->getFinancialYear();
foreach ($items as $key => $item) {
2020-01-27 22:41:08 +03:00
// @todo cache recurrings
if (!$item->recurring || !empty($item->parent_id)) {
continue;
}
2020-09-30 17:01:35 +03:00
foreach ($item->recurring->getRecurringSchedule(false) as $schedule) {
$issued = Date::parse($item->$issued_date_field);
2020-09-27 00:33:06 +03:00
$start = $schedule->getStart();
$start_date = Date::parse($start->format('Y-m-d'));
if (($issued->format('Y-m') == $start->format('Y-m')) && ($issued->format('d') >= $start->format('d'))) {
continue;
}
if ($start_date->lessThan($financial_year->getStartDate()) || $start_date->greaterThan($financial_year->getEndDate())) {
continue;
}
$clone = clone $item;
2020-12-24 01:28:38 +03:00
if ($clone instanceof Document) {
// Days between invoiced/billed and due date
2020-04-11 02:12:03 +03:00
$diff_days = Date::parse($clone->due_at)->diffInDays(Date::parse($clone->$issued_date_field));
$clone->due_at = $start_date->copy()->addDays($diff_days)->format('Y-m-d');
}
$clone->parent_id = $item->id;
$clone->created_at = $start_date->format('Y-m-d');
$clone->$issued_date_field = $start_date->format('Y-m-d');
$items->push($clone);
}
}
}
2020-01-18 13:11:19 +03:00
}