diff --git a/app/Http/Controllers/User/Api/ContractController.php b/app/Http/Controllers/User/Api/ContractController.php index 821302f..720f587 100644 --- a/app/Http/Controllers/User/Api/ContractController.php +++ b/app/Http/Controllers/User/Api/ContractController.php @@ -40,6 +40,12 @@ class ContractController extends BaseController return $contract; } + public function active(Request $request, $hash_id) + { + $contract = ContractModule::active($request, $hash_id); + return $contract; + } + public function delete(Request $request, $hash_id) { $contract = ContractModule::delete($request, $hash_id); diff --git a/app/Http/Controllers/User/Api/ContractObligationController.php b/app/Http/Controllers/User/Api/ContractObligationController.php new file mode 100644 index 0000000..e20c444 --- /dev/null +++ b/app/Http/Controllers/User/Api/ContractObligationController.php @@ -0,0 +1,55 @@ +json($data); } + public static function active(Request $request, $hash_id) + { + $id = Hasher::decode('contracts', $hash_id); + $contract = ContractModule::show($request, $hash_id); + $this_ = json_decode(json_encode($contract), true); + $request->request->add($this_['original']['data']); + + $validation = ContractModule::validation($request, $hash_id, 'ACTIVE'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $contract = Contract::find($id); + $contract->status = config('constants.contract.status.active'); + $contract->update(); + + // log + ContractModule::makeLog($contract->id, 'user (' . Auth::guard('user-api')->user()->id . ') status activiated'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('contract_query'); + $data = General::returnData($contract, $query_string); + + return response()->json($data); + } + public static function delete(Request $request, $hash_id) { $id = Hasher::decode('contracts', $hash_id); @@ -250,13 +280,42 @@ class ContractModule extends BaseController ]; } - if ($method == 'PUT') { + if ($method == 'ACTIVE') { $data['id'] = $id; $rule = [ - 'id' => [new UnderCheck('contract'), new ExistCheck('contract')], - 'name' => 'required', - 'complete_day_range' => 'required|numeric|gt:-1' + 'id' => [new UnderCheck('contract'), new ExistCheck('contract'), new StatusCheck('contract', [config('constants.contract.status.pending')])], + 'contract_obligation_list' => ['required'], + 'contract_entity_list' => ['required'] ]; + + if (!empty($data['contract_obligation_list'])) { + foreach ($data['contract_obligation_list'] as $key => $row) { + $rule['contract_obligation_list.'.$key.'.contract_entity_id'] = [ + 'required', + new UnderCheck('contract_entity'), + new ExistCheck('contract_entity') + ]; + + if (!empty($row['contract_obligation_contract_dependency_list'])) { + + foreach ($row['contract_obligation_contract_dependency_list'] as $key_2 => $row_2) { + $rule['contract_obligation_list.'.$key.'.contract_obligation_contract_dependency_list.'.$key_2.'.hash_id'] = [ + new UnderCheck('contract_obligation_contract_dependency'), + new ExistCheck('contract_obligation_contract_dependency') + ]; + + $rule['contract_obligation_list.'.$key.'.contract_obligation_contract_dependency_list.'.$key_2.'.depend_contract_id'] = [ + 'required', + new UnderCheck('contract'), + new ExistCheck('contract'), + new StatusCheck('contract', [config('constants.contract.status.active')]) + + ]; + } + } + + } + } } if ($method == 'DEL') { @@ -267,7 +326,6 @@ class ContractModule extends BaseController } $validator = Validator::make($data, $rule, config('error_code')); - $errors = $validator->errors(); if ($validator->fails()) { diff --git a/app/Http/Modules/User/ContractObligationModule.php b/app/Http/Modules/User/ContractObligationModule.php index 96bc06d..e68ce22 100644 --- a/app/Http/Modules/User/ContractObligationModule.php +++ b/app/Http/Modules/User/ContractObligationModule.php @@ -7,6 +7,10 @@ use App\Models\ContractObligation; use App\Models\ContractObligationLog; use App\Models\Contract; use App\Models\ContractTemplateObligation; +use App\Models\ContractEntity; + +use App\Http\Rules\User\UnderCheck; +use App\Http\Rules\User\ExistCheck; use App\Http\Helpers\General; use App\Http\Helpers\Hasher; @@ -34,7 +38,7 @@ class ContractObligationModule extends BaseController $page = $request->get('page', null); $limit = $request->get('limit', 10); - $query = Contract::query(); + $query = ContractObligation::query(); if (strlen($name) > 0) { $query->where('name', 'like', '%' . $name . '%'); @@ -68,9 +72,9 @@ class ContractObligationModule extends BaseController public static function show(Request $request, $hash_id) { - $id = Hasher::decode('contracts', $hash_id); + $id = Hasher::decode('contract_obligations', $hash_id); $user_id = Auth::guard('user-api')->user()->id; - $contract = Contract:: + $contract = ContractObligation:: where('id', $id) ->where('user_id', $user_id) ->first(); @@ -104,6 +108,7 @@ class ContractObligationModule extends BaseController $contract_obligation->contract_id = $contract->id; $contract_obligation->contract_template_obligation_id = $contract_template_obligation->id; $contract_obligation->name = $contract_template_obligation->name; + $contract_obligation->sequence = $contract_template_obligation->sequence; $contract_obligation->content = json_encode($contract_template_obligation->content); $contract_obligation->must_complete = $contract_template_obligation->must_complete; $contract_obligation->must_accept = $contract_template_obligation->must_accept; @@ -123,6 +128,35 @@ class ContractObligationModule extends BaseController return response()->json($data); } + public static function assignContractEntity(Request $request, $hash_id) + { + $id = Hasher::decode('contract_obligations', $hash_id); + $validation = ContractObligationModule::validation($request, $hash_id, 'ASSIGN'); + if (!$validation->status) { + return response()->json($validation, 422); + } + + DB::beginTransaction(); + + $contract_entity_id = $request->input('contract_entity_id'); + $contract_entity_id = Hasher::decode('contract_entities', $contract_entity_id[0]); + $contract_entity = ContractEntity::find($contract_entity_id); + + $contract_obligation = ContractObligation::find($id); + $contract_obligation->contract_entity_id = $contract_entity->id; + $contract_obligation->update(); + + // log + ContractObligationModule::makeLog($contract_obligation->id, 'user (' . Auth::guard('user-api')->user()->id . ') assigned contract entity'); + + DB::commit(); + + $query_string = General::getCachePerviousQuery('contract_obligation_query'); + $data = General::returnData($contract_obligation, $query_string); + + return response()->json($data); + } + private static function validation(Request $request, $id = '', $method = 'POST') { $data = $request->all(); @@ -132,8 +166,12 @@ class ContractObligationModule extends BaseController } - if ($method == 'PUT') { - + if ($method == 'ASSIGN') { + $data['id'] = $id; + $rule = [ + 'id' => [new UnderCheck('contract_obligation'), new ExistCheck('contract_obligation')], + 'contract_entity_id' => ['required', new UnderCheck('contract_entity'), new ExistCheck('contract_entity')] + ]; } if ($method == 'DEL') { diff --git a/app/Http/Rules/User/ExistCheck.php b/app/Http/Rules/User/ExistCheck.php index bb65dee..9a94075 100644 --- a/app/Http/Rules/User/ExistCheck.php +++ b/app/Http/Rules/User/ExistCheck.php @@ -82,6 +82,21 @@ class ExistCheck implements Rule } } + if ($this->type == 'contract_active') { + foreach ($value as $key => $row) { + if(!empty($row)) { + $id = Hasher::decode('contracts', $row); + $data = Contract:: + where('id', $id) + ->where('status', config('constants.contract.status.active')) + ->count(); + if (!$data) { + return false; + } + } + } + } + if ($this->type == 'contract_entity') { foreach ($value as $key => $row) { if(!empty($row)) { diff --git a/app/Http/Rules/User/StatusCheck.php b/app/Http/Rules/User/StatusCheck.php new file mode 100644 index 0000000..3c15f2e --- /dev/null +++ b/app/Http/Rules/User/StatusCheck.php @@ -0,0 +1,72 @@ +type = $type; + $this->status = $status; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + $this->attribute = $attribute; + $value = is_array($value) ? $value : [$value]; + + if ($this->type == 'contract') { + foreach ($value as $key => $row) { + if(!empty($row)) { + $id = Hasher::decode('contracts', $row); + $data = Contract:: + where('id', $id) + ->whereIn('status', $this->status) + ->count(); + if (!$data) { + return false; + } + } + } + } + + return true; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return config('error_code.status_error'); + } +} diff --git a/app/Http/Rules/User/UnderCheck.php b/app/Http/Rules/User/UnderCheck.php index 5218fd5..c36d580 100644 --- a/app/Http/Rules/User/UnderCheck.php +++ b/app/Http/Rules/User/UnderCheck.php @@ -5,6 +5,8 @@ namespace App\Http\Rules\User; use Auth; use App\Models\Contract; use App\Models\ContractEntity; +use App\Models\ContractObligation; +use App\Models\ContractObligationContractDependency; use App\Models\Entity; use App\Models\ContractTemplate; use App\Models\ContractTemplateObligation; @@ -41,6 +43,7 @@ class UnderCheck implements Rule $value = is_array($value) ? $value : [$value]; if ($this->type == 'contract') { + foreach ($value as $key => $row) { if(!empty($row)) { $id = Hasher::decode('contracts', $row); @@ -70,6 +73,38 @@ class UnderCheck implements Rule } } + if ($this->type == 'contract_obligation') { + foreach ($value as $key => $row) { + if(!empty($row)) { + + $id = Hasher::decode('contract_obligations', $row); + $data = ContractObligation:: + where('id', $id) + ->where('user_id', Auth::guard('user-api')->user()->id) + ->count(); + if (!$data) { + return false; + } + } + } + } + + if ($this->type == 'contract_obligation_contract_dependency') { + foreach ($value as $key => $row) { + if(!empty($row)) { + + $id = Hasher::decode('contract_obligation_contract_dependencies', $row); + $data = ContractObligationContractDependency:: + where('id', $id) + ->where('user_id', Auth::guard('user-api')->user()->id) + ->count(); + if (!$data) { + return false; + } + } + } + } + if ($this->type == 'entity') { foreach ($value as $key => $row) { if(!empty($row)) { diff --git a/app/Models/ContractObligation.php b/app/Models/ContractObligation.php index d260909..02529fd 100644 --- a/app/Models/ContractObligation.php +++ b/app/Models/ContractObligation.php @@ -16,11 +16,12 @@ class ContractObligation extends Model 'contract_list', 'contract_obligation_dependency_list', 'depend_contract_obligation_dependency_list', + 'contract_obligation_contract_dependency_list', 'contract_entity_list' ]; protected $hidden = [ - 'id', 'in_time_contract_obligation_template', + 'in_time_contract_obligation_template', ]; public function contract() @@ -38,6 +39,11 @@ class ContractObligation extends Model return $this->hasMany('App\Models\ContractObligationDependency', 'depend_contract_obligation_id'); } + public function contract_obligation_contract_dependency() + { + return $this->hasMany('App\Models\ContractObligationContractDependency', 'contract_obligation_id'); + } + public function contract_entity() { return $this->belongsTo('App\Models\ContractEntity', 'contract_entity_id'); @@ -67,6 +73,13 @@ class ContractObligation extends Model ->get()->makeHidden(['contract_obligation_list', 'depend_contract_obligation_list']); } + public function getContractObligationContractDependencyListAttribute() + { + return $this->contract_obligation_contract_dependency() + // ->where('status', config('constants.contract_obligation_contract_dependency.status.active')) + ->get()->makeHidden(['contract_obligation_list']); + } + public function getContractEntityListAttribute() { return $this->contract_entity()->get()->makeHidden(['contract_list']); diff --git a/app/Models/ContractObligationContractDependencies.php b/app/Models/ContractObligationContractDependencies.php deleted file mode 100644 index 33370f3..0000000 --- a/app/Models/ContractObligationContractDependencies.php +++ /dev/null @@ -1,11 +0,0 @@ -belongsTo('App\Models\ContractObligation', 'contract_obligation_id'); + } + + public function depend_contract() + { + return $this->belongsTo('App\Models\Contract', 'depend_contract_id'); + } + + public function getHashIdAttribute() + { + return Hasher::encode('contract_obligation_contract_dependencies', $this->id); + } + + public function getContractObligationHashIdAttribute() + { + return Hasher::encode('contract_obligations', $this->contract_obligation_id); + } + + public function getDependContractHashIdAttribute() + { + return Hasher::encode('contracts', $this->depend_contract_id); + } + + public function getContractObligationListAttribute() + { + return $this->contract_obligation()->get()->makeHidden(['contract_obligation_dependency_list', 'depend_contract_obligation_dependency_list']); + } + + public function getDependContractListAttribute() + { + return $this->depend_contract()->get(); + } + + public function getUpdatedAtAttribute($date) + { + return $date ? Carbon::parse($date)->timezone('Asia/Kuala_Lumpur')->format('Y-m-d') : ''; + } + + public function getCreatedAtAttribute($date) + { + return $date ? Carbon::parse($date)->timezone('Asia/Kuala_Lumpur')->format('Y-m-d') : ''; + } +} diff --git a/config/constants.php b/config/constants.php index 8472e4a..8f39fbb 100644 --- a/config/constants.php +++ b/config/constants.php @@ -46,7 +46,7 @@ 'pending' => 9 ] ], - 'contact' => [ + 'contract' => [ 'status' => [ 'active' => 1, 'delete' => 2, diff --git a/config/error_code.php b/config/error_code.php index bba160a..5ef112c 100644 --- a/config/error_code.php +++ b/config/error_code.php @@ -14,6 +14,7 @@ 'date' => 'DATE_INVALID', 'confirmed' => 'CONFIRM_ERROR', 'obligation_depend_error' => 'OBLIGATION_DEPEND_ERROR', + 'status_error' => 'STATUS_ERROR', 'min' => [ 'string' => 'MIN_ERROR_:min', ], diff --git a/resources/js/user/pages/contracts/Table.vue b/resources/js/user/pages/contracts/Table.vue index 37c6b2c..973ea2d 100644 --- a/resources/js/user/pages/contracts/Table.vue +++ b/resources/js/user/pages/contracts/Table.vue @@ -134,7 +134,7 @@ status: General.returnAray(General.getURLParam('status[]')), page: General.getURLParam('page') }), - colspan: 7, + colspan: 8, filter_status: false, loading: true, contract_list: [], diff --git a/routes/user/api.php b/routes/user/api.php index 729ec11..117bf80 100644 --- a/routes/user/api.php +++ b/routes/user/api.php @@ -301,10 +301,10 @@ Route::group(['namespace' => 'User', 'prefix' => 'user-backsys/api'], function ( 'middleware' => ['permission:add contract'] ] ); - Route::put('assign-entity/{hash_id}', + Route::put('active/{hash_id}', [ - 'as' => 'api.contract.assign-entity', - 'uses' => 'ContractController@assignEntity', + 'as' => 'api.contract.active', + 'uses' => 'ContractController@active', 'middleware' => ['permission:edit contract'] ] ); @@ -317,7 +317,7 @@ Route::group(['namespace' => 'User', 'prefix' => 'user-backsys/api'], function ( ); }); - // Contract Entit + // Contract Entity Route::prefix('contract-entity')->group(function () { Route::get('list', [ @@ -356,6 +356,32 @@ Route::group(['namespace' => 'User', 'prefix' => 'user-backsys/api'], function ( ); }); + // Contract Obligation + Route::prefix('contract-obligation')->group(function () { + Route::get('list', + [ + 'as' => 'api.contract-entity.list', + 'uses' => 'ContractObligationController@list', + 'middleware' => ['permission:view contract_obligation'] + ] + ); + Route::get('show/{hash_id}', + [ + 'as' => 'api.contract-entity.show', + 'uses' => 'ContractObligationController@show', + 'middleware' => ['permission:view contract_obligation'] + ] + ); + Route::put('assign-contract-entity/{hash_id}', + [ + 'as' => 'api.contract-entity.update', + 'uses' => 'ContractObligationController@assignContractEntity', + 'middleware' => ['permission:edit contract_obligation'] + ] + ); + }); + + // contract generate // contract assign entity // contract active