\App\Enums\ShipmentDirection::class, 'type' => \App\Enums\ShipmentType::class, 'status' => \App\Enums\ShipmentStatus::class, 'weight' => 'decimal:2', 'volumetric_weight' => 'decimal:2', 'chargeable_weight' => 'decimal:2', 'shipping_price' => 'decimal:2', 'extra_service' => 'decimal:2', 'packing_cost' => 'decimal:2', 'domestic_pickup' => 'decimal:2', 'domestic_delivery' => 'decimal:2', 'warehousing_cost' => 'decimal:2', 'vat_amount' => 'decimal:2', 'discount' => 'decimal:2', 'total_fee' => 'decimal:2', 'net_dirham' => 'decimal:2', 'net_rial' => 'decimal:2', 'cod_amount' => 'decimal:2', 'declared_value' => 'decimal:2', ]; } public function user(): BelongsTo { return $this->belongsTo(User::class); } 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 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); } public function statusHistories(): HasMany { return $this->hasMany(ShipmentStatusHistory::class)->orderByDesc('created_at'); } public function isParcel(): bool { return $this->type === \App\Enums\ShipmentType::Parcel; } public function isDocument(): bool { return $this->type !== \App\Enums\ShipmentType::Parcel; } public function getInvoiceTotalUsdAttribute(): float { return $this->items->sum('total_usd'); } public function packages(): HasMany { return $this->hasMany(ShipmentPackage::class)->orderBy('package_no'); } }