- rate approval: API creates pending proposals, manager approves - customer_credits + credit_settlements tables - CustomerCreditService (grant/settle via wallet) - rebuilt CustomerCreditResource - CustomerFinancialController: real foreign-currency debt - WP login redirect + custom login page wiring
206 lines
4.9 KiB
PHP
206 lines
4.9 KiB
PHP
<?php
|
||
|
||
namespace App\Models;
|
||
|
||
use Illuminate\Database\Eloquent\Model;
|
||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||
use App\Traits\Auditable;
|
||
|
||
class Shipment extends Model
|
||
{
|
||
use Auditable;
|
||
protected $fillable = [
|
||
'awb_no',
|
||
'forwarder',
|
||
'direction',
|
||
'type',
|
||
'status',
|
||
'review_state',
|
||
'from_country_id',
|
||
'to_country_id',
|
||
// Weight & Dimensions
|
||
'weight',
|
||
'volumetric_weight',
|
||
'chargeable_weight',
|
||
'dimensions',
|
||
// Financial
|
||
'shipping_price',
|
||
'extra_service',
|
||
'domestic_pickup',
|
||
'packing_cost',
|
||
'domestic_delivery',
|
||
'warehousing_cost',
|
||
'discount',
|
||
'vat_amount',
|
||
'total_fee',
|
||
'net_dirham',
|
||
'net_rial',
|
||
'invoice_total_usd',
|
||
'cod_amount',
|
||
'declared_value',
|
||
// Import Invoice Fields
|
||
'brand_fee',
|
||
'report_fee',
|
||
'customs_clearance_cost',
|
||
'order_registration_fee',
|
||
'other_clearance_charges',
|
||
'exchange_rate',
|
||
'goods_nature',
|
||
'invoice_currency',
|
||
// Sender
|
||
'sender_name',
|
||
'sender_company',
|
||
'sender_phone',
|
||
'sender_email',
|
||
'sender_address',
|
||
'sender_city',
|
||
'sender_zip',
|
||
'sender_id_number',
|
||
// Receiver
|
||
'receiver_name',
|
||
'receiver_company',
|
||
'receiver_phone',
|
||
'receiver_email',
|
||
'receiver_address',
|
||
'receiver_city',
|
||
'receiver_zip',
|
||
'receiver_id_number',
|
||
// Customs
|
||
'reason_for_export',
|
||
'content_description',
|
||
'customer_notes',
|
||
// User
|
||
'user_id',
|
||
];
|
||
|
||
protected $casts = [
|
||
'weight' => 'decimal:3',
|
||
'volumetric_weight' => 'decimal:3',
|
||
'chargeable_weight' => 'decimal:3',
|
||
'status' => \App\Enums\ShipmentStatus::class,
|
||
'review_state' => \App\Enums\ReviewState::class,
|
||
'direction' => \App\Enums\ShipmentDirection::class,
|
||
'type' => \App\Enums\ShipmentType::class,
|
||
];
|
||
|
||
// === Relationships ===
|
||
|
||
public function fromCountry(): BelongsTo
|
||
{
|
||
return $this->belongsTo(Country::class, 'from_country_id');
|
||
}
|
||
|
||
public function toCountry(): BelongsTo
|
||
{
|
||
return $this->belongsTo(Country::class, 'to_country_id');
|
||
}
|
||
|
||
public function user(): BelongsTo
|
||
{
|
||
return $this->belongsTo(User::class);
|
||
}
|
||
|
||
public function items(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentItem::class);
|
||
}
|
||
|
||
public function carrierMappings(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentCarrierMapping::class);
|
||
}
|
||
|
||
public function trackingEvents(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentTrackingEvent::class);
|
||
}
|
||
|
||
/**
|
||
* بستههای مرسوله (Multi-Package)
|
||
*/
|
||
public function packages(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentPackage::class);
|
||
}
|
||
|
||
public function reviews(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentReview::class)
|
||
->orderBy('revision_no');
|
||
}
|
||
|
||
/**
|
||
* چکلیستهای عملیاتی مرسوله
|
||
*/
|
||
public function checklists(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentChecklist::class)
|
||
->orderBy('created_at', 'desc');
|
||
}
|
||
|
||
/**
|
||
* تعهدنامههای مرسوله (instanceهای پرشده توسط مشتری)
|
||
*/
|
||
public function commitmentForms(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentCommitmentForm::class)
|
||
->orderBy('created_at', 'desc');
|
||
}
|
||
|
||
/**
|
||
* تاریخچه تغییرات وضعیت مرسوله
|
||
*/
|
||
public function statusHistories(): HasMany
|
||
{
|
||
return $this->hasMany(ShipmentStatusHistory::class)
|
||
->orderBy('created_at', 'desc');
|
||
}
|
||
|
||
/**
|
||
* اعتبارها (بدهیهای چندارزی) مرتبط با این مرسوله
|
||
*/
|
||
public function credits(): HasMany
|
||
{
|
||
return $this->hasMany(CustomerCredit::class);
|
||
}
|
||
|
||
// === Scopes ===
|
||
|
||
public function scopeByAwb($query, string $awbNo)
|
||
{
|
||
return $query->where('awb_no', $awbNo);
|
||
}
|
||
|
||
public function scopeExport($query)
|
||
{
|
||
return $query->where('direction', 'export');
|
||
}
|
||
|
||
public function scopeImport($query)
|
||
{
|
||
return $query->where('direction', 'import');
|
||
}
|
||
|
||
// === Helpers ===
|
||
|
||
/**
|
||
* دریافت آخرین رویداد ترکینگ
|
||
*/
|
||
public function latestTrackingEvent()
|
||
{
|
||
return $this->trackingEvents()
|
||
->orderBy('event_date', 'desc')
|
||
->orderBy('event_time', 'desc')
|
||
->first();
|
||
}
|
||
|
||
/**
|
||
* آیا مرسوله تحویل داده شده؟
|
||
*/
|
||
public function isDelivered(): bool
|
||
{
|
||
return $this->status === 'delivered';
|
||
}
|
||
}
|