model->with($relationships)->select($select); if (isset($data['client']) && ! empty($data['client'])) { $model = $model->where("customer_id", $data['client']); } if (isset($data['invoice_type'])) { $model = $model->where("invoice_type", $data['invoice_type']); } if (isset($data['parent_id'])) { $model = $model->where("parent_id", $data['parent_id']); } if (isset($data['customer_id'])) { $model = $model->where("customer_id", $data['customer_id']); } if (isset($data['payment_method']) && $data['payment_method'] !== 'full') { $model = $model->where("payment_method", $data['payment_method']); } if (isset($data['invoice_id'])) { $model = $model->where("invoice_id", $data['invoice_id']); } if (isset($data['date'])) { $data = explode("-", $data['date']); $model = $model->whereBetween( 'date', [Carbon::parse($data[0])->timestamp, Carbon::parse($data[1])->timestamp] ); } if (isset($data['due_date'])) { $data = explode("-", $data['due_date']); $model = $model->whereBetween( 'due_date', [Carbon::parse($data[0])->timestamp, Carbon::parse($data[1])->timestamp] ); } if (isset($data['date_paid'])) { $date = explode("-", $data['date_paid']); $model = $model->where(function ($query) use ($date) { $query->wherNotNull(); $query->whereBetween( 'date_paid', [Carbon::parse($date[0])->timestamp, Carbon::parse($date[1])->timestamp] ); }); } $model = $this->whereStatus($model, $data['status'] ?? null, ['unpaid' => 1, 'paid' => 2, 'cancel' => 3, 'overdue' => 4, 'refunded' => 5]); $model = $this->whereCreatedBetween($model, $data['date_from'] ?? null, $data['date_to'] ?? null); if (isset($data['filter']) && $data['filter'] !== '') { $search = $data['filter']; $model = $model->where(function ($query) use ($search) { $query->where('invoice_number', 'like', "%{$search}%") ->orWhereHas('order', fn ($query) => $query->where('order_num', 'like', "%{$search}%")) ->orWhereHas('customer', function ($query) use ($search) { $query->where('fullname', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); $this->whereOrderItemNameLike($query, 'order.orderItems', $search); }); } if (isset($data['relations'])) { foreach ($data['relations'] as $key => $value) { $model = $model->whereHas($key, function ($query) use ($value) { if (isset($value['condition'])) { switch (strtoupper($value['condition'])) { case "IN": $query->whereIn($value['key'], $value['value']); break; case "NotIn": $query->whereNotIn($value['key'], $value['value']); break; default: $query->where($value['key'], $value['condition'], $value['value']); break; } } else { $query->where($value['key'], $value['value']); } }); } } if (count($withCount) > 0) { $model = $model->withCount($withCount); } if ($returnQuery) { return $model; } if (isset($data['limit']) && $data['limit']) { return $model->latest('id')->take($data['limit'])->get(); } if (isset($data['page'])) { return $model->paginate(15); } return $model->get(); } public function findWithRelationships(string $ordernum = '', array $relationships = [], array $withCount = [], array $withSum = []) { $model = $this->model; if (count($relationships) > 0) { foreach ($relationships as $relationship) { if (method_exists($model, $relationship)) { $model = $model->with($relationship); } } } // Xử lý withCount if (count($withCount) > 0) { foreach ($withCount as $key => $items) { if (is_array($items)) { foreach ($items as $alias => $item) { $model = $model->withCount([ $key . ' as ' . $alias => function ($query) use ($item) { $query->where($item['key'], $item['condition'], $item['value']); } ]); } } else { $model = $model->withCount($key); } } } // Xử lý withSum if (count($withSum) > 0) { foreach ($withSum as $key => $items) { if (is_array($items)) { foreach ($items as $alias => $item) { $model = $model->withSum([ $key . ' as ' . $alias => function ($query) use ($item) { $query->where($item['key'], $item['condition'], $item['value']); } ], $item['sum']); } } else { $model = $model->withSum($key); } } } return $model->where('order_num', $ordernum)->first(); } }