mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 04:17:34 -05:00 
			
		
		
		
	Refactor the way we execute scheduled commands
This commit is contained in:
		
							parent
							
								
									ea5b950a54
								
							
						
					
					
						commit
						5c60dab8c6
					
				@ -54,13 +54,13 @@ class Kernel extends ConsoleKernel
 | 
				
			|||||||
        $schedule->job(new ReminderJob)->hourly()->withoutOverlapping()->name('reminder-job')->onOneServer();
 | 
					        $schedule->job(new ReminderJob)->hourly()->withoutOverlapping()->name('reminder-job')->onOneServer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Returns the number of jobs in the queue */
 | 
					        /* Returns the number of jobs in the queue */
 | 
				
			||||||
        $schedule->job(new QueueSize)->everyFiveMinutes()->withoutOverlapping();
 | 
					        $schedule->job(new QueueSize)->everyFiveMinutes()->withoutOverlapping()->name('queue-size-job')->onOneServer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Checks for large companies and marked them as is_large */
 | 
					        /* Checks for large companies and marked them as is_large */
 | 
				
			||||||
        $schedule->job(new CompanySizeCheck)->dailyAt('23:20')->withoutOverlapping()->name('company-size-job')->onOneServer();
 | 
					        $schedule->job(new CompanySizeCheck)->dailyAt('23:20')->withoutOverlapping()->name('company-size-job')->onOneServer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Pulls in the latest exchange rates */
 | 
					        /* Pulls in the latest exchange rates */
 | 
				
			||||||
        $schedule->job(new UpdateExchangeRates)->dailyAt('23:30')->withoutOverlapping();
 | 
					        $schedule->job(new UpdateExchangeRates)->dailyAt('23:30')->withoutOverlapping()->name('exchange-rate-job')->onOneServer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Runs cleanup code for subscriptions */
 | 
					        /* Runs cleanup code for subscriptions */
 | 
				
			||||||
        $schedule->job(new SubscriptionCron)->dailyAt('00:01')->withoutOverlapping()->name('subscription-job')->onOneServer();
 | 
					        $schedule->job(new SubscriptionCron)->dailyAt('00:01')->withoutOverlapping()->name('subscription-job')->onOneServer();
 | 
				
			||||||
 | 
				
			|||||||
@ -46,19 +46,7 @@ class RecurringExpensesCron
 | 
				
			|||||||
        nlog('Sending recurring expenses '.Carbon::now()->format('Y-m-d h:i:s'));
 | 
					        nlog('Sending recurring expenses '.Carbon::now()->format('Y-m-d h:i:s'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (! config('ninja.db.multi_db_enabled')) {
 | 
					        if (! config('ninja.db.multi_db_enabled')) {
 | 
				
			||||||
            $this->getRecurringExpenses();
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            //multiDB environment, need to
 | 
					 | 
				
			||||||
            foreach (MultiDB::$dbs as $db) {
 | 
					 | 
				
			||||||
                MultiDB::setDB($db);
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
                $this->getRecurringExpenses();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private function getRecurringExpenses()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
            $recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString())
 | 
					            $recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString())
 | 
				
			||||||
                                                        ->whereNotNull('next_send_date')
 | 
					                                                        ->whereNotNull('next_send_date')
 | 
				
			||||||
                                                        ->whereNull('deleted_at')
 | 
					                                                        ->whereNull('deleted_at')
 | 
				
			||||||
@ -79,6 +67,41 @@ class RecurringExpensesCron
 | 
				
			|||||||
                    $this->generateExpense($recurring_expense);
 | 
					                    $this->generateExpense($recurring_expense);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            //multiDB environment, need to
 | 
				
			||||||
 | 
					            foreach (MultiDB::$dbs as $db) {
 | 
				
			||||||
 | 
					                MultiDB::setDB($db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $recurring_expenses = RecurringExpense::where('next_send_date', '<=', now()->toDateTimeString())
 | 
				
			||||||
 | 
					                                                                ->whereNotNull('next_send_date')
 | 
				
			||||||
 | 
					                                                                ->whereNull('deleted_at')
 | 
				
			||||||
 | 
					                                                                ->where('status_id', RecurringInvoice::STATUS_ACTIVE)
 | 
				
			||||||
 | 
					                                                                ->where('remaining_cycles', '!=', '0')
 | 
				
			||||||
 | 
					                                                                ->whereHas('company', function ($query) {
 | 
				
			||||||
 | 
					                                                                    $query->where('is_disabled', 0);
 | 
				
			||||||
 | 
					                                                                })
 | 
				
			||||||
 | 
					                                                                ->with('company')
 | 
				
			||||||
 | 
					                                                                ->cursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    nlog(now()->format('Y-m-d').' Generating Recurring Expenses. Count = '.$recurring_expenses->count());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $recurring_expenses->each(function ($recurring_expense, $key) {
 | 
				
			||||||
 | 
					                        nlog('Current date = '.now()->format('Y-m-d').' Recurring date = '.$recurring_expense->next_send_date);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (! $recurring_expense->company->is_disabled) {
 | 
				
			||||||
 | 
					                            $this->generateExpense($recurring_expense);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function getRecurringExpenses()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //extracting this back to the if/else block to test duplicate crons
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function generateExpense(RecurringExpense $recurring_expense)
 | 
					    private function generateExpense(RecurringExpense $recurring_expense)
 | 
				
			||||||
 | 
				
			|||||||
@ -44,22 +44,13 @@ class BankTransactionSync implements ShouldQueue
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function handle()
 | 
					    public function handle()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // if (! Ninja::isHosted()) {
 | 
					 | 
				
			||||||
        //     return;
 | 
					 | 
				
			||||||
        // }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //multiDB environment, need to
 | 
					        //multiDB environment, need to
 | 
				
			||||||
        foreach (MultiDB::$dbs as $db) {
 | 
					        foreach (MultiDB::$dbs as $db) 
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            MultiDB::setDB($db);
 | 
					            MultiDB::setDB($db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            nlog("syncing transactions");
 | 
					            nlog("syncing transactions");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->syncTransactions();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public function syncTransactions()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
                $a = Account::with('bank_integrations')->whereNotNull('bank_integration_account_id')->cursor()->each(function ($account){
 | 
					                $a = Account::with('bank_integrations')->whereNotNull('bank_integration_account_id')->cursor()->each(function ($account){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // $queue = Ninja::isHosted() ? 'bank' : 'default';
 | 
					                    // $queue = Ninja::isHosted() ? 'bank' : 'default';
 | 
				
			||||||
@ -77,5 +68,6 @@ class BankTransactionSync implements ShouldQueue
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -42,21 +42,8 @@ class QuoteCheckExpired implements ShouldQueue
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function handle()
 | 
					    public function handle()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (! config('ninja.db.multi_db_enabled'))
 | 
					        if (! config('ninja.db.multi_db_enabled')){
 | 
				
			||||||
            return $this->checkForExpiredQuotes();
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
        foreach (MultiDB::$dbs as $db) {
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            MultiDB::setDB($db);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            $this->checkForExpiredQuotes();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private function checkForExpiredQuotes()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
            Quote::query()
 | 
					            Quote::query()
 | 
				
			||||||
                 ->where('status_id', Quote::STATUS_SENT)
 | 
					                 ->where('status_id', Quote::STATUS_SENT)
 | 
				
			||||||
                 ->where('is_deleted', false)
 | 
					                 ->where('is_deleted', false)
 | 
				
			||||||
@ -75,6 +62,41 @@ class QuoteCheckExpired implements ShouldQueue
 | 
				
			|||||||
                 ->each(function ($quote){
 | 
					                 ->each(function ($quote){
 | 
				
			||||||
                        $this->queueExpiredQuoteNotification($quote);
 | 
					                        $this->queueExpiredQuoteNotification($quote);
 | 
				
			||||||
                 });
 | 
					                 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            foreach (MultiDB::$dbs as $db) 
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                MultiDB::setDB($db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                 Quote::query()
 | 
				
			||||||
 | 
					                     ->where('status_id', Quote::STATUS_SENT)
 | 
				
			||||||
 | 
					                     ->where('is_deleted', false)
 | 
				
			||||||
 | 
					                     ->whereNull('deleted_at')
 | 
				
			||||||
 | 
					                     ->whereNotNull('due_date')
 | 
				
			||||||
 | 
					                     ->whereHas('client', function ($query) {
 | 
				
			||||||
 | 
					                            $query->where('is_deleted', 0)
 | 
				
			||||||
 | 
					                                   ->where('deleted_at', null);
 | 
				
			||||||
 | 
					                        })
 | 
				
			||||||
 | 
					                        ->whereHas('company', function ($query) {
 | 
				
			||||||
 | 
					                            $query->where('is_disabled', 0);
 | 
				
			||||||
 | 
					                        })
 | 
				
			||||||
 | 
					                     // ->where('due_date', '<='. now()->toDateTimeString())
 | 
				
			||||||
 | 
					                     ->whereBetween('due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()])
 | 
				
			||||||
 | 
					                     ->cursor()
 | 
				
			||||||
 | 
					                     ->each(function ($quote){
 | 
				
			||||||
 | 
					                            $this->queueExpiredQuoteNotification($quote);
 | 
				
			||||||
 | 
					                     });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function checkForExpiredQuotes()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function queueExpiredQuoteNotification(Quote $quote)
 | 
					    private function queueExpiredQuoteNotification(Quote $quote)
 | 
				
			||||||
 | 
				
			|||||||
@ -44,25 +44,18 @@ class ReminderJob implements ShouldQueue
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return void
 | 
					     * @return void
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function handle()
 | 
					    public function handle() :void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (! config('ninja.db.multi_db_enabled')) {
 | 
					        if (! config('ninja.db.multi_db_enabled')) {
 | 
				
			||||||
            $this->processReminders();
 | 
					            $this->processReminders();
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            //multiDB environment, need to
 | 
					            //multiDB environment, need to
 | 
				
			||||||
            /*
 | 
					            
 | 
				
			||||||
            foreach (MultiDB::$dbs as $db) {
 | 
					            foreach (MultiDB::$dbs as $db) {
 | 
				
			||||||
                MultiDB::setDB($db);
 | 
					                MultiDB::setDB($db);
 | 
				
			||||||
                nlog("set db {$db}");
 | 
					                nlog("set db {$db}");
 | 
				
			||||||
                $this->processReminders();
 | 
					                $this->processReminders();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            */
 | 
					 | 
				
			||||||
            //24-11-2022 fix for potential memory leak during a long running process, the second reminder may run twice
 | 
					 | 
				
			||||||
            foreach (config('ninja.dbs') as $db) {
 | 
					 | 
				
			||||||
                MultiDB::setDB($db);
 | 
					 | 
				
			||||||
                nlog("set db {$db}");
 | 
					 | 
				
			||||||
                $this->processReminders();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user