validate($request, [ 'activity_id' => 'required', 'qty' => 'required' ]); $activity = Activity::where('id', $request->activity_id)->first(); $start_date = $activity->start_date; $start_date = substr($start_date, 0, 19); // remove the timezone offset $startDate = new \DateTime(date("Y-m-d", strtotime($start_date))); $reportDate = new \DateTime(date("Y-m-d", strtotime($request->report_date))); $data = $request->all(); $data['created_by'] = $this->currentName; /* $data['assign_material_id'] = AssignMaterial::where('activity_id', $request->activity_id)->pluck('id')->first(); */ $data['assign_material_id'] = $request->assign_material_id; $data['qty'] = $this->sanitizeDecimal($data['qty']); if($reportDate >= $startDate || isset($data['force']) && $data['force'] == "true"){ $created = ReportActivityMaterial::create($data); return response()->json(['status'=>'success','message'=>'Input progress report activity created','code'=>200,'data'=>array('report_id'=>$created->id)]); } else { return response()->json(['status'=>'failed','message'=>'Report date is before early start, still wanna add data ?','code'=>400,'data'=>$data], 400); } } public function updateStatusStartFinish(Request $request){ $payloadUpdate = array( 'start_activity' => $request->start_activity, 'finish_activity' => $request->finish_activity, 'status_activity' => $request->status_activity ); $updateData = AssignMaterial::where('activity_id',$request->activity_id) ->update($payloadUpdate); if($updateData){ if($request->status_activity == 'done'){ $dataUpdate = array( "persentase_progress" => 100, "updated_by" => $this->currentName ); Activity::where('id', $request->activity_id)->update($dataUpdate); } else { $sumAssignMaterial = AssignMaterial::where('activity_id', $request->activity_id)->sum('qty_planning'); $sumReportActivityMaterial = ReportActivityMaterial::where('activity_id', $request->activity_id)->sum('qty'); // if actual >= plan if ($sumReportActivityMaterial >= $sumAssignMaterial){ $persentaseProgress = 95; }else{ // actual < plan $persentaseProgress = $sumReportActivityMaterial/$sumAssignMaterial*100; } $dataUpdate = array( "actual_start" => null, "actual_end" => null, "persentase_progress" => $persentaseProgress, "updated_by" => $this->currentName ); if ($sumReportActivityMaterial > 0) { $data = []; $reportActivityMaterial = ReportActivityMaterial::where('activity_id', $request->activity_id)->get(); foreach ($reportActivityMaterial as $value) { $data[] = $value; } $actualStartValues = array_column(array_filter($data, function($item) { return isset($item['report_date']); }), 'report_date'); $dataUpdate["actual_start"] = min($actualStartValues); } Activity::where('id', $request->activity_id)->update($dataUpdate); } return response()->json(['status'=>'success','message'=>'Update data status successfully ', 'code'=>200]); } else{ return response()->json(['status'=>'failed','message'=>'Update data status failed', 'code'=>400]); } } public function delete($id) { if(!ReportActivityMaterial::findOrFail($id)->delete()) return response()->json(['status'=>'failed','message'=>'Failed to deleted the data!','code'=> 500], 500); return response()->json(['status'=>'success','message'=> 'Data deleted!','code'=>200], 200); } public function search(Request $request) { $payload = $request->all(); $dataBuilder = $this->setUpPayload($payload, 'report_activity_material'); $builder = $dataBuilder['builder']; $countBuilder = $dataBuilder['count']; $dataGet = $builder->get(); $totalRecord = $countBuilder->count(); return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200); } public function list() { $data = ReportActivityMaterial::all(); $countData = $data->count(); if($data){ return response()->json(['status'=>'success','code'=>200,'data'=>$data, 'totalRecord'=>$countData], 200); }else{ return response()->json(['status'=>'failed','message'=>'failed get Repport Activity material, please try again later!','code'=>400], 400); } } public function datatables(Request $request){ $id_activity = $request->query('idAct'); $type = $request->query('type'); $materialName = $request->query('materialName'); if($type == 'plan'){ $activity = Activity::findOrFail($id_activity); $baselineDuration = 0; if (isset($activity->planned_start) && isset($activity->planned_end)) { $baselineDuration = MasterFunctionsHelper::countDays($activity->version_gantt_id, new DateTime($activity->planned_start), new DateTime($activity->planned_end)); } $data = AssignMaterial::select("assign_material_to_activity.*","m.description as material_name", "m.uom as uom") ->join("m_req_material as m", "m.id", "=", "assign_material_to_activity.material_id") ->where('assign_material_to_activity.activity_id', $id_activity) ->where('m.description', 'LIKE', '%' . $materialName . '%') ->orderBy('assign_material_to_activity.id', 'asc') ->get(); if ($baselineDuration > 0) { foreach ($data as $key => $value) { $data[$key]->qty_planning = number_format($value->qty_planning / $baselineDuration, 1); } } return Datatables::of($data) ->addIndexColumn() ->addColumn('action', function($row){ $actionBtn = ''; if ($row->status_activity != 'done') { $actionBtn .= ''; } return $actionBtn; }) ->rawColumns(['action'])->make(true); }else{ $activity = Activity::findOrFail($id_activity); $baselineDuration = 0; if (isset($activity->planned_start) && isset($activity->planned_end)) { $baselineDuration = MasterFunctionsHelper::countDays($activity->version_gantt_id, new DateTime($activity->planned_start), new DateTime($activity->planned_end)); } $data = ReportActivityMaterial::select("report_activity_material.*", "u.name as human_resource", "amta.status_activity", "amta.qty_planning") ->join("assign_material_to_activity as amta", "amta.id", "=", "report_activity_material.assign_material_id") ->join("m_req_material as m", "m.id", "=", "amta.material_id") ->join("m_users as u", "u.id", "=", "report_activity_material.user_id") ->where('report_activity_material.activity_id', $id_activity) ->where('m.description', 'LIKE', '%' . $materialName . '%') ->orderBy('report_activity_material.report_date', 'asc') ->get(); if ($baselineDuration > 0) { foreach ($data as $key => $value) { $data[$key]->qty_planning = number_format($value->qty_planning / $baselineDuration, 1); } } return Datatables::of($data) ->addIndexColumn() ->addColumn('action', function($row){ $actionBtn = ''; if ($row->status_activity != 'done') { $actionBtn .= ''; } return $actionBtn; }) ->rawColumns(['action'])->make(true); } } }