inspiren-sem-tool/app/Models/Client.php

89 lines
2.6 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\ClientProjectActivities;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Client extends Model
{
use HasFactory;
protected $fillable = ['name','customer_id','status','time_zone','industry','sql_acc_code'];
protected $appends = [
'latest_remaining_amount',
];
public function campaigns()
{
return $this->hasMany(GoogleCampaign::class);
}
public function assignations()
{
return $this->hasMany(ClientUserAssignation::class);
}
public function invoices(): HasMany
{
return $this->hasMany(ClientInvoice::class);
}
public function invoiceAdjustments(): HasMany
{
return $this->hasMany(ClientInvoiceAdjustment::class);
}
public function getLatestRemainingAmountAttribute(): string
{
return $this->latestRemainingAmount();
}
public function latestRemainingAmount(): string
{
$invoices = $this->relationLoaded('invoices')
? $this->invoices
: $this->invoices()->with('payments.items.billingItemType')->get();
$invoices->loadMissing('payments.items.billingItemType');
$adjustments = $this->relationLoaded('invoiceAdjustments')
? $this->invoiceAdjustments
: $this->invoiceAdjustments()->get(['client_id', 'entry_type', 'amount']);
$items = $invoices->flatMap(fn (ClientInvoice $invoice) => $invoice->payments)
->flatMap(fn ($payment) => $payment->items);
$nettAmount = $items
->filter(fn ($item) => ! $item->is_creditcard && ($item->billingItemType?->nett_contribution ?? false))
->sum(fn ($item) => (float) ($item->final_net_amount ?? $item->net_amount ?? 0));
$billableSpending = $items
->reject(fn ($item) => $item->is_creditcard)
->sum(fn ($item) => (float) ($item->spending ?? 0));
$adjustmentNet = $adjustments->sum(function (ClientInvoiceAdjustment $adjustment) {
$amount = (float) ($adjustment->amount ?? 0);
return $adjustment->entry_type === ClientInvoiceAdjustment::TYPE_CREDIT
? $amount
: -$amount;
});
return number_format(max(0, $nettAmount + $adjustmentNet - $billableSpending), 2, '.', '');
}
public function activitiesList(): HasMany
{
return $this->hasMany(ClientProjectActivities::class);
}
public function customers()
{
return $this->hasMany(ClientCustomer::class);
}
}