From 88c4fe0147a620ff94ecc7e37de0775306262aba Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 27 Sep 2021 08:24:11 +1000 Subject: [PATCH] Recurring expense send date calculations --- app/Models/RecurringExpense.php | 73 +++++++++++++++++++ .../RecurringExpenseTransformer.php | 7 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/app/Models/RecurringExpense.php b/app/Models/RecurringExpense.php index 8682c0568fa4..986dd7eebb9b 100644 --- a/app/Models/RecurringExpense.php +++ b/app/Models/RecurringExpense.php @@ -164,4 +164,77 @@ class RecurringExpense extends BaseModel } } + public function recurringDates() + { + + /* Return early if nothing to send back! */ + if ($this->status_id == RecurringInvoice::STATUS_COMPLETED || + $this->remaining_cycles == 0 || + !$this->next_send_date) { + return []; + } + + /* Endless - lets send 10 back*/ + $iterations = $this->remaining_cycles; + + if ($this->remaining_cycles == -1) { + $iterations = 10; + } + + $data = []; + + if (!Carbon::parse($this->next_send_date)) { + return $data; + } + + $next_send_date = Carbon::parse($this->next_send_date)->copy(); + + for ($x=0; $x<$iterations; $x++) { + // we don't add the days... we calc the day of the month!! + $next_due_date = $this->nextDateByFrequency($next_send_date); + + $data[] = [ + 'send_date' => $next_send_date->format('Y-m-d'), + ]; + + } + + return $data; + } + + public function nextDateByFrequency($date) + { + $offset = $this->client->timezone_offset(); + + switch ($this->frequency_id) { + case RecurringInvoice::FREQUENCY_DAILY: + return $date->startOfDay()->addDay()->addSeconds($offset); + case RecurringInvoice::FREQUENCY_WEEKLY: + return $date->startOfDay()->addWeek()->addSeconds($offset); + case RecurringInvoice::FREQUENCY_TWO_WEEKS: + return $date->startOfDay()->addWeeks(2)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_FOUR_WEEKS: + return $date->startOfDay()->addWeeks(4)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_MONTHLY: + return $date->startOfDay()->addMonthNoOverflow()->addSeconds($offset); + case RecurringInvoice::FREQUENCY_TWO_MONTHS: + return $date->startOfDay()->addMonthsNoOverflow(2)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_THREE_MONTHS: + return $date->startOfDay()->addMonthsNoOverflow(3)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_FOUR_MONTHS: + return $date->startOfDay()->addMonthsNoOverflow(4)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_SIX_MONTHS: + return $date->addMonthsNoOverflow(6)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_ANNUALLY: + return $date->startOfDay()->addYear()->addSeconds($offset); + case RecurringInvoice::FREQUENCY_TWO_YEARS: + return $date->startOfDay()->addYears(2)->addSeconds($offset); + case RecurringInvoice::FREQUENCY_THREE_YEARS: + return $date->startOfDay()->addYears(3)->addSeconds($offset); + default: + return null; + } + } + + } diff --git a/app/Transformers/RecurringExpenseTransformer.php b/app/Transformers/RecurringExpenseTransformer.php index 6457bb000792..6332e4535aa1 100644 --- a/app/Transformers/RecurringExpenseTransformer.php +++ b/app/Transformers/RecurringExpenseTransformer.php @@ -49,7 +49,7 @@ class RecurringExpenseTransformer extends EntityTransformer */ public function transform(RecurringExpense $recurring_expense) { - return [ + $data = [ 'id' => $this->encodePrimaryKey($recurring_expense->id), 'user_id' => $this->encodePrimaryKey($recurring_expense->user_id), 'assigned_user_id' => $this->encodePrimaryKey($recurring_expense->assigned_user_id), @@ -102,5 +102,10 @@ class RecurringExpenseTransformer extends EntityTransformer 'last_sent_date' => $recurring_expense->last_sent_date ?: '', 'next_send_date' => $recurring_expense->next_send_date ?: '', ]; + + if(request()->has('show_dates') && request()->query('show_dates') == 'true') + $data['recurring_dates'] = (array) $recurring_expense->recurringDates(); + + return $data; } } \ No newline at end of file