* logger added

* calendar view in maintenance
* $year filter support in xlsx and maintenance
This commit is contained in:
Danyi Dávid 2018-11-19 16:48:12 +01:00
parent b906e360bf
commit 4d52d4b575
13 changed files with 392 additions and 131 deletions

View File

@ -29,11 +29,13 @@
},
"require": {
"php": "^7.1",
"ext-json": "*",
"dasprid/container-interop-doctrine": "^1.1",
"doctrine/data-fixtures": "~2.0",
"gedmo/doctrine-extensions": "^2.4",
"imagine/imagine": "^1.1.0",
"lcobucci/jwt": "^3.3",
"los/loslog": "^3.1",
"monolog/monolog": "^1.24",
"oro/doctrine-extensions": "^1.2",
"phpoffice/phpexcel": "1.8.1",
@ -54,8 +56,7 @@
"zendframework/zend-mail": "^2.10.0",
"zendframework/zend-permissions-rbac": "^3.0.0",
"zendframework/zend-servicemanager": "^3.3",
"zendframework/zend-stdlib": "^3.1",
"ext-json": "*"
"zendframework/zend-stdlib": "^3.1"
},
"require-dev": {
"phpunit/phpunit": "^7.0.1",

172
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "99fd952d2eafc5dafae9479945333cc4",
"content-hash": "be48e23d53e2ae2899e20570e3baa394",
"packages": [
{
"name": "behat/transliterator",
@ -1333,6 +1333,74 @@
],
"time": "2018-11-11T12:23:46+00:00"
},
{
"name": "los/loslog",
"version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/Lansoweb/LosLog.git",
"reference": "a6dc0138f2db721ffa134d495972c20b2da2e7b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Lansoweb/LosLog/zipball/a6dc0138f2db721ffa134d495972c20b2da2e7b6",
"reference": "a6dc0138f2db721ffa134d495972c20b2da2e7b6",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/container": "^1.0",
"psr/log": "^1.0",
"zendframework/zend-diactoros": "^1.7",
"zendframework/zend-log": "^2.9",
"zendframework/zend-stratigility": "^3.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6",
"phpstan/phpstan": "^0.9.2",
"phpunit/phpunit": "^7.0",
"rollbar/rollbar": "^1.4",
"satooshi/php-coveralls": "^2.0",
"squizlabs/php_codesniffer": "^2.7",
"zendframework/zend-coding-standard": "^1.0"
},
"suggest": {
"rollbar/rollbar": "Needed if you want to use Rollbar logger"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-develop": "2.0-dev"
}
},
"autoload": {
"psr-4": {
"LosMiddleware\\LosLog\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Leandro Silva",
"email": "leandro@leandrosilva.info",
"homepage": "http://leandrosilva.info"
}
],
"description": "LosLog provides some log utility",
"homepage": "http://github.com/Lansoweb/LosLog",
"keywords": [
"expressive",
"log",
"los",
"module",
"zf2",
"zf3"
],
"time": "2018-03-16T13:02:56+00:00"
},
{
"name": "monolog/monolog",
"version": "1.24.0",
@ -2951,41 +3019,38 @@
},
{
"name": "zendframework/zend-diactoros",
"version": "2.0.0",
"version": "1.8.6",
"source": {
"type": "git",
"url": "https://github.com/zendframework/zend-diactoros.git",
"reference": "0bae78192e634774b5584f0210c1232da82cb1ff"
"reference": "20da13beba0dde8fb648be3cc19765732790f46e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/0bae78192e634774b5584f0210c1232da82cb1ff",
"reference": "0bae78192e634774b5584f0210c1232da82cb1ff",
"url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e",
"reference": "20da13beba0dde8fb648be3cc19765732790f46e",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/http-factory": "^1.0",
"php": "^5.6 || ^7.0",
"psr/http-message": "^1.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-dom": "*",
"ext-libxml": "*",
"http-interop/http-factory-tests": "^0.5.0",
"php-http/psr7-integration-tests": "dev-master",
"phpunit/phpunit": "^7.0.2",
"zendframework/zend-coding-standard": "~1.0.0"
"phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7",
"zendframework/zend-coding-standard": "~1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev",
"dev-develop": "2.1.x-dev",
"dev-release-1.8": "1.8.x-dev"
"dev-master": "1.8.x-dev",
"dev-develop": "1.9.x-dev",
"dev-release-2.0": "2.0.x-dev"
}
},
"autoload": {
@ -3005,15 +3070,16 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
"BSD-2-Clause"
],
"description": "PSR HTTP Message implementations",
"homepage": "https://github.com/zendframework/zend-diactoros",
"keywords": [
"http",
"psr",
"psr-7"
],
"time": "2018-09-27T19:49:04+00:00"
"time": "2018-09-05T19:29:37+00:00"
},
{
"name": "zendframework/zend-escaper",
@ -3661,6 +3727,77 @@
],
"time": "2018-04-30T15:20:54+00:00"
},
{
"name": "zendframework/zend-log",
"version": "2.10.0",
"source": {
"type": "git",
"url": "https://github.com/zendframework/zend-log.git",
"reference": "9cec3b092acb39963659c2f32441cccc56b3f430"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/zendframework/zend-log/zipball/9cec3b092acb39963659c2f32441cccc56b3f430",
"reference": "9cec3b092acb39963659c2f32441cccc56b3f430",
"shasum": ""
},
"require": {
"php": "^5.6 || ^7.0",
"psr/log": "^1.0",
"zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
"zendframework/zend-stdlib": "^2.7 || ^3.0"
},
"provide": {
"psr/log-implementation": "1.0.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^5.7.15 || ^6.0.8",
"zendframework/zend-coding-standard": "~1.0.0",
"zendframework/zend-db": "^2.6",
"zendframework/zend-escaper": "^2.5",
"zendframework/zend-filter": "^2.5",
"zendframework/zend-mail": "^2.6.1",
"zendframework/zend-validator": "^2.10.1"
},
"suggest": {
"ext-mongo": "mongo extension to use Mongo writer",
"ext-mongodb": "mongodb extension to use MongoDB writer",
"zendframework/zend-console": "Zend\\Console component to use the RequestID log processor",
"zendframework/zend-db": "Zend\\Db component to use the database log writer",
"zendframework/zend-escaper": "Zend\\Escaper component, for use in the XML log formatter",
"zendframework/zend-mail": "Zend\\Mail component to use the email log writer",
"zendframework/zend-validator": "Zend\\Validator component to block invalid log messages"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.10.x-dev",
"dev-develop": "2.11.x-dev"
},
"zf": {
"component": "Zend\\Log",
"config-provider": "Zend\\Log\\ConfigProvider"
}
},
"autoload": {
"psr-4": {
"Zend\\Log\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "component for general purpose logging",
"homepage": "https://github.com/zendframework/zend-log",
"keywords": [
"log",
"logging",
"zf2"
],
"time": "2018-04-09T21:59:51+00:00"
},
{
"name": "zendframework/zend-mail",
"version": "2.10.0",
@ -6175,7 +6312,8 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^7.1"
"php": "^7.1",
"ext-json": "*"
},
"platform-dev": []
}

View File

@ -49,7 +49,8 @@ return [
'api.fault-comment.post',
'api.fault-reject.post',
'api.maintenance',
'api.maintenance.upcoming'
'api.maintenance.upcoming',
'api.maintenance.calendar',
],
'ufo' => [
'api.fault.put',
@ -69,6 +70,7 @@ return [
'api.maintenance',
'api.maintenance.put',
'api.maintenance.upcoming',
'api.maintenance.calendar',
],
'karbantarto' => [
],

View File

@ -0,0 +1,27 @@
<?php
use Zend\Stratigility\Middleware\ErrorHandler;
return [
'dependencies' => [
'factories' => [
LosMiddleware\LosLog\LosLog::class => LosMiddleware\LosLog\LosLogFactory::class,
LosMiddleware\LosLog\HttpLog::class => LosMiddleware\LosLog\HttpLogFactory::class,
Psr\Log\LoggerInterface::class => LosMiddleware\LosLog\LoggerFactory::class,
],
'delegators' => [
ErrorHandler::class => [
LosMiddleware\LosLog\ErrorHandlerListenerDelegatorFactory::class,
],
],
],
'loslog' => [
'log_dir' => 'data/log',
'error_logger_file' => 'error.log',
'exception_logger_file' => 'exception.log',
'static_logger_file' => 'static.log',
'http_logger_file' => 'http.log',
'log_request' => false,
'log_response' => false,
'full' => false,
],
];

View File

@ -13,6 +13,7 @@ $cacheConfig = [
];
$aggregator = new ConfigAggregator([
\Zend\Log\ConfigProvider::class,
\Zend\Cache\ConfigProvider::class,
\Zend\Expressive\ConfigProvider::class,
\Zend\Expressive\Helper\ConfigProvider::class,

View File

@ -40,33 +40,35 @@ return function (
$app->get('/', App\Handler\PingHandler::class, 'home');
$app->get('/api/ping', App\Handler\PingHandler::class, 'api.ping');
$app->get('/api/maintenance/upcoming', App\Handler\MaintenanceUpcomingHandler::class, 'api.maintenance.upcoming');
$app->route('/api/maintenance[/{id:\w+}]', App\Handler\MaintenanceHandler::class, ['GET', 'OPTIONS'], 'api.maintenance');
$app->route('/api/maintenance/{id:\w+}', App\Handler\MaintenanceHandler::class, ['PUT'], 'api.maintenance.put');
$app->get('/api/maintenance/calendar/{year:\d+}', App\Handler\MaintenanceCalendarHandler::class, 'api.maintenance.calendar');
$app->get('/api/maintenance/upcoming/{year:\d+}', App\Handler\MaintenanceUpcomingHandler::class, 'api.maintenance.upcoming');
$app->get('/api/maintenance/{year:\d+}', App\Handler\MaintenanceHandler::class, 'api.maintenance.list');
$app->get('/api/maintenance/{year:\d+}/{id:w\+}', App\Handler\MaintenanceHandler::class, 'api.maintenance.get');
$app->put('/api/maintenance/{id:\w+}', App\Handler\MaintenanceHandler::class, 'api.maintenance.put');
// authentication and user management
$app->route('/api/auth/login', App\Handler\Auth\AuthHandler::class, ['POST', 'OPTIONS'], 'api.auth.login');
$app->route('/api/auth/renew', App\Handler\Auth\AuthHandler::class, ['GET', 'OPTIONS'], 'api.auth.renew');
$app->route('/api/user[/{id:\d+}]', App\Handler\User\UserHandler::class, ['GET', 'PUT', 'OPTIONS'], 'api.user.profile');
$app->route('/api/user/password', App\Handler\User\PasswordHandler::class, ['POST', 'OPTIONS'], 'api.user.password');
$app->post('/api/auth/login', App\Handler\Auth\AuthHandler::class, 'api.auth.login');
$app->get('/api/auth/renew', App\Handler\Auth\AuthHandler::class, 'api.auth.renew');
$app->route('/api/user[/{id:\d+}]', App\Handler\User\UserHandler::class, ['GET', 'PUT'], 'api.user.profile');
$app->post('/api/user/password', App\Handler\User\PasswordHandler::class, 'api.user.password');
// fault management
$app->route('/api/fault[/{id:\d+}]', App\Handler\Fault\FaultHandler::class, ['GET', 'OPTIONS'], 'api.fault.get'); // list/show
$app->get('/api/fault[/{id:\d+}]', App\Handler\Fault\FaultHandler::class, 'api.fault.get'); // list/show
$app->post('/api/fault', App\Handler\Fault\FaultHandler::class, 'api.fault.post'); // create
$app->put('/api/fault/{id:\d+}', App\Handler\Fault\FaultHandler::class, 'api.fault.put'); // update
$app->delete('/api/fault/{id:\d+}', App\Handler\Fault\FaultHandler::class, 'api.fault.delete');
$app->route('/api/fault-reject/{id:\d+}', App\Handler\Fault\FaultRejectHandler::class, ['POST', 'OPTIONS'], 'api.fault-reject.post');
$app->route('/api/fault-comment/{id:\d+}', App\Handler\Fault\FaultCommentHandler::class, ['POST', 'OPTIONS'], 'api.fault-comment.post');
$app->route('/api/fault-attachment/{id:\d+}/{type}', App\Handler\Fault\FaultAttachmentHandler::class, ['POST', 'OPTIONS'], 'api.fault-attachment.post');
$app->route('/show-attachment/{id:\d+}', App\Handler\Fault\FaultAttachmentHandler::class, ['GET', 'OPTIONS'], 'show-attachment');
$app->post('/api/fault-reject/{id:\d+}', App\Handler\Fault\FaultRejectHandler::class, 'api.fault-reject.post');
$app->post('/api/fault-comment/{id:\d+}', App\Handler\Fault\FaultCommentHandler::class, 'api.fault-comment.post');
$app->post('/api/fault-attachment/{id:\d+}/{type}', App\Handler\Fault\FaultAttachmentHandler::class, 'api.fault-attachment.post');
$app->get('/show-attachment/{id:\d+}', App\Handler\Fault\FaultAttachmentHandler::class, 'show-attachment');
$app->route('/hibajegy-pdf/{id:\d+}[/{filename}]', App\Handler\Pdf\GenerateWorksheetHandler::class, ['GET', 'OPTIONS'], 'hibajegy-pdf');
$app->route('/karbantartasjegy-pdf/{id:\w+}[/{filename}]', App\Handler\Pdf\GenerateMaintenanceSheetHandler::class, ['GET', 'OPTIONS'], 'karbantartasjegy-pdf');
$app->get('/hibajegy-pdf/{id:\d+}[/{filename}]', App\Handler\Pdf\GenerateWorksheetHandler::class, 'hibajegy-pdf');
$app->get('/karbantartasjegy-pdf/{id:\w+}[/{filename}]', App\Handler\Pdf\GenerateMaintenanceSheetHandler::class, 'karbantartasjegy-pdf');
// core data
$app->route('/api/error-category', App\Handler\ErrorCategoryHandler::class, ['GET', 'OPTIONS'], 'api.error-category.get'); // list/show
$app->route('/api/error-origin', App\Handler\ErrorOriginHandler::class, ['GET', 'OPTIONS'], 'api.error-origin.get'); // list/show
$app->route('/api/facility-location', App\Handler\FacilityLocationHandler::class, ['GET', 'OPTIONS'], 'api.facility-location.get'); // list/show
$app->route('/api/solution-time-interval', App\Handler\SolutionTimeIntervalHandler::class, ['GET', 'OPTIONS'], 'api.solution-time-interval.get'); // list/show
$app->get('/api/error-category', App\Handler\ErrorCategoryHandler::class, 'api.error-category.get'); // list/show
$app->get('/api/error-origin', App\Handler\ErrorOriginHandler::class, 'api.error-origin.get'); // list/show
$app->get('/api/facility-location', App\Handler\FacilityLocationHandler::class, 'api.facility-location.get'); // list/show
$app->get('/api/solution-time-interval', App\Handler\SolutionTimeIntervalHandler::class, 'api.solution-time-interval.get'); // list/show
};

View File

@ -42,6 +42,7 @@ class ConfigProvider
'factories' => [
Handler\MaintenanceHandler::class => Handler\MaintenanceFactory::class,
Handler\MaintenanceUpcomingHandler::class => Handler\MaintenanceUpcomingFactory::class,
Handler\MaintenanceCalendarHandler::class => Handler\MaintenanceCalendarFactory::class,
Handler\Auth\AuthHandler::class => Handler\Auth\AuthFactory::class,
Handler\User\UserHandler::class => Handler\User\UserFactory::class,

View File

@ -0,0 +1,19 @@
<?php
namespace App\Handler;
use App\Service\MaintenanceManagerService;
use Interop\Container\ContainerInterface;
class MaintenanceCalendarFactory
{
/**
* @param ContainerInterface $container
* @return MaintenanceCalendarHandler
*/
public function __invoke(ContainerInterface $container): MaintenanceCalendarHandler
{
$maintenanceManagerService = $container->get(MaintenanceManagerService::class);
return new MaintenanceCalendarHandler($maintenanceManagerService);
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Handler;
use ApiLibs\AbstractHandler\CrudHandler;
use App\Service\MaintenanceManagerService;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Diactoros\Response\JsonResponse;
class MaintenanceCalendarHandler extends CrudHandler
{
/** @var MaintenanceManagerService */
private $maintenanceManagerService;
public function __construct(MaintenanceManagerService $maintenanceManagerService)
{
$this->maintenanceManagerService = $maintenanceManagerService;
}
/**
* Renew auth token
*
* @param ServerRequestInterface $request
* @return ResponseInterface
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function getList(ServerRequestInterface $request): ResponseInterface
{
$year = (int)$request->getAttribute('year', date("Y"));
return new JsonResponse($this->maintenanceManagerService->getCalendarMaintenanceList($year));
}
}

View File

@ -26,7 +26,8 @@ class MaintenanceHandler extends CrudHandler
*/
public function getList(ServerRequestInterface $request): ResponseInterface
{
return new JsonResponse($this->maintenanceManagerService->getMaintenanceList()->getValues());
$year = (int)$request->getAttribute('year', date("Y"));
return new JsonResponse($this->maintenanceManagerService->getMaintenanceList($year)->getValues());
}
/**
@ -39,7 +40,8 @@ class MaintenanceHandler extends CrudHandler
public function get(ServerRequestInterface $request): ResponseInterface
{
$hash = $request->getAttribute(self::IDENTIFIER_NAME);
return new JsonResponse($this->maintenanceManagerService->get($hash));
$year = (int)$request->getAttribute('year', date("Y"));
return new JsonResponse($this->maintenanceManagerService->get($hash, $year));
}
/**
@ -53,7 +55,7 @@ class MaintenanceHandler extends CrudHandler
{
$hash = $request->getAttribute(self::IDENTIFIER_NAME);
$data = $this->getRequestData($request);
$jwt = $request->getAttribute('token');
return new JsonResponse($this->maintenanceManagerService->update($hash, $data, $jwt->uid));
$token = $request->getAttribute('token');
return new JsonResponse($this->maintenanceManagerService->update($hash, $data, $token['uid']));
}
}

View File

@ -26,6 +26,7 @@ class MaintenanceUpcomingHandler extends CrudHandler
*/
public function getList(ServerRequestInterface $request): ResponseInterface
{
return new JsonResponse($this->maintenanceManagerService->getUpcomingMaintenanceList()->getValues());
$year = (int)$request->getAttribute('year', date("Y"));
return new JsonResponse($this->maintenanceManagerService->getUpcomingMaintenanceList($year)->getValues());
}
}

View File

@ -25,29 +25,36 @@ class MaintenanceManagerService
/** @var UserService */
private $userService;
/** @var int */
private $year;
public function __construct(
EntityManager $em,
DoctrineObject $hydrator,
XlsxParserService $xlsxParserService,
UserService $userService
) {
// $this->year = date("Y");
$this->year = 2018;
$this->em = $em;
$this->hydrator = $hydrator;
$this->xlsxParserService = $xlsxParserService;
$this->userService = $userService;
}
public function getMaintenanceList(): ArrayCollection
/**
* @param int $year
* @return ArrayCollection
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function getMaintenanceList(int $year): ArrayCollection
{
return $this->getUpdatedXlsxData();
return $this->getUpdatedXlsxData($year);
}
public function getUpcomingMaintenanceList(): ArrayCollection
/**
* @param int $year
* @return ArrayCollection
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function getUpcomingMaintenanceList(int $year): ArrayCollection
{
$firstDayOfThisWeek = new \DateTime("@" . strtotime(sprintf("-%s days", date("N") - 0)));
$firstDayOfThisWeek
@ -55,7 +62,7 @@ class MaintenanceManagerService
->setTime(0, 0);
$twoWeeksFromNow = (clone $firstDayOfThisWeek)->add(\DateInterval::createFromDateString("+14 days"));
$deviceGroups = $this->getUpdatedXlsxData();
$deviceGroups = $this->getUpdatedXlsxData($year);
foreach ($deviceGroups as $deviceGroup) {
/** @var DeviceGroup $deviceGroup */
@ -82,15 +89,57 @@ class MaintenanceManagerService
}
/**
* @return DeviceGroup[]|ArrayCollection
* @param $year
* @return array
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
private function getUpdatedXlsxData()
public function getCalendarMaintenanceList($year): array
{
$result = [];
$deviceGroups = $this->getUpdatedXlsxData($year);
foreach ($deviceGroups as $deviceGroup) {
/** @var DeviceGroup $deviceGroup */
foreach ($deviceGroup->getDevices() as $device) {
foreach ($device->getTasks() as $task) {
$result[$task->getMonth()][] = [
'id' => $task->getHash(),
'state' => $task->getState(),
'month' => $task->getMonth(),
'start' => $task->getShouldStartAt()->format("Y-m-d"),
'finish' => $task->getShouldBeDoneBy()->format("Y-m-d"),
'group' => $deviceGroup->getName(),
'device' => [
'name' => $device->getName(),
'count' => $device->getCount(),
'work' => $device->getWorkDescription(),
],
];
}
}
// $devices = $deviceGroup->getDevices()->filter(function (Device $device) {
// return count($device->getTasks());
// });
// $deviceGroup->setDevices($devices);
}
return array_values($result);
}
/**
* @param $year
* @return DeviceGroup[]|ArrayCollection
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
private function getUpdatedXlsxData($year)
{
/** @var DeviceGroup[] $loadedCacheData */
$loadedCacheData = $this->xlsxParserService->getXlsxData();
$loadedCacheData = $this->xlsxParserService->getXlsxData($year);
/** @var Maintenance[] $dbMaintenances */
$dbMaintenances = $this->getMaintenancesInYear($this->year);
$dbMaintenances = $this->getMaintenancesInYear($year);
foreach ($dbMaintenances as $maintenance) {
foreach ($loadedCacheData as &$deviceGroup) {
foreach ($deviceGroup->getDevices() as &$device) {
@ -105,6 +154,10 @@ class MaintenanceManagerService
return $loadedCacheData;
}
/**
* @param $year
* @return array
*/
public function getMaintenancesInYear($year): array
{
$qb = $this->em->createQueryBuilder();
@ -120,16 +173,19 @@ class MaintenanceManagerService
/**
* @param string $hash
* @param int $year
* @return Maintenance
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function get(string $hash): Maintenance
public function get(string $hash, int $year): Maintenance
{
/** @var Maintenance $maintenance */
if (null == ($maintenance = $this->em->find(Maintenance::class, $hash))) {
$maintenance = $this->initMaintenanceInDatabase($hash);
$maintenance = $this->initMaintenanceInDatabase($hash, $year);
}
return $maintenance;
}
@ -142,10 +198,12 @@ class MaintenanceManagerService
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function update(string $hash, $data, int $uid): Maintenance
{
$maintenance = $this->get($hash);
$maintenance = $this->get($hash, (int)$data['year']);
/** @var Maintenance $maintenance */
$maintenance = $this->hydrator->hydrate($data, $maintenance);
if (null == $maintenance->getStartedBy()) {
@ -163,43 +221,17 @@ class MaintenanceManagerService
/**
* @param string $id
* @param string $state
* @param int $uid
* @param $year
* @return Maintenance
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
* @deprecated
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function setStatus(string $id, string $state, int $uid): Maintenance
{
$user = $this->userService->get($uid);
$maintenance = $this->get($id);
$maintenance->setState($state);
switch ($state) {
case "wip":
$maintenance->setWorkStarted(new \DateTime())
->setWorksheetNumber($this->generateWorksheetId($maintenance->getShouldStartAt()->format("Y")))
->setStartedBy($user);
break;
case "fin":
$maintenance->setWorkFinished(new \DateTime())
->setFinishedBy($user);
break;
}
$this->em->flush();
return $maintenance;
}
/**
* @param string $id
* @return Maintenance
* @throws \Doctrine\ORM\OptimisticLockException
*/
private function initMaintenanceInDatabase(string $id): Maintenance
private function initMaintenanceInDatabase(string $id, $year): Maintenance
{
$taskFound = null;
$loadedCacheData = $this->getUpdatedXlsxData();
$loadedCacheData = $this->getUpdatedXlsxData($year);
foreach ($loadedCacheData as $deviceGroup) {
foreach ($deviceGroup->getDevices() as $device) {
foreach ($device->getTasks() as $task) {
@ -218,7 +250,7 @@ class MaintenanceManagerService
->setResponsible($taskFound->getDevice()->getResponsible())
->setCount($taskFound->getDevice()->getCount())
->setWorkDescription($taskFound->getDevice()->getWorkDescription())
->setYear($this->year)
->setYear($year)
->setMonth($taskFound->getMonth())
->setWeek($taskFound->getWeek())
->setWorkerCount($taskFound->getWorkerCount())
@ -231,20 +263,20 @@ class MaintenanceManagerService
}
/**
* @param $workSheetYear
* @return string
*/
private function generateWorksheetId($year): string
private function generateWorksheetId($workSheetYear): string
{
$yearsFaultCount = $this->em->createQueryBuilder()
->select('count(f.hash)')
->from(Maintenance::class, 'f')
->where('YEAR(f.shouldStartAt) = :thisYear')
// ->andWhere('f.shouldStartAt IS NOT null')
->andWhere('f.worksheetNumber IS NOT null')
->setParameter('thisYear', $year)
->setParameter('thisYear', $workSheetYear)
->getQuery()
->setHydrationMode(Query::HYDRATE_SINGLE_SCALAR)
->execute();
return sprintf("%s/%s", $this->year, $yearsFaultCount+1);
return sprintf("%s/%s", $workSheetYear, $yearsFaultCount+1);
}
}

View File

@ -15,24 +15,15 @@ class XlsxParserService
const XLSX_FILE_NAME = 'data/user-upload/webnaplo_%s.xlsx';
const XLSX_CACHE_FILE = 'data/cache/xlsx-full-cache_%s.dat';
/**
* @var DeviceGroup[]|ArrayCollection
*/
/** @var DeviceGroup[]|ArrayCollection */
private $deviceGroups;
/**
* @var int
*/
private $year;
/**
* XlsxParserService constructor.
*/
public function __construct()
{
$this->deviceGroups = new ArrayCollection();
$this->year = date("Y");
// $this->year = 2018;
}
/**
@ -60,46 +51,55 @@ class XlsxParserService
}
/**
* @param int $year
* @return ArrayCollection|Maintenance[]
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function getXlsxData(): ArrayCollection
public function getXlsxData(int $year): ArrayCollection
{
if (!file_exists($this->getXlsxFileName())) {
if (!file_exists($this->getXlsxFileName($year))) {
return new ArrayCollection();
}
if (!file_exists($this->getTimestampFileName()) ||
!file_exists($this->getCacheFileName()) ||
file_get_contents($this->getTimestampFileName()) < filemtime($this->getXlsxFileName())
if (!file_exists($this->getTimestampFileName($year)) ||
!file_exists($this->getCacheFileName($year)) ||
file_get_contents($this->getTimestampFileName($year)) < filemtime($this->getXlsxFileName($year))
) {
$this->rebuildCache();
$this->rebuildCache($year);
}
/** @var ArrayCollection|DeviceGroup[] $loadedCacheData */
$loadedCacheData = unserialize(file_get_contents($this->getCacheFileName()));
$loadedCacheData = unserialize(file_get_contents($this->getCacheFileName($year)));
return $loadedCacheData;
}
private function rebuildCache()
/**
* @param int $year
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
private function rebuildCache(int $year)
{
$mtime = filemtime($this->getXlsxFileName());
$parsedXlsxData = $this->parseXlsx();
file_put_contents($this->getCacheFileName(), serialize($parsedXlsxData));
file_put_contents($this->getTimestampFileName(), $mtime);
$mtime = filemtime($this->getXlsxFileName($year));
$parsedXlsxData = $this->parseXlsx($year);
file_put_contents($this->getCacheFileName($year), serialize($parsedXlsxData));
file_put_contents($this->getTimestampFileName($year), $mtime);
}
/**
* @param int $year
* @return ArrayCollection
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
*/
public function parseXlsx(): ArrayCollection
public function parseXlsx(int $year): ArrayCollection
{
$objPHPExcel = \PHPExcel_IOFactory::load($this->getXlsxFileName());
$objPHPExcel = \PHPExcel_IOFactory::load($this->getXlsxFileName($year));
$sheet = $objPHPExcel->getSheetByName(self::XLSX_SHEET_NAME);
$totalRows = $sheet->getHighestRow();
$monthColumns = $this->year == 2018
$monthColumns = $year == 2018
? range(43, 58)
: range(11, 58);
$rowCursor = 7;
@ -146,11 +146,11 @@ class XlsxParserService
$weekDataCell = $sheet->getCellByColumnAndRow($column, $rowCursor);
if ($weekDataCell->getValue() != "") {
$month = floor(($column - 11) / 4 + 1);
$firstDayOfFirstWeek = $this->getFirstWeekOfMonth($month);
$firstDayOfFirstWeek = $this->getFirstWeekOfMonth($year, $month);
$week = ($column - 11) % 4 + 1;
$task = new DeviceMaintenanceTask($device);
$task->setYear($this->year)
$task->setYear($year)
->setMonth($month)
->setWeek($week)
->setShouldStartAt($firstDayOfFirstWeek->add(
@ -183,12 +183,13 @@ class XlsxParserService
}
/**
* @param int $year
* @param int $month
* @return \DateTime
*/
private function getFirstWeekOfMonth(int $month): \DateTime
private function getFirstWeekOfMonth(int $year, int $month): \DateTime
{
$firstDayOfMonth = mktime(0, 0, 0, $month, 1, $this->year);
$firstDayOfMonth = mktime(0, 0, 0, $month, 1, $year);
$weekDayOfFirst = date("N", $firstDayOfMonth);
if ($weekDayOfFirst == 2) {
@ -203,24 +204,24 @@ class XlsxParserService
return new \DateTime(sprintf(
"%s-%s-%s",
$this->year,
$year,
$month,
$firstWeekMonday
));
}
private function getCacheFileName(): string
private function getCacheFileName(int $year): string
{
return sprintf(self::XLSX_CACHE_FILE, $this->year);
return sprintf(self::XLSX_CACHE_FILE, $year);
}
private function getTimestampFileName(): string
private function getTimestampFileName(int $year): string
{
return sprintf(self::XLSX_TIMESTAMP, $this->year);
return sprintf(self::XLSX_TIMESTAMP, $year);
}
private function getXlsxFileName(): string
private function getXlsxFileName(int $year): string
{
return sprintf(self::XLSX_FILE_NAME, $this->year);
return sprintf(self::XLSX_FILE_NAME, $year);
}
}