build( CashOut::selectRaw('id, CONCAT(name, " | ", rate, "%") as text, rate'), (new PaginateBuilderAttr)->setSearchKeyword($search), new PaginateSchemaCashOut ); } public function findByImportId($id) { return CashOut::where('import_id', $id)->first(); } public function findById($id) { return CashOut::find($id); } public function paginate(PaginateBuilderAttr $paginateBuilderAttr): PaginateCollectionAttr { return (new PaginateCollectionAttrBuilder) ->build( CashOut::with('project.deal'), $paginateBuilderAttr, new PaginateSchemaCashOut ); } public function fetchActualCashOut($project_id) { /** * TODO: Cash Out Actual * purchase_orders table utamanya * sepertinya nyambung ke payment_details? (karna ada purchase_order_id di payment_details) * di table payments, where payment_for in ('po', 'bill_po'), apakah 'bill' dan 'bill_po' sama? * purchase_orders ada kaitannya sama projects, tapi ga ada jumlah uang pembayarannya, nah itu ada di payments, berarti? * table bills, pake purchase_orders, berarti nanti getnya pake purchase_orders * NOTE: Ini belum bisa kelar kalo flow po dan bill belum kelar. */ $data = PurchaseOrder::with('bill')->where('project_id', $project_id) ->get(); dd($data->toArray()); return $data; } public function fetch($id) { return CashOut::with(['project' => function ($project) { $project->selectRaw('id, deal_id'); $project->with(['deal']); }, 'cashOutDetails'])->findOrFail($id); } public function create(CashOutAttr $cashInAttr) { $cashIn = CashOut::create([ 'project_id' => $cashInAttr->getProjectId(), ]); // harusnya ini bisa dipisah foreach ($cashInAttr->getCashOutDetails() ?? [] as $detail) { $detail = CashOutDetail::create([ 'cash_out_id' => $cashIn->id, 'date' => $detail->getDate(), 'progress_out_plan' => $detail->getProgress(), 'cash_out_plan' => $detail->getPercentage(), ]); } return $this->fetch($cashIn->id); } public function update(CashOutAttr $cashInAttr, $id) { $cashIn = $this->fetch($id); $cashIn->update([ 'project_id' => $cashInAttr->getProjectId(), ]); // harusnya ini bisa dipisah CashOutDetail::where('cash_out_id', $cashIn->id)->delete(); foreach ($cashInAttr->getCashOutDetails() ?? [] as $detail) { $detail = CashOutDetail::create([ 'cash_out_id' => $cashIn->id, 'date' => $detail->getDate(), 'progress_out_plan' => $detail->getProgress(), 'cash_out_plan' => $detail->getPercentage(), ]); } return $this->fetch($id); } public function delete($id) { $cashIn = $this->fetch($id); $cashIn->delete(); return $cashIn; } }