more recurring improvements
This commit is contained in:
parent
fde281301f
commit
9ef11cef71
@ -11,8 +11,8 @@ use App\Events\Sale\InvoiceRecurring;
|
|||||||
use App\Models\Banking\Transaction;
|
use App\Models\Banking\Transaction;
|
||||||
use App\Models\Common\Company;
|
use App\Models\Common\Company;
|
||||||
use App\Models\Sale\Invoice;
|
use App\Models\Sale\Invoice;
|
||||||
|
use App\Utilities\Date;
|
||||||
use App\Utilities\Overrider;
|
use App\Utilities\Overrider;
|
||||||
use Date;
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
class RecurringCheck extends Command
|
class RecurringCheck extends Command
|
||||||
@ -31,13 +31,6 @@ class RecurringCheck extends Command
|
|||||||
*/
|
*/
|
||||||
protected $description = 'Check for recurring';
|
protected $description = 'Check for recurring';
|
||||||
|
|
||||||
/**
|
|
||||||
* The current day.
|
|
||||||
*
|
|
||||||
* @var \Carbon\Carbon
|
|
||||||
*/
|
|
||||||
protected $today;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
*
|
*
|
||||||
@ -61,19 +54,35 @@ class RecurringCheck extends Command
|
|||||||
Overrider::load('settings');
|
Overrider::load('settings');
|
||||||
Overrider::load('currencies');
|
Overrider::load('currencies');
|
||||||
|
|
||||||
$this->today = Date::today();
|
$today = Date::today();
|
||||||
|
|
||||||
foreach ($company->recurring as $recurring) {
|
foreach ($company->recurring as $recurring) {
|
||||||
if (!$model = $recurring->recurable) {
|
if (!$model = $recurring->recurable) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($recurring->getRecurringSchedule() as $schedule) {
|
$schedules = $recurring->getRecurringSchedule();
|
||||||
|
|
||||||
|
$children_count = $this->getChildrenCount($model);
|
||||||
|
$schedule_count = $schedules->count();
|
||||||
|
|
||||||
|
// All recurring created, including today
|
||||||
|
if ($children_count > ($schedule_count - 1)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recur only today
|
||||||
|
if ($children_count == ($schedule_count - 1)) {
|
||||||
|
$this->recur($model, $recurring->recurable_type, $today);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recur all schedules, previously failed
|
||||||
|
foreach ($schedules as $schedule) {
|
||||||
$schedule_date = Date::parse($schedule->getStart()->format('Y-m-d'));
|
$schedule_date = Date::parse($schedule->getStart()->format('Y-m-d'));
|
||||||
|
|
||||||
\DB::transaction(function () use ($model, $recurring, $schedule_date) {
|
|
||||||
$this->recur($model, $recurring->recurable_type, $schedule_date);
|
$this->recur($model, $recurring->recurable_type, $schedule_date);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,11 +94,7 @@ class RecurringCheck extends Command
|
|||||||
|
|
||||||
protected function recur($model, $type, $schedule_date)
|
protected function recur($model, $type, $schedule_date)
|
||||||
{
|
{
|
||||||
// Don't recur the future
|
\DB::transaction(function () use ($model, $type, $schedule_date) {
|
||||||
if ($schedule_date->greaterThan($this->today)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$clone = $this->getClone($model, $schedule_date)) {
|
if (!$clone = $this->getClone($model, $schedule_date)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -114,6 +119,7 @@ class RecurringCheck extends Command
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -215,6 +221,15 @@ class RecurringCheck extends Command
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getChildrenCount($model)
|
||||||
|
{
|
||||||
|
$table = $this->getTable($model);
|
||||||
|
|
||||||
|
return \DB::table($table)
|
||||||
|
->where('parent_id', $model->id)
|
||||||
|
->count();
|
||||||
|
}
|
||||||
|
|
||||||
protected function getDateField($model)
|
protected function getDateField($model)
|
||||||
{
|
{
|
||||||
if ($model instanceof Transaction) {
|
if ($model instanceof Transaction) {
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Traits;
|
namespace App\Traits;
|
||||||
|
|
||||||
|
use App\Utilities\Date;
|
||||||
use Recurr\Rule;
|
use Recurr\Rule;
|
||||||
use Recurr\Transformer\ArrayTransformer;
|
use Recurr\Transformer\ArrayTransformer;
|
||||||
use Recurr\Transformer\ArrayTransformerConfig;
|
use Recurr\Transformer\ArrayTransformerConfig;
|
||||||
@ -59,18 +60,19 @@ trait Recurring
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRecurringSchedule()
|
public function getRecurringSchedule($set_until_date = true)
|
||||||
{
|
{
|
||||||
$config = new ArrayTransformerConfig();
|
$config = new ArrayTransformerConfig();
|
||||||
$config->enableLastDayOfMonthFix();
|
$config->enableLastDayOfMonthFix();
|
||||||
|
$config->setVirtualLimit($this->getRecurringVirtualLimit());
|
||||||
|
|
||||||
$transformer = new ArrayTransformer();
|
$transformer = new ArrayTransformer();
|
||||||
$transformer->setConfig($config);
|
$transformer->setConfig($config);
|
||||||
|
|
||||||
return $transformer->transform($this->getRecurringRule());
|
return $transformer->transform($this->getRecurringRule($set_until_date));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRecurringRule()
|
public function getRecurringRule($set_until_date = true)
|
||||||
{
|
{
|
||||||
$rule = (new Rule())
|
$rule = (new Rule())
|
||||||
->setStartDate($this->getRecurringRuleStartDate())
|
->setStartDate($this->getRecurringRuleStartDate())
|
||||||
@ -78,6 +80,10 @@ trait Recurring
|
|||||||
->setFreq($this->getRecurringRuleFrequency())
|
->setFreq($this->getRecurringRuleFrequency())
|
||||||
->setInterval($this->getRecurringRuleInterval());
|
->setInterval($this->getRecurringRuleInterval());
|
||||||
|
|
||||||
|
if ($set_until_date) {
|
||||||
|
$rule->setUntil($this->getRecurringRuleUntilDate());
|
||||||
|
}
|
||||||
|
|
||||||
// 0 means infinite
|
// 0 means infinite
|
||||||
if ($this->count != 0) {
|
if ($this->count != 0) {
|
||||||
$rule->setCount($this->getRecurringRuleCount());
|
$rule->setCount($this->getRecurringRuleCount());
|
||||||
@ -91,6 +97,11 @@ trait Recurring
|
|||||||
return new \DateTime($this->started_at, new \DateTimeZone($this->getRecurringRuleTimeZone()));
|
return new \DateTime($this->started_at, new \DateTimeZone($this->getRecurringRuleTimeZone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRecurringRuleUntilDate()
|
||||||
|
{
|
||||||
|
return new \DateTime(Date::today()->toDateTimeString(), new \DateTimeZone($this->getRecurringRuleTimeZone()));
|
||||||
|
}
|
||||||
|
|
||||||
public function getRecurringRuleTimeZone()
|
public function getRecurringRuleTimeZone()
|
||||||
{
|
{
|
||||||
return setting('localisation.timezone');
|
return setting('localisation.timezone');
|
||||||
@ -112,6 +123,27 @@ trait Recurring
|
|||||||
return $this->interval;
|
return $this->interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRecurringVirtualLimit()
|
||||||
|
{
|
||||||
|
switch ($this->frequency) {
|
||||||
|
case 'yearly':
|
||||||
|
$limit = '2';
|
||||||
|
break;
|
||||||
|
case 'monthly':
|
||||||
|
$limit = '24';
|
||||||
|
break;
|
||||||
|
case 'weekly':
|
||||||
|
$limit = '104';
|
||||||
|
break;
|
||||||
|
case 'daily':
|
||||||
|
default;
|
||||||
|
$limit = '732';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $limit;
|
||||||
|
}
|
||||||
|
|
||||||
public function getCurrentRecurring()
|
public function getCurrentRecurring()
|
||||||
{
|
{
|
||||||
if (!$schedule = $this->getRecurringSchedule()) {
|
if (!$schedule = $this->getRecurringSchedule()) {
|
||||||
|
@ -16,7 +16,7 @@ class Recurring
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($item->recurring->getRecurringSchedule() as $schedule) {
|
foreach ($item->recurring->getRecurringSchedule(false) as $schedule) {
|
||||||
$issued = Date::parse($item->$issued_date_field);
|
$issued = Date::parse($item->$issued_date_field);
|
||||||
$start = $schedule->getStart();
|
$start = $schedule->getStart();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user