diff --git a/src/app/indexingModel/controllers/IndexingModelController.php b/src/app/indexingModel/controllers/IndexingModelController.php index fa639d3ce85ea077a6b7317951d15d043b3d9119..d684ec8644beda10d7c85e85bcae55b3253a8a88 100644 --- a/src/app/indexingModel/controllers/IndexingModelController.php +++ b/src/app/indexingModel/controllers/IndexingModelController.php @@ -24,10 +24,13 @@ use History\controllers\HistoryController; use IndexingModel\models\IndexingModelFieldModel; use IndexingModel\models\IndexingModelModel; use Resource\controllers\IndexingController; +use Resource\controllers\ResController; use Resource\models\ResModel; +use Resource\models\ResourceContactModel; use Respect\Validation\Validator; use Slim\Http\Request; use Slim\Http\Response; +use Tag\models\ResourceTagModel; use User\models\UserModel; class IndexingModelController @@ -161,7 +164,7 @@ class IndexingModelController } $master = $body['master']; - $fieldsMaster = IndexingModelFieldModel::get(['select' => ['identifier', 'mandatory', 'default_value', 'unit'], 'where' => ['model_id = ?'], 'data' => [$body['master']]]); + $fieldsMaster = IndexingModelFieldModel::get(['select' => ['identifier', 'mandatory', 'default_value', 'unit', 'enabled'], 'where' => ['model_id = ?'], 'data' => [$body['master']]]); foreach ($fieldsMaster as $key => $value) { $fieldsMaster[$key]['default_value'] = json_decode($value['default_value'], true); } @@ -427,13 +430,45 @@ class IndexingModelController } $resources = ResModel::get([ - 'select' => [1], - 'where' => ['model_id = ?'], - 'data' => [$args['id']] + 'select' => ['res_id'], + 'where' => ['model_id = ?'], + 'data' => [$args['id']] ]); - + $resources = array_column($resources, 'res_id'); if (!empty($resources)) { - return $response->withStatus(400)->withJson(['errors' => 'Model is used by at least one resource', 'lang' => 'modelUsedByResources']); + $body = $request->getParsedBody(); + + // No targetId provided, trying to delete without redirection + if (!Validator::intVal()->notEmpty()->validate($body['targetId'])) { + return $response->withStatus(400)->withJson(['errors' => 'Model is used by at least one resource', 'lang' => 'modelUsedByResources']); + } + + // targetId provided, redirect model before deleting + $oldFieldList = IndexingModelFieldModel::get(['select' => ['identifier'], 'where' => ['model_id = ?'], 'data' => [$args['id']]]); + $oldFieldList = array_column($oldFieldList, 'identifier'); + + $newFieldList = IndexingModelFieldModel::get(['select' => ['identifier'], 'where' => ['model_id = ?'], 'data' => [$body['targetId']]]); + $newFieldList = array_column($newFieldList, 'identifier'); + + ResController::resetResourceFields(['oldFieldList' => $oldFieldList, 'newFieldList' => $newFieldList, 'modelId' => $args['id']]); + + $fieldsToDelete = array_diff($oldFieldList, $newFieldList); + + if (in_array('senders', $fieldsToDelete)) { + ResourceContactModel::delete(['where' => ['res_id in (?)', 'mode = ?'], 'data' => [$resources, 'sender']]); + } + if (in_array('recipients', $fieldsToDelete)) { + ResourceContactModel::delete(['where' => ['res_id in (?)', 'mode = ?'], 'data' => [$resources, 'recipient']]); + } + if (in_array('tags', $fieldsToDelete)) { + ResourceTagModel::delete(['where' => ['res_id in (?)'], 'data' => [$resources]]); + } + + ResModel::update([ + 'set' => ['model_id' => $body['targetId']], + 'where' => ['model_id = ?'], + 'data' => [$args['id']] + ]); } $childrenModels = IndexingModelModel::get(['select' => ['id', 'label'], 'where' => ['"master" = ?'], 'data' => [$args['id']]]); diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index 19e17c7c681f2de528d9c210820b5e2b1e511a54..25f54627d7a11a5328491b11ad32a3a31394f91e 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -1387,4 +1387,64 @@ class ResController extends ResourceControlController return $response->withJson(['information' => $resource]); } + + public static function resetResourceFields(array $args) + { + ValidatorModel::notEmpty($args, ['oldFieldList', 'newFieldList']); + ValidatorModel::arrayType($args, ['oldFieldList', 'newFieldList']); + ValidatorModel::intVal($args, ['resId', 'modelId']); + + if (empty($args['resId']) && empty($args['modelId'])) { + return false; + } + + $oldFieldList = $args['oldFieldList']; + $newModelFields = $args['newFieldList']; + + // Set res_letterbox fields to null + $set = []; + $setToNull = [ + 'confidentiality' => 'confidentiality', + 'admission_date' => 'arrivalDate', + 'departure_date' => 'departureDate', + 'doc_date' => 'documentDate', + 'process_limit_date' => 'processLimitDate', + 'initiator' => 'initiator', + 'destination' => 'destination', + 'priority' => 'priority' + ]; + foreach ($setToNull as $key => $field) { + if (in_array($field, $oldFieldList) && !in_array($field, $newModelFields)) { + $set[$key] = null; + } + } + + $customFieldsToDelete = array_diff($oldFieldList, $newModelFields); + $customFieldsToDelete = array_filter($customFieldsToDelete, function ($field) { + return strpos($field, 'indexingCustomField_') !== false; + }); + $customFieldsToDelete = array_map(function ($field) { + return explode('_', $field)[1]; + }, $customFieldsToDelete); + + $postSet = ['custom_fields' => 'custom_fields ']; + foreach ($customFieldsToDelete as $item) { + $postSet['custom_fields'] .= " - '$item'"; + } + + if (!empty($set) || !empty($postSet)) { + $where = []; + $data = []; + if (!empty($args['resId'])) { + $where = ['res_id = ?']; + $data = [$args['resId']]; + } elseif (!empty($args['modelId'])) { + $where = ['model_id = ?']; + $data = [$args['modelId']]; + } + ResModel::update(['set' => $set, 'postSet' => $postSet, 'where' => $where, 'data' => $data]); + } + + return true; + } }