mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 17:24:10 +00:00
Complete the type modernization across all models. Adds Builder-typed $query parameters and return types to all scope methods, typed parameters on accessors, and PHPDoc on scopePaginateData/scopeApplyFilters. Models updated: Address, EstimateItem, Expense, ExpenseCategory, InvoiceItem, Item, Note, Tax, TaxType, Unit. 5 models needed no changes (Country, Currency, ImpersonationLog, Module, UserSetting) as they had no untyped public methods.
88 lines
2.3 KiB
PHP
88 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Traits\HasCustomFieldsTrait;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class InvoiceItem extends Model
|
|
{
|
|
use HasCustomFieldsTrait;
|
|
use HasFactory;
|
|
|
|
protected $guarded = [
|
|
'id',
|
|
];
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'price' => 'integer',
|
|
'total' => 'integer',
|
|
'discount' => 'float',
|
|
'quantity' => 'float',
|
|
'discount_val' => 'integer',
|
|
'tax' => 'integer',
|
|
];
|
|
}
|
|
|
|
public function invoice(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Invoice::class);
|
|
}
|
|
|
|
public function item(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Item::class);
|
|
}
|
|
|
|
public function taxes(): HasMany
|
|
{
|
|
return $this->hasMany(Tax::class);
|
|
}
|
|
|
|
public function recurringInvoice(): BelongsTo
|
|
{
|
|
return $this->belongsTo(RecurringInvoice::class);
|
|
}
|
|
|
|
public function scopeWhereCompany(Builder $query, int $company_id): void
|
|
{
|
|
$query->where('company_id', $company_id);
|
|
}
|
|
|
|
public function scopeInvoicesBetween(Builder $query, Carbon $start, Carbon $end): void
|
|
{
|
|
$query->whereHas('invoice', function ($query) use ($start, $end) {
|
|
$query->whereBetween(
|
|
'invoice_date',
|
|
[$start->format('Y-m-d'), $end->format('Y-m-d')]
|
|
);
|
|
});
|
|
}
|
|
|
|
public function scopeApplyInvoiceFilters(Builder $query, array $filters): void
|
|
{
|
|
$filters = collect($filters);
|
|
|
|
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->invoicesBetween($start, $end);
|
|
}
|
|
}
|
|
|
|
public function scopeItemAttributes(Builder $query): void
|
|
{
|
|
$query->select(
|
|
DB::raw('sum(quantity) as total_quantity, sum(base_total) as total_amount, invoice_items.name')
|
|
)->groupBy('invoice_items.name');
|
|
}
|
|
}
|