diff --git a/packages/Webkul/Sales/src/Traits/InvoiceReminder.php b/packages/Webkul/Sales/src/Traits/InvoiceReminder.php index dd4a0087a..8b0b2e202 100644 --- a/packages/Webkul/Sales/src/Traits/InvoiceReminder.php +++ b/packages/Webkul/Sales/src/Traits/InvoiceReminder.php @@ -34,6 +34,22 @@ trait InvoiceReminder return $remindersLimit = (int) core()->getConfigData('sales.invoice_setttings.invoice_reminders.reminders_limit'); } + /** + * Get interval between reminders. + * + * @return string + */ + private function getIntervalBetweenReminders() + { + static $intervalBetweenReminders; + + if ($intervalBetweenReminders) { + return $intervalBetweenReminders; + } + + return $intervalBetweenReminders = core()->getConfigData('sales.invoice_setttings.invoice_reminders.interval_between_reminders') ?: 'P1D'; + } + /** * Send an Invoice reminder * @@ -51,6 +67,12 @@ trait InvoiceReminder $customer = $this->customer; Mail::queue(new InvoiceOverdueReminder($customer, $this)); $this->reminders++; + // Calculate next reminder date + $date = now(); + $interval = $this->getIntervalBetweenReminders(); + $date->add($interval); + $date->setTime(0, 0, 0, 0); + $this->next_reminder_date = $date; $this->save(); } @@ -60,6 +82,13 @@ trait InvoiceReminder public function scopeInOverdueAndRemindersLimit($query) { $query->where('state', '=', 'overdue'); + // Filter by next_reminder_date + $query->where(function($query) { + $query->where('next_reminder_at', '<=', now()) + ->orWhereNull('next_reminder_at'); + }); + + // If the core config have maximum limit of reminders if ($this->hasOverdueRemindersLimit()) { $limit = $this->getOverdueRemindersLimit(); return $query->where('reminders', '<', $limit);