diff --git a/composer.json b/composer.json index b05c4f6..cb818bc 100644 --- a/composer.json +++ b/composer.json @@ -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", diff --git a/composer.lock b/composer.lock index 913bd3e..c0d91fa 100644 --- a/composer.lock +++ b/composer.lock @@ -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": [] } diff --git a/config/autoload/authx2.global.php b/config/autoload/authx2.global.php index 20f7863..34051f3 100644 --- a/config/autoload/authx2.global.php +++ b/config/autoload/authx2.global.php @@ -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' => [ ], diff --git a/config/autoload/loslog.global.php b/config/autoload/loslog.global.php new file mode 100644 index 0000000..d2c5e92 --- /dev/null +++ b/config/autoload/loslog.global.php @@ -0,0 +1,27 @@ + [ + '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, + ], +]; diff --git a/config/config.php b/config/config.php index 04c8410..fe42362 100644 --- a/config/config.php +++ b/config/config.php @@ -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, diff --git a/config/routes.php b/config/routes.php index 2d513cb..88fc06c 100644 --- a/config/routes.php +++ b/config/routes.php @@ -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 }; diff --git a/src/App/ConfigProvider.php b/src/App/ConfigProvider.php index 6babe39..a25f9c5 100644 --- a/src/App/ConfigProvider.php +++ b/src/App/ConfigProvider.php @@ -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, diff --git a/src/App/Handler/MaintenanceCalendarFactory.php b/src/App/Handler/MaintenanceCalendarFactory.php new file mode 100644 index 0000000..8ae6a24 --- /dev/null +++ b/src/App/Handler/MaintenanceCalendarFactory.php @@ -0,0 +1,19 @@ +get(MaintenanceManagerService::class); + return new MaintenanceCalendarHandler($maintenanceManagerService); + } +} diff --git a/src/App/Handler/MaintenanceCalendarHandler.php b/src/App/Handler/MaintenanceCalendarHandler.php new file mode 100644 index 0000000..6d5ed7e --- /dev/null +++ b/src/App/Handler/MaintenanceCalendarHandler.php @@ -0,0 +1,34 @@ +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)); + } +} diff --git a/src/App/Handler/MaintenanceHandler.php b/src/App/Handler/MaintenanceHandler.php index 620ba8c..a764734 100644 --- a/src/App/Handler/MaintenanceHandler.php +++ b/src/App/Handler/MaintenanceHandler.php @@ -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'])); } } diff --git a/src/App/Handler/MaintenanceUpcomingHandler.php b/src/App/Handler/MaintenanceUpcomingHandler.php index bed4c82..22cbd5e 100644 --- a/src/App/Handler/MaintenanceUpcomingHandler.php +++ b/src/App/Handler/MaintenanceUpcomingHandler.php @@ -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()); } } diff --git a/src/App/Service/MaintenanceManagerService.php b/src/App/Service/MaintenanceManagerService.php index 8fb54dc..9f59571 100644 --- a/src/App/Service/MaintenanceManagerService.php +++ b/src/App/Service/MaintenanceManagerService.php @@ -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); } } diff --git a/src/App/Service/XlsxParserService.php b/src/App/Service/XlsxParserService.php index fd970ff..e4c0622 100644 --- a/src/App/Service/XlsxParserService.php +++ b/src/App/Service/XlsxParserService.php @@ -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); } }