first(); if ($labourOrder) { $registrationCode = $labourOrder->lo_number; $explode = explode("-", $registrationCode); $num = (int) $explode + 1; $loNumber = sprintf("%02d", $num) . '/' . 'LO-JKT' . '/' . monthToRomawi(now()->format('m')) . '/' . now()->format('Y'); return "BD-" . $loNumber; } else { return "BD-01" . '/' . 'LO-JKT' . '/' . monthToRomawi(now()->format('m')) . '/' . now()->format('Y'); } } public function getLastRow() { return LabourOrder::latest()->first(); } public function paginate(PaginateBuilderAttr $paginateBuilderAttr) { $labourOrder = LabourOrder::with('foreman', 'labourOrderWorker', 'project.deal.budgetPlan.order', 'supplier'); $builder = (new PaginateCollectionAttrBuilder) ->build( $labourOrder, $paginateBuilderAttr, new PaginateSchemaLabourOrder ); $newCollections = $builder->getCollections()->map(function ($query) { $skkNumber = $query->project->deal->skk_number ?? null; $customerName = $query->project->deal->customer_name ?? null; $customerPhone = $query->project->deal->budgetPlan->order->customer_phone ?? null; $statusAlises = $query->status; $nominal = 0; foreach ($query->labourOrderWorker as $worker) { $nominal += $worker->total_wages; } $array = []; foreach ($query->project->deal->budgetPlan->order->orderServices ?? [] as $orderService) { $array[] = $orderService->service->title ?? null; } $serviceName = join(", ", $array); $query['project_name'] = $skkNumber . ' | ' . $customerName . ' | ' . $customerPhone . ' | ' . $serviceName; $query['status_aliasis'] = $query->current_status ?? $this->statusAliasis($statusAlises); $query['nominal'] = $nominal; return $query; }); return $builder->setCollections($newCollections); } public function fetch($id) { $res = LabourOrder::with('foreman', 'labourOrderWorker', 'project.deal.budgetPlan.order')->find($id) ?? abort(404); $skkNumber = $res->project->deal->skk_number; $customerName = $res->project->deal->customer_name ?? null; $customerPhone = $res->project->deal->budgetPlan->order->customer_phone ?? null; $nominal = 0; foreach ($res->labourOrderWorker as $worker) { $nominal += $worker->total_wages; } $array = []; foreach ($res->project->deal->budgetPlan->order->orderServices as $orderService) { $array[] = $orderService->service->title; } $serviceName = join(", ", $array); $res['project_name'] = $skkNumber . ' | ' . $customerName . ' | ' . $customerPhone . ' | ' . $serviceName; $statusAlises = $res->status; $res['status_aliasis'] = $this->statusAliasis($statusAlises); $res['nominal'] = $nominal; return $res; } public function create(LabourOrderAttr $labourOrderAttr) { $res = LabourOrder::create([ 'lo_number' => $labourOrderAttr->getLoNumber(), 'date' => $labourOrderAttr->getDate() ?? Carbon::now()->toDateString(), 'type' => $labourOrderAttr->getType(), 'project_id' => $labourOrderAttr->getProjectId(), 'overtime' => $labourOrderAttr->getOverTime(), 'foreman_id' => $labourOrderAttr->getForemanId(), 'supplier_id' => $labourOrderAttr->getSupplierId(), 'from_date' => Carbon::parse($labourOrderAttr->getFromDate())->toDateString(), 'to_date' => Carbon::parse($labourOrderAttr->getToDate())->toDateString(), 'total_progress' => $labourOrderAttr->getTotalProgress(), 'last_week_progress' => $labourOrderAttr->getLastWeekProgress(), 'this_week_progress' => $labourOrderAttr->getThisWeekProgress(), 'total_wages_subcon' => $labourOrderAttr->getTotalWagesSubcon(), 'paid_wages_this_week' => $labourOrderAttr->getPaidWagesThisWeek(), 'week' => $labourOrderAttr->getWeek(), 'status' => 0 ]); return $res; } public function update(LabourOrderAttr $labourOrderAttr, $id) { $res = LabourOrder::findOrFail($id); if ($res->status == 0 || $res->status == 1) { $res->update([ 'from_date' => $labourOrderAttr->getFromDate(), 'to_date' => $labourOrderAttr->getToDate(), 'type' => $labourOrderAttr->getType(), 'overtime' => $labourOrderAttr->getOverTime(), 'supplier_id' => $labourOrderAttr->getSupplierId(), 'foreman_id' => $labourOrderAttr->getForemanId(), 'status' => 0 ]); return $res; } } public function delete($id) { $res = LabourOrder::findOrFail($id); $res->delete(); return $res; } public function select2SubCon(?string $search) { $supplier = Supplier::selectRaw('id, name as text')->where('type', 'fee'); return (new PaginateCollectionAttrBuilder) ->build( $supplier, (new PaginateBuilderAttr)->setSearchKeyword($search), new PaginateSchemaPartnerCompany ); } public function totalWages($id, $totalWages) { $res = LabourOrderWorker::find($id); $res->total_wages = $totalWages; $res->save(); return $res; } public function totalWeek($projectId, $week) { $total = 0; for ($i = 1; $i <= $week; $i++) { $detail = ProjectImplementationScheduleDetail::whereHas('projectImplementationSchedule.project', function ($query) use ($projectId) { $query->where('id', $projectId); })->where('week', $i)->get(); foreach ($detail ?? [] as $value) { $total = $total + $value->actual; } } return $total; } public function lastWeek($projectId, $week) { $lastWeek = $week - 1; $detail = ProjectImplementationScheduleDetail::whereHas('projectImplementationSchedule.project', function ($query) use ($projectId) { $query->where('id', $projectId); })->where('week', $lastWeek)->get(); $total = 0; foreach ($detail ?? [] as $value) { $total = round($total + $value->actual); } $total = str_replace(".", "", $total); return (int) $total; } public function thisWeek($projectId, $week) { $thisWeek = $week; $detail = ProjectImplementationScheduleDetail::whereHas('projectImplementationSchedule.project', function ($query) use ($projectId) { $query->where('id', $projectId); })->where('week', $thisWeek)->get(); $total = 0; foreach ($detail ?? [] as $value) { $total = round($total + $value->actual); } $total = str_replace(".", "", $total); return (int) $total; } public function totalWeekSum($projectId, $week) { $rapValue = Project::where('id', $projectId)->select('rap_value')->first(); $totalRap = (int) str_replace(".", "", $rapValue->rap_value); $thisWeek = $this->thisWeek($projectId, $week); $lastWeek = $this->lastWeek($projectId, $week); $res = ($thisWeek / 100) * $totalRap; return $res; } public function select2Foreman(?string $search) { $userRole = UserRoleFromProject::where('role_id', 42)->get(); $userIds = $userRole->map(function ($query) { $res = $query->user_id; return $res; }); $user = User::selectRaw('id, name as text')->whereIn('id', $userIds); return (new PaginateCollectionAttrBuilder) ->build( $user, (new PaginateBuilderAttr)->setSearchKeyword($search), new PaginateSchemaLabourOrderForForeman ); } public function updateStatus($id) { $update = LabourOrder::findOrFail($id) ?? abort(404); if ($update->status == 0) { if ( getAuthRoleId() == 1 || getAuthRoleId() == 2 || getAuthRoleId() == 3 || getAuthRoleId() == 4 || getAuthRoleId() == 6 ) { if (request()->reject == "reject") { $update->status = 1; $update->save(); $data = [ "success" => true, "message" => "status update successfully (Rejected)", ]; } else { $update->status = 2; $update->save(); $data = [ "success" => true, "message" => "status update successfully (Approved)", ]; } } else { $data = [ "success" => false, "message" => "Don't have access, role check", ]; } return $data; } else { abort(400); } } public function statusAliasis($value) { if ($value == 0 || $value == null) { $data = "Draft"; } elseif ($value == 2) { $data = "Open"; } elseif ($value == 1) { $data = "Rejected"; } elseif ($value == 3) { $data = 'Billed'; } return $data; } public function select2LabourOrder(?string $search): PaginateCollectionAttr { $labourOrder = LabourOrder::selectRaw('id, lo_number, project_id') ->with(['labourOrderWorker' => function ($query) { $query->select('id', 'labour_order_id', 'skill', 'overtime', 'wages', 'total_wages', 'from_date', 'to_date'); }]) ->where('status', 2); $builder = (new PaginateCollectionAttrBuilder) ->build( $labourOrder, (new PaginateBuilderAttr)->setSearchKeyword($search), new PaginateSchemaLabourOrder ); $newCollections = $builder->getCollections()->map(function ($q) { $skkNumber = $q->project->deal->skk_number; $customerName = $q->project->deal->customer_name; $customerPhone = $q->project->deal->budgetPlan->order->customer_phone ?? null; $loNumber = $q->lo_number; $array = []; foreach ($q->project->deal->budgetPlan->order->orderServices as $orderService) { $array[] = $orderService->service->title; } $serviceName = join(", ", $array); $project['id'] = $q->id; $project['text'] = $loNumber . ' | ' . $skkNumber . ' | ' . $customerName . ' | ' . $serviceName; $project['short_text'] = $loNumber; $project['total'] = $q->total_wages; $project['details'] = $q->labourOrderWorker; // return $q; return $project; }); return $builder->setCollections($newCollections); } // TODO: Blm fix public function sumTotalAmountDue(?ReportCoaFilterAttr $reportCoaFilterAttr) { $labourOrder = lessAndBetweenDateQuery( LabourOrder::query(), $reportCoaFilterAttr ? $reportCoaFilterAttr->getLessDate() : null, $reportCoaFilterAttr ? $reportCoaFilterAttr->getBetweenTwoDates() : null, 'transaction_date' ); return $labourOrder->unpaid()->sumTotalAmountDue($reportCoaFilterAttr)->first()->total_amount_due ?? 0; } public function select2Paginate(LabourOrderSelect2PaginateAttr $labourOrderSelect2PaginateAttr): PaginateCollectionAttr { $labourOrder = LabourOrder::selectRaw('id, lo_number as text, project_id, foreman_id')->with('project', 'labourOrderWorker', 'foreman'); if ($projectId = $labourOrderSelect2PaginateAttr->getHasProject()) { $labourOrder = $labourOrder->where('project_id', $projectId); } if ($foremanId = $labourOrderSelect2PaginateAttr->getHasForeman()) { $labourOrder = $labourOrder->where('foreman_id', $foremanId); } if ($labourOrderSelect2PaginateAttr->getUnpaidOnly()) { // di LabourOrder udah pasti ada project, jadi gatau harus pakai unpaid atau unpaidPForProject, jadi langsung pakai unpaidForProject aja sementara sampe tau flow aslinya. // di LabourOrder ga ada referensi juga. // if ($labourOrderSelect2PaginateAttr->getReferences() != 'project') { // $labourOrder = $labourOrder->unpaid( // $labourOrderSelect2PaginateAttr->getExceptPaymentId() // ); // } else { // $labourOrder = $labourOrder->unpaidForProject( // $labourOrderSelect2PaginateAttr->getExceptPaymentId() // ); // } // Labour Order udah pasti proyek $labourOrder = $labourOrder->unpaid( $labourOrderSelect2PaginateAttr->getExceptPaymentId() ); // $labourOrder = $labourOrder->unpaidForProject( // $labourOrderSelect2PaginateAttr->getExceptPaymentId() // ); } if ($labourOrderSelect2PaginateAttr->getNotHaveBillLo()) { if ($exceptBillLoId = $labourOrderSelect2PaginateAttr->getExceptBillLoId()) { $labourOrder = $labourOrder->whereDoesntHave('billLo', function ($q) use ($exceptBillLoId) { return $q->where('id', '<>', $exceptBillLoId); }); } else { $labourOrder = $labourOrder->whereDoesntHave('billLo'); } } return (new PaginateCollectionAttrBuilder) ->build( $labourOrder, $labourOrderSelect2PaginateAttr, new PaginateSchemaLabourOrder ); } }