'string', 'exchange_rate' => 'float', ]; } protected static function booted() { static::created(function ($payment) { GeneratePaymentPdfJob::dispatch($payment); }); static::updated(function ($payment) { GeneratePaymentPdfJob::dispatch($payment, true); }); } public function setSettingsAttribute($value) { if ($value) { $this->attributes['settings'] = json_encode($value); } } public function getFormattedCreatedAtAttribute($value) { $dateFormat = CompanySetting::getSetting('carbon_date_format', $this->company_id); return Carbon::parse($this->created_at)->translatedFormat($dateFormat); } public function getFormattedPaymentDateAttribute($value) { $dateFormat = CompanySetting::getSetting('carbon_date_format', $this->company_id); return Carbon::parse($this->payment_date)->translatedFormat($dateFormat); } public function getPaymentPdfUrlAttribute() { return url('/payments/pdf/'.$this->unique_hash); } public function transaction(): BelongsTo { return $this->belongsTo(Transaction::class); } public function emailLogs(): MorphMany { return $this->morphMany('App\Models\EmailLog', 'mailable'); } public function customer(): BelongsTo { return $this->belongsTo(Customer::class, 'customer_id'); } public function company(): BelongsTo { return $this->belongsTo(Company::class); } public function invoice(): BelongsTo { return $this->belongsTo(Invoice::class); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'creator_id'); } public function currency(): BelongsTo { return $this->belongsTo(Currency::class); } public function paymentMethod(): BelongsTo { return $this->belongsTo(PaymentMethod::class); } public function scopeWhereSearch($query, $search) { foreach (explode(' ', $search) as $term) { $query->whereHas('customer', function ($query) use ($term) { $query->where('name', 'LIKE', '%'.$term.'%') ->orWhere('contact_name', 'LIKE', '%'.$term.'%') ->orWhere('company_name', 'LIKE', '%'.$term.'%'); }); } } public function scopePaymentNumber($query, $paymentNumber) { return $query->where('payments.payment_number', 'LIKE', '%'.$paymentNumber.'%'); } public function scopePaymentMethod($query, $paymentMethodId) { return $query->where('payments.payment_method_id', $paymentMethodId); } public function scopePaginateData($query, $limit) { if ($limit == 'all') { return $query->get(); } return $query->paginate($limit); } public function scopeApplyFilters($query, array $filters) { $filters = collect($filters); if ($filters->get('search')) { $query->whereSearch($filters->get('search')); } if ($filters->get('payment_number')) { $query->paymentNumber($filters->get('payment_number')); } if ($filters->get('payment_id')) { $query->wherePayment($filters->get('payment_id')); } if ($filters->get('payment_method_id')) { $query->paymentMethod($filters->get('payment_method_id')); } if ($filters->get('customer_id')) { $query->whereCustomer($filters->get('customer_id')); } if ($filters->get('from_date') && $filters->get('to_date')) { $start = Carbon::createFromFormat('Y-m-d', $filters->get('from_date')); $end = Carbon::createFromFormat('Y-m-d', $filters->get('to_date')); $query->paymentsBetween($start, $end); } if ($filters->get('orderByField') || $filters->get('orderBy')) { $field = $filters->get('orderByField') ? $filters->get('orderByField') : 'sequence_number'; $orderBy = $filters->get('orderBy') ? $filters->get('orderBy') : 'desc'; $query->whereOrder($field, $orderBy); } } public function scopePaymentsBetween($query, $start, $end) { return $query->whereBetween( 'payments.payment_date', [$start->format('Y-m-d'), $end->format('Y-m-d')] ); } public function scopeWhereOrder($query, $orderByField, $orderBy) { $query->orderBy($orderByField, $orderBy); } public function scopeWherePayment($query, $payment_id) { $query->orWhere('id', $payment_id); } public function scopeWhereCompany($query) { $query->where('payments.company_id', request()->header('company')); } public function scopeWhereCustomer($query, $customer_id) { $query->where('payments.customer_id', $customer_id); } public function getPDFData() { return app(PaymentService::class)->getPdfData($this); } public function getCompanyAddress() { if ($this->company && (! $this->company->address()->exists())) { return false; } $format = CompanySetting::getSetting('payment_company_address_format', $this->company_id); return $this->getFormattedString($format); } public function getCustomerBillingAddress() { if ($this->customer && (! $this->customer->billingAddress()->exists())) { return false; } $format = CompanySetting::getSetting('payment_from_customer_address_format', $this->company_id); return $this->getFormattedString($format); } public function getEmailAttachmentSetting() { $paymentAsAttachment = CompanySetting::getSetting('payment_email_attachment', $this->company_id); if ($paymentAsAttachment == 'NO') { return false; } return true; } public function getNotes() { return PdfHtmlSanitizer::sanitize($this->getFormattedString($this->notes)); } public function getEmailBody($body) { $values = array_merge($this->getFieldsArray(), $this->getExtraFields()); $body = strtr($body, $values); return preg_replace('/{(.*?)}/', '', $body); } public function getExtraFields() { return [ '{PAYMENT_DATE}' => $this->formattedPaymentDate, '{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null, '{PAYMENT_NUMBER}' => $this->payment_number, '{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency), ]; } }