Newer
Older
<?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'],
Guillaume Heurtier
committed
'label' => $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'],
Guillaume Heurtier
committed
'label' => $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' => [1],
'where' => ['tracking_account_number = ?'],
'data' => [$body['trackerNumber']]
]);
if (!empty($ranges)) {
return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range']);
}
$ranges = RegisteredNumberRangeModel::get([
'select' => ['range_start', 'range_end'],
'where' => ['type = ?', 'site_id = ?', 'status = ?'],
'data' => [$body['registeredMailType'], $body['siteId'], 'OK'],
'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'],
Guillaume Heurtier
committed
'currentNumber' => null
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
]);
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' => [1],
'where' => ['tracking_account_number = ?', 'id != ?'],
'data' => [$body['trackerNumber'], $args['id']]
]);
if (!empty($ranges)) {
return $response->withStatus(400)->withJson(['errors' => 'Body trackerNumber is already used by another range']);
}
$ranges = RegisteredNumberRangeModel::get([
'select' => ['range_start', 'range_end'],
Guillaume Heurtier
committed
'where' => ['type = ?', 'id != ?', 'site_id = ?'],
'data' => [$body['registeredMailType'], $args['id'], $range['site_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'
],
Guillaume Heurtier
committed
'where' => ['type = ?', 'status = ?', 'site_id = ?'],
'data' => [$body['registeredMailType'], 'OK', $range['site_id']]
]);
}
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']);
}
Guillaume Heurtier
committed
$currentNumber = $range['current_number'];
if ($body['status'] == 'OK' && $range['status'] != 'OK' && $currentNumber == null) {
$currentNumber = $body['rangeStart'];
}
RegisteredNumberRangeModel::update([
'set' => [
'type' => $body['registeredMailType'],
'tracking_account_number' => $body['trackerNumber'],
'range_start' => $body['rangeStart'],
'range_end' => $body['rangeEnd'],
'site_id' => $body['siteId'],
Guillaume Heurtier
committed
'status' => $body['status'],
'current_number' => $currentNumber
],
'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 = ?', 'status in (?)'],
'data' => [$args['type'], ['OK', 'SPD']],
'orderBy' => ['range_end desc']
]);
if (empty($range)) {
Guillaume Heurtier
committed
return $response->withJson(['lastNumber' => 1]);
}
$range = $range[0];
return $response->withJson(['lastNumber' => $range['range_end']]);
}