'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 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->save();
            }
        });
    }
    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');
    }
}