*/ public function rules() : array { return [ 'kode' => 'required|string', 'kode_dus' => 'required|string', 'kode_odner' => 'required|string', 'directorat_id' => 'required|integer|exists:directorats,id', 'sub_directorat_id' => 'required|integer|exists:sub_directorats,id', 'job_id' => 'required|integer|exists:jobs,id', 'sub_job_id' => 'required|integer|exists:sub_jobs,id', 'sub_sub_job_id' => 'required|integer|exists:sub_sub_jobs,id', 'sequence' => 'nullable|integer|min:1|max:5', 'sequence_dus' => 'nullable|integer|min:1|max:5', 'sequence_odner' => 'nullable|integer|min:1|max:5', 'status' => 'nullable|integer', ]; } /** * Configure the validator instance. */ public function withValidator(Validator $validator) : void { $validator->after(function (Validator $validator) { if ($validator->errors()->any()) { $error = json_decode($validator->errors()->toJson(), true); foreach ($error as $key => $value) { flash($value[0]); } return redirect()->route('document.index')->with('error', 'Document created failed.'); } }); } protected function failedValidation(Validator|\Illuminate\Contracts\Validation\Validator $validator) : JsonResponse { $errors = (new ValidationException($validator))->errors(); throw new HttpResponseException(response()->json([ 'success' => false, 'errors' => $errors, 'messages' => 'Document created failed.' ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)); } protected function prepareForValidation() : void { $directorat = Directorat::find($this->directorat_id); $sub_directorat = SubDirectorat::find($this->sub_directorat_id); $job = Job::find($this->job_id); $sub_job = SubJob::find($this->sub_job_id); $sub_sub_job = SubSubJob::find($this->sub_sub_job_id); $prefix = $directorat->kode . $sub_directorat->kode . $job->kode . $sub_job->kode . $sub_sub_job->kode; $sequence_dus = 1; $sequence_odner = 1; $sum_halaman_document = 0; $max_sequence_dus = Document::where('kode_dus', substr($prefix, 0, 6))->max('sequence_dus'); $max_sequence_odner = Document::where(['kode_odner' => substr($prefix, 0, 8), 'sequence_dus' => $max_sequence_dus])->max('sequence_odner'); if ($max_sequence_odner == 5) { if ($max_sequence_dus < 5) { $sequence_dus = $max_sequence_dus + 1; } else { $sequence_dus = $max_sequence_dus; } } else { $sum_halaman_document = $this->sumHalaman($prefix, $this->sequence, $sequence_dus); if ($sum_halaman_document < Setting::get('maximal_halaman_per_dus')) { if (($sum_halaman_document + $this->jumlah_halaman) >= Setting::get('maximal_halaman_per_dus')) { $sequence_odner += 1; } else { $sequence_odner = $this->sequence; } } else { for ($i = 1; $i <= Setting::get('maximal_odner_per_dus'); $i++) { $sum_halaman_document = $this->sumHalaman($prefix, $i, $sequence_dus); if ($sum_halaman_document < Setting::get('maximal_halaman_per_odner')) { if (($sum_halaman_document + $this->jumlah_halaman) >= Setting::get('maximal_halaman_per_odner')) { $sequence_odner = $i + 1; break; } else { $sequence_odner = $this->sequence; break; } } } } } $this->merge([ 'kode' => $prefix, 'kode_dus' => substr($prefix, 0, 6), 'kode_odner' => substr($prefix, 0, 8), 'sequence_dus' => $sequence_dus, 'sequence_odner' => $sequence_odner ]); } private function sumHalaman($prefix, $id, $dus = 1) { $document = Document::where(['kode_odner' => substr($prefix, 0, 8), 'sequence_odner' => $id, 'sequence_dus' => $dus])->first(); if ($document == null) { return 0; } $sum_halaman_document = DocumentDetail::where('document_id', $document->id)->sum('jumlah_halaman'); return $sum_halaman_document; } }