warehouseId()) ? [$this->warehouseId()] : $this->warehouseId(); } protected function isItemWarehouse() { return get_class($this) === ItemWarehouse::class; } /** * @return Item */ public function item() { $item = $this->belongsTo(Item::class) ->with( ['bundlings' => function ($q) { return $q->inWarehouse($this->_warehouseId()); }], )->with( ['bundles' => function ($q) { return $q->wherePivotIn('from_warehouse_id', $this->_warehouseId()); }] )->with( ['adjustments' => function ($q) { return $q->whereIn('warehouse_id', $this->_warehouseId()); }] ); if (!$this->isItemWarehouse()) { $item = $item->with( ['warehouses' => function ($q) { return $q->whereIn('id', $this->_warehouseId()); }] ); } return $item; } public function getOpeningStockAttribute() { return $this->isItemWarehouse() ? $this->initial_stock : $this->item->warehouses->sum('pivot.initial_stock'); } public function getQtyToBundlesAttribute() { return $this->item->bundles->sum(function ($bundle) { return $bundle->qty_to_bundle * $bundle->pivot->qty; }) ?? 0; } public function getQtyFromBundlingsAttribute() { return $this->item->bundlings->sum( 'qty_to_bundle' ); } public function getQtyAdjustmentsAttribute() { return $this->item->adjustments->sum( 'pivot.qty_adjusted' ); } public function getQtyToTransferAttribute() { return $this->item->transferOrders()->whereIn('source_warehouse_id', $this->_warehouseId()) ->sum( 'item_transfer_order.qty_transfer' ); } public function getQtyFromTransferAttribute() { return $this->item->transferOrders()->whereIn('destination_warehouse_id', $this->_warehouseId()) ->sum( 'item_transfer_order.qty_transfer' ); } public function getQtyToSaleOrderAttribute() { return $this->item->saleOrders()->whereIn('warehouse_id', $this->_warehouseId()) ->where(function ($q) { return $q->whereHas('payments') ->orWhereHas('invoice', function ($q) { return $q->sent(); }); })->sum( 'item_sale_order.qty' ); } public function getQtyFromPurchaseOrderAttribute() { return $this->item->purchaseOrders()->whereIn('warehouse_id', $this->_warehouseId()) ->where(function ($q) { return $q->whereHas('payments') ->orWhereHas('bill', function ($q) { return $q->open(); }); })->sum( 'item_purchase_order.qty' ); } public function getCommittedStockAttribute() { return $this->item->saleOrders() ->whereIn('warehouse_id', $this->_warehouseId()) ->where(function($q) { return $q->whereDoesntHave('invoice', function ($q) { return $q->sent(); })->whereDoesntHave('payments'); })->sum( 'item_sale_order.qty' ); } public function getStockOnHandAttribute() { return (double) round($this->stock_left + $this->committed_stock); } /** * Menghitung total stock pada item * * @return double */ public function getStockLeftAttribute() { $stockLeft = // stok pembuka $this->opening_stock + // dari paket bundling $this->qty_from_bundlings - // untuk paket bundling $this->qty_to_bundles + // penyesuaian item $this->qty_adjustments - // transfer untuk gudang lain $this->qty_to_transfer + // transfer dari gudang lain $this->qty_from_transfer - // transfer dari sale order yang belum "paid" atau "invoices" "sent" $this->committed_stock - $this->qty_to_sale_order + // transfer dari purchase order yang sudah "paid" atau "bill" "open" $this->qty_from_purchase_order; return (double) round($stockLeft); } }