Rework service, removed redundant code, service invoicing improvements

This commit is contained in:
2024-07-29 23:12:53 +10:00
parent 5f10175b35
commit 0b5bc9e012
29 changed files with 474 additions and 523 deletions

View File

@@ -158,6 +158,148 @@ class Invoice extends Model implements IDs
return ceil(($contract_term ?: 1)/(Arr::get(self::billing_periods,$source.'.interval') ?: 1));
}
/**
* Work out the time period for a particular date and invoice period
*
* @param \Leenooks\Carbon $date
* @param int $interval
* @param bool $strict
* @return Collection
* @throws \Exception
*/
public static function invoice_period(Carbon $date,int $interval,bool $strict): Collection
{
$date_start = $date->clone();
$date_end = $date->clone();
switch ($interval) {
case self::BILL_WEEKLY:
$result = collect([
'start' => $strict
? $date_start->startOfWeek()
: $date_start,
'end'=> $strict
? $date_end->endOfWeek()
: $date_end->addWeek()->subDay()
]);
break;
case self::BILL_MONTHLY:
$result = collect([
'start' => $strict
? $date_start->startOfMonth()
: $date_start,
'end' => $strict
? $date_end->endOfMonth()
: $date_end->addMonth()->subDay()
]);
break;
case self::BILL_QUARTERLY:
$result = collect([
'start' => $strict// The service charges
? $date_start->startOfQuarter()
: $date_start,
'end' => $strict
? $date_end->endOfQuarter()
: $date_end->addQuarter()->subDay()
]);
break;
case self::BILL_SEMI_YEARLY:
$result = collect([
'start' => $strict
? $date_start->startOfHalf()
: $date_start,
'end' => $strict
? $date_end->endOfHalf()
: $date_end->addQuarters(2)->subDay()
]);
break;
case self::BILL_YEARLY:
$result = collect([
'start' => $strict
? $date_start->startOfYear()
: $date_start,
'end' => $strict
? $date_end->endOfYear()
: $date_end->addYear()->subDay()
]);
break;
case self::BILL_TWOYEARS:
if (! $strict) {
$result = collect([
'start' => $date_start,
'end' => $date_end->addYears(2)->subDay(),
]);
} else {
$data_end = $date_end->addYears(2)->subDay()->endOfYear();
// Make sure we end on an even year
if ($data_end->clone()->addDay()->year%2)
$data_end = $data_end->subYear();
$result = collect([
'start' => $data_end->clone()->subYears(2)->addDay(),
'end' => $data_end,
]);
}
break;
// NOTE: price_recur_strict ignored
case self::BILL_THREEYEARS:
$result = collect([
'start' => $date_start,
'end' => $date_end->addYears(3)->subDay(),
]);
break;
// NOTE: price_recur_strict ignored
case self::BILL_FOURYEARS:
$result = collect([
'start' => $date_start,
'end' => $date_end->addYears(4)->subDay(),
]);
break;
// NOTE: price_recur_strict ignored
case self::BILL_FIVEYEARS:
$result = collect([
'start' => $date_start,
'end' => $date_end->addYears(5)->subDay(),
]);
break;
default:
throw new \Exception('Unknown recur_schedule: '.$interval);
}
return $result;
}
/**
* @param \Leenooks\Carbon $start Start Date
* @param Carbon $end End Date
* @param int $interval Period End Date
* @param bool $strict
* @return float
* @throws \Exception
*/
public static function invoice_quantity(Carbon $start,Carbon $end,Collection $period): float
{
if ($start->lessThan(Arr::get($period,'start')) || $end->greaterThan(Arr::get($period,'end')))
throw new \Exception('Billing Period differ');
$d = Arr::get($period,'start')->diffInDays(Arr::get($period,'end'));
if (! $d)
throw new \Exception('Start and End period dates cannot be the same');
return round(($d-Arr::get($period,'start')->diffInDays($start)-$end->diffInDays(Arr::get($period,'end')))/$d,2);
}
/* INTERFACES */
/**