Rework service, removed redundant code, service invoicing improvements
This commit is contained in:
@@ -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 */
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user