'object', 'backup' => 'object', 'updated_at' => 'timestamp', 'created_at' => 'timestamp', 'deleted_at' => 'timestamp', 'is_amount_discount' => 'bool', ]; const STATUS_DRAFT = 1; const STATUS_SENT = 2; const STATUS_ACCEPTED = 3; const STATUS_RECEIVED = 4; const STATUS_CANCELLED = 5; public static function stringStatus(int $status) { switch ($status) { case self::STATUS_DRAFT: return ctrans('texts.draft'); break; case self::STATUS_SENT: return ctrans('texts.sent'); break; case self::STATUS_ACCEPTED: return ctrans('texts.accepted'); break; case self::STATUS_CANCELLED: return ctrans('texts.cancelled'); break; // code... break; } } public static function badgeForStatus(int $status) { switch ($status) { case self::STATUS_DRAFT: return '
'.ctrans('texts.draft').'
'; break; case self::STATUS_SENT: return '
'.ctrans('texts.sent').'
'; break; case self::STATUS_ACCEPTED: return '
'.ctrans('texts.accepted').'
'; break; case self::STATUS_CANCELLED: return '
'.ctrans('texts.cancelled').'
'; break; default: // code... break; } } public function getEntityType() { return self::class; } public function assigned_user() { return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } public function vendor() { return $this->belongsTo(Vendor::class)->withTrashed(); } public function history() { return $this->hasManyThrough(Backup::class, Activity::class); } public function activities() { return $this->hasMany(Activity::class)->orderBy('id', 'DESC')->take(50); } public function company() { return $this->belongsTo(Company::class); } public function expense() { return $this->belongsTo(Expense::class); } public function user() { return $this->belongsTo(User::class)->withTrashed(); } public function client() { return $this->belongsTo(Client::class)->withTrashed(); } public function markInvitationsSent() { $this->invitations->each(function ($invitation) { if (! isset($invitation->sent_date)) { $invitation->sent_date = Carbon::now(); $invitation->saveQuietly(); } }); } public function pdf_file_path($invitation = null, string $type = 'path', bool $portal = false) { if (! $invitation) { if ($this->invitations()->exists()) { $invitation = $this->invitations()->first(); } else { $this->service()->createInvitations(); $invitation = $this->invitations()->first(); } } if (!$invitation) { throw new \Exception('Hard fail, could not create an invitation - is there a valid contact?'); } $file_path = $this->vendor->purchase_order_filepath($invitation).$this->numberFormatter().'.pdf'; if (Ninja::isHosted() && $portal && Storage::disk(config('filesystems.default'))->exists($file_path)) { return Storage::disk(config('filesystems.default'))->{$type}($file_path); } elseif (Ninja::isHosted() && $portal) { $file_path = (new CreatePurchaseOrderPdf($invitation, config('filesystems.default')))->handle(); return Storage::disk(config('filesystems.default'))->{$type}($file_path); } if (Storage::disk('public')->exists($file_path)) { return Storage::disk('public')->{$type}($file_path); } $file_path = (new CreatePurchaseOrderPdf($invitation))->handle(); return Storage::disk('public')->{$type}($file_path); } public function invitations() { return $this->hasMany(PurchaseOrderInvitation::class); } public function project() { return $this->belongsTo(Project::class)->withTrashed(); } public function invoice() { return $this->belongsTo(Invoice::class); } /** @return PurchaseOrderService */ public function service() :PurchaseOrderService { return new PurchaseOrderService($this); } public function invoices() { return $this->belongsToMany(Invoice::class)->using(Paymentable::class); } public function payments() { return $this->morphToMany(Payment::class, 'paymentable'); } public function documents() { return $this->morphMany(Document::class, 'documentable'); } public function calc() { $purchase_order_calc = null; if ($this->uses_inclusive_taxes) { $purchase_order_calc = new InvoiceSumInclusive($this); } else { $purchase_order_calc = new InvoiceSum($this); } return $purchase_order_calc->build(); } public function translate_entity() { return ctrans('texts.purchase_order'); } }