Skip to content
Snippets Groups Projects
RegisteredNumberRangeController.php 13.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
    * Copyright Maarch since 2008 under licence GPLv3.
    * See LICENCE.txt file at the root folder for more details.
    * This file is part of Maarch software.
    */
    
    /**
     * @brief Registered Number Range Controller
     * @author dev@maarch.org
     */
    
    namespace RegisteredMail\controllers;
    
    use Group\controllers\PrivilegeController;
    use History\controllers\HistoryController;
    use RegisteredMail\models\IssuingSiteModel;
    use RegisteredMail\models\RegisteredNumberRangeModel;
    use Respect\Validation\Validator;
    use Slim\Http\Request;
    use Slim\Http\Response;
    
    class RegisteredNumberRangeController
    {
        public function get(Request $request, Response $response)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $ranges = RegisteredNumberRangeModel::get();
    
            foreach ($ranges as $key => $range) {
    
                $fullness = $range['current_number'] - $range['range_start'];
    
                $rangeSize = $range['range_end'] - $range['range_start'];
                $fullness = ($fullness / $rangeSize) * 100;
    
                $fullness = $fullness < 0 ? 0 : $fullness;
                $fullness = round($fullness, 2);
    
    
                $site = IssuingSiteModel::getById(['id' => $range['site_id']]);
    
                $ranges[$key] = [
                    'id'                    => $range['id'],
    
                    'registeredMailType'    => $range['type'],
                    'trackerNumber'         => $range['tracking_account_number'],
                    'rangeStart'            => $range['range_start'],
                    'rangeEnd'              => $range['range_end'],
                    'creator'               => $range['creator'],
                    'created'               => $range['created'],
                    'status'                => $range['status'],
                    'customerAccountNumber' => $site['account_number'],
    
                    'currentNumber'         => $range['current_number'],
    
                    'fullness'              => $fullness,
                    'siteId'                => $range['site_id'],
                    'siteLabel'             => $site['site_label']
    
                ];
            }
    
            return $response->withJson(['ranges' => $ranges]);
        }
    
        public function getById(Request $request, Response $response, array $args)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $range = RegisteredNumberRangeModel::getById(['id' => $args['id']]);
    
            if (empty($range)) {
                return $response->withStatus(400)->withJson(['errors' => 'Range not found']);
            }
    
    
            $site = IssuingSiteModel::getById(['id' => $range['site_id']]);
    
    
            $fullness = $range['current_number'] - $range['range_start'];
    
            $rangeSize = $range['range_end'] - $range['range_start'];
            $fullness = ($fullness / $rangeSize) * 100;
    
            $fullness = $fullness < 0 ? 0 : $fullness;
            $fullness = round($fullness, 2);
    
            $range = [
                'id'                    => $range['id'],
    
                'registeredMailType'    => $range['type'],
                'trackerNumber'         => $range['tracking_account_number'],
                'rangeStart'            => $range['range_start'],
                'rangeEnd'              => $range['range_end'],
                'creator'               => $range['creator'],
                'created'               => $range['created'],
                'status'                => $range['status'],
                'customerAccountNumber' => $site['account_number'],
    
                'currentNumber'         => $range['current_number'],
    
                'fullness'              => $fullness,
                'siteId'                => $range['site_id'],
                'siteLabel'             => $site['site_label']
    
            ];
    
            return $response->withJson(['range' => $range]);
        }
    
        public function create(Request $request, Response $response)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $body = $request->getParsedBody();
    
    
            if (!Validator::stringType()->notEmpty()->validate($body['registeredMailType'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body registeredMailType is empty or not a string']);
            }
            if (!Validator::stringType()->notEmpty()->validate($body['trackerNumber'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is empty or not a string']);
    
            }
            if (!Validator::intVal()->notEmpty()->validate($body['rangeStart'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart is empty or not an integer']);
            }
            if (!Validator::intVal()->notEmpty()->validate($body['rangeEnd'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body rangeEnd is empty or not an integer']);
            }
            if (!Validator::intVal()->notEmpty()->validate($body['siteId'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body siteId is empty or not an integer']);
            }
    
            $site = IssuingSiteModel::getById(['id' => $body['siteId']]);
            if (empty($site)) {
                return $response->withStatus(400)->withJson(['errors' => 'Body siteId does not exist']);
            }
    
    
            $ranges = RegisteredNumberRangeModel::get([
                'select'  => ['range_start', 'range_end'],
                'where'   => ['type = ?'],
                'data'    => [$body['registeredMailType']],
                'orderBy' => ['range_end desc']
            ]);
    
            foreach ($ranges as $range) {
                if ($body['rangeStart'] <= $range['range_start'] && $range['range_start'] <= $body['rangeEnd']
                    || $body['rangeStart'] <= $range['range_end'] && $range['range_end'] <= $body['rangeEnd']) {
                    return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range']);
                }
            }
    
    
            $id = RegisteredNumberRangeModel::create([
    
                'type'                  => $body['registeredMailType'],
                'trackingAccountNumber' => $body['trackerNumber'],
    
                'rangeStart'            => $body['rangeStart'],
                'rangeEnd'              => $body['rangeEnd'],
                'creator'               => $GLOBALS['id'],
    
                'siteId'                => $body['siteId'],
    
                'status'                => empty($body['status']) ? 'SPD' : $body['status'],
    
                'currentNumber'         => $body['rangeStart']
    
            ]);
    
            HistoryController::add([
                'tableName' => 'registered_number_range',
                'recordId'  => $id,
                'eventType' => 'ADD',
                'info'      => _REGISTERED_NUMBER_RANGE_CREATED . " : {$id}",
                'moduleId'  => 'registered_number_range',
                'eventId'   => 'registered_number_rangeCreation',
            ]);
    
            return $response->withJson(['id' => $id]);
        }
    
        public function update(Request $request, Response $response, array $args)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $range = RegisteredNumberRangeModel::getById(['id' => $args['id']]);
            if (empty($range)) {
                return $response->withStatus(400)->withJson(['errors' => 'Range not found']);
            }
    
            $body = $request->getParsedBody();
    
    
            if (!Validator::stringType()->notEmpty()->validate($body['registeredMailType'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body registeredMailType is empty or not a string']);
            }
            if (!Validator::stringType()->notEmpty()->validate($body['trackerNumber'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is empty or not a string']);
    
            }
            if (!Validator::intVal()->notEmpty()->validate($body['rangeStart'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body rangeStart is empty or not an integer']);
            }
            if (!Validator::intVal()->notEmpty()->validate($body['rangeEnd'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body rangeEnd is empty or not an integer']);
            }
            if (!Validator::intVal()->notEmpty()->validate($body['siteId'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body siteId is empty or not an integer']);
            }
    
            $site = IssuingSiteModel::getById(['id' => $body['siteId']]);
            if (empty($site)) {
                return $response->withStatus(400)->withJson(['errors' => 'Body siteId does not exist']);
            }
    
    
            $ranges = RegisteredNumberRangeModel::get([
                'select'  => ['range_start', 'range_end'],
                'where'   => ['type = ?', 'id != ?'],
                'data'    => [$body['registeredMailType'], $args['id']],
                'orderBy' => ['range_end desc']
            ]);
    
            foreach ($ranges as $item) {
                if ($body['rangeStart'] <= $item['range_start'] && $item['range_start'] <= $body['rangeEnd']
                    || $body['rangeStart'] <= $item['range_end'] && $item['range_end'] <= $body['rangeEnd']) {
                    return $response->withStatus(400)->withJson(['errors' => 'Range overlaps another range']);
                }
            }
    
            if ($body['status'] == 'OK' && $range['status'] != 'OK') {
                RegisteredNumberRangeModel::update([
                    'set'   => [
                        'status' => 'END'
                    ],
                    'where' => ['type = ?', 'status = ?'],
                    'data'  => [$body['registeredMailType'], 'OK']
                ]);
            }
    
            if ($range['status'] != 'SPD' && $body['status'] != $range['status']) {
                RegisteredNumberRangeModel::update([
                    'set'   => [
                        'status' => $body['status']
                    ],
                    'where' => ['id = ?'],
                    'data'  => [$args['id']]
                ]);
                return $response->withStatus(204);
            } elseif ($range['status'] != 'SPD' && $body['status'] == $range['status']) {
                return $response->withStatus(400)->withJson(['errors' => 'Range cannot be updated']);
            }
    
    
            RegisteredNumberRangeModel::update([
                'set'   => [
    
                    'type'                    => $body['registeredMailType'],
                    'tracking_account_number' => $body['trackerNumber'],
    
                    'range_start'             => $body['rangeStart'],
                    'range_end'               => $body['rangeEnd'],
    
                    'site_id'                 => $body['siteId'],
                    'status'                  => $body['status']
    
                ],
                'where' => ['id = ?'],
                'data'  => [$args['id']]
            ]);
    
            HistoryController::add([
                'tableName' => 'issuing_sites',
                'recordId'  => $args['id'],
                'eventType' => 'UP',
                'info'      => _REGISTERED_NUMBER_RANGE_UPDATED . " : {$args['id']}",
                'moduleId'  => 'issuing_sites',
                'eventId'   => 'issuingSitesModification',
            ]);
    
            return $response->withStatus(204);
        }
    
        public function delete(Request $request, Response $response, array $args)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
    
            $range = RegisteredNumberRangeModel::getById(['id' => $args['id']]);
            if (empty($range)) {
    
            if ($range['status'] == 'OK') {
                return $response->withStatus(400)->withJson(['errors' => 'Range cannot be deleted']);
            }
    
    
            RegisteredNumberRangeModel::delete([
                'where' => ['id = ?'],
                'data'  => [$args['id']]
            ]);
    
            HistoryController::add([
                'tableName' => 'registered_number_range',
                'recordId'  => $args['id'],
                'eventType' => 'DEL',
                'info'      => _REGISTERED_NUMBER_RANGE_DELETED . " : {$args['id']}",
                'moduleId'  => 'registered_number_range',
                'eventId'   => 'registeredNumberRangeSuppression',
            ]);
    
            return $response->withStatus(204);
        }
    
    
        public function getLastNumberByType(Request $request, Response $response, array $args)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $range = RegisteredNumberRangeModel::get([
                'select'  => ['range_end'],
                'where'   => ['type = ?'],
                'data'    => [$args['type']],
                'orderBy' => ['range_end desc']
            ]);
    
            if (empty($range)) {
                return $response->withStatus(403)->withJson(['errors' => 'No range found for type : ' . $args['type']]);
            }
    
            $range = $range[0];
    
            return $response->withJson(['lastNumber' => $range['range_end']]);
        }