company = $company; $this->invoice = $invoice; $this->old_invoice = $old_invoice; } /** * Execute the job. * * * @return false */ public function handle() { MultiDB::setDb($this->company->db); if(count($this->old_invoice) > 0) $this->existingInventoryAdjustment(); return $this->newInventoryAdjustment(); } public function middleware() { return [new WithoutOverlapping($this->company->company_key)]; } private function newInventoryAdjustment() { $line_items = $this->invoice->line_items; foreach($line_items as $item) { $p = Product::where('product_key', $item->product_key)->where('company_id', $this->company->id)->where('in_stock_quantity', '>', 0)->first(); if(!$p) continue; $p->in_stock_quantity -= $item->quantity; $p->saveQuietly(); if($p->stock_notification_threshold && $p->in_stock_quantity <= $p->stock_notification_threshold) $this->notifyStockLevels($p, 'product'); elseif($this->company->stock_notification_threshold && $p->in_stock_quantity <= $this->company->stock_notification_threshold) $this->notifyStocklevels($p, 'company'); } } private function existingInventoryAdjustment() { foreach($this->old_invoice as $item) { $p = Product::where('product_key', $item->product_key)->where('company_id', $this->company->id)->first(); if(!$p) continue; $p->in_stock_quantity += $item->quantity; $p->saveQuietly(); } } private function notifyStocklevels(Product $product, string $notification_level) { $nmo = new NinjaMailerObject; $nmo->mailable = new NinjaMailer( (new InventoryNotificationObject($product, $notification_level))->build() ); $nmo->company = $this->company; $nmo->settings = $this->company->settings; $nmo->to_user = $this->company->owner(); NinjaMailerJob::dispatch($nmo); } }