<?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)) { return $response->withStatus(204); } 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']]); } }