hasMany(InvoiceItem::class)->orderBy('id', 'ASC'); } public function container() { return $this->belongsTo(Container::class); } public function customer() { return $this->belongsTo(User::class, 'customer_id'); } public function installments() { return $this->hasMany(InvoiceInstallment::class); } public function chargeGroups() { return $this->hasMany(InvoiceChargeGroup::class, 'invoice_id'); } /**************************** * Helper Functions ****************************/ // (Items based calculateTotals वापरणार नाहीस तरी ठेवू शकतोस) public function calculateTotals() { $gst = ($this->final_amount * $this->gst_percent) / 100; $this->gst_amount = $gst; $this->final_amount_with_gst = $this->final_amount + $gst; } public function isOverdue() { return $this->status === 'pending' && now()->gt($this->due_date); } public function getShipment() { return null; } // ✅ Charge groups base total (WITHOUT GST) public function getChargeGroupsTotalAttribute() { // base = total_charge sum return (float) $this->chargeGroups->sum('total_charge'); } // ✅ Grand total: Charge groups base + GST (items ignore) public function getGrandTotalWithChargesAttribute() { $base = (float) ($this->charge_groups_total ?? 0); $gst = (float) ($this->gst_amount ?? 0); return $base + $gst; } public function totalPaid(): float { return (float) $this->installments()->sum('amount'); } public function remainingAmount(): float { $grand = (float) $this->grand_total_with_charges; $paid = (float) $this->totalPaid(); return max(0, $grand - $paid); } }