Loading Classes/WE/SpreadsheetImport/Command/SpreadsheetImportCommandController.php +8 −8 Original line number Original line Diff line number Diff line Loading @@ -46,12 +46,12 @@ class SpreadsheetImportCommandController extends CommandController { protected $settings; protected $settings; /** /** * Import one pending queued spreadsheet into Domain data, and it will import the next one if it is done * Import next queued spreadsheets into domain objects asynchronously. */ */ public function importCommand() { public function importCommand() { $currentImportingCount = $this->spreadsheetImportRepository->countByImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); $currentImportingCount = $this->spreadsheetImportRepository->countByImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); if ($currentImportingCount > 0) { if ($currentImportingCount > 0) { $this->outputFormatted('There is a progressing importing spreadsheet.'); $this->outputFormatted('Previous spreadsheet import is still in progress.'); $this->quit(); $this->quit(); } } /** @var SpreadsheetImport $spreadsheetImport */ /** @var SpreadsheetImport $spreadsheetImport */ Loading @@ -67,25 +67,25 @@ class SpreadsheetImportCommandController extends CommandController { try { try { $this->spreadsheetImportService->import(); $this->spreadsheetImportService->import(); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_COMPLETED); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_COMPLETED); $this->outputFormatted('Spreadsheet has been imported. (totalInserted: %d, totalUpdated: %d, totalDeleted: %d, totalSkipped: %d)', $this->outputFormatted('Spreadsheet has been imported. %d inserted, %d updated, %d deleted, %d skipped', array($spreadsheetImport->getTotalInserted(), $spreadsheetImport->getTotalUpdated(), $spreadsheetImport->getTotalDeleted(), $spreadsheetImport->getTotalSkipped())); array($spreadsheetImport->getTotalInserted(), $spreadsheetImport->getTotalUpdated(), $spreadsheetImport->getTotalDeleted(), $spreadsheetImport->getTotalSkipped())); } catch (Exception $e) { } catch (Exception $e) { $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $this->outputFormatted('Spreadsheet imported failed.'); $this->outputFormatted('Spreadsheet import failed.'); } } $this->spreadsheetImportRepository->update($spreadsheetImport); $this->spreadsheetImportRepository->update($spreadsheetImport); } else { } else { $this->outputFormatted('There is no spreadsheet importing in queue.'); $this->outputFormatted('No spreadsheet import in queue.'); } } } } /** /** * Cleanup previous spreadsheet imports by specific time (defined by settings) * Cleanup previous spreadsheet imports. Threashold defined in settings. */ */ public function cleanupCommand() { public function cleanupCommand() { $cleanupImportFromPreviousDay = $this->settings['cleanupImportFromPreviousDay']; $cleanupImportsThreasholdDays = intval($this->settings['cleanupImportsThreasholdDays']); $cleanupFromDate = new \DateTime(); $cleanupFromDate = new \DateTime(); $cleanupFromDate->sub(new \DateInterval('P' . $cleanupImportFromPreviousDay . 'D')); $cleanupFromDate->sub(new \DateInterval('P' . $cleanupImportsThreasholdDays . 'D')); $oldSpreadsheetImports = $this->spreadsheetImportRepository->findPreviousImportsBySpecificDate($cleanupFromDate); $oldSpreadsheetImports = $this->spreadsheetImportRepository->findPreviousImportsBySpecificDate($cleanupFromDate); if ($oldSpreadsheetImports->count() > 0) { if ($oldSpreadsheetImports->count() > 0) { /** @var SpreadsheetImport $oldSpreadsheetImport */ /** @var SpreadsheetImport $oldSpreadsheetImport */ Loading Classes/WE/SpreadsheetImport/SpreadsheetImportService.php +15 −27 Original line number Original line Diff line number Diff line Loading @@ -137,8 +137,8 @@ class SpreadsheetImportService { public function getObjectByRow($number) { public function getObjectByRow($number) { $domain = $this->domain; $domain = $this->domain; $newObject = new $domain; $newObject = new $domain; // Plus one to skip the headings $sheet = $this->getFileActiveSheet(); $sheet = $this->getFileActiveSheet(); // Plus one to skip the headings $row = $sheet->getRowIterator($number + 1, $number + 1)->current(); $row = $sheet->getRowIterator($number + 1, $number + 1)->current(); $this->setObjectPropertiesByRow($newObject, $row); $this->setObjectPropertiesByRow($newObject, $row); return $newObject; return $newObject; Loading @@ -151,74 +151,62 @@ class SpreadsheetImportService { $totalInserted = 0; $totalInserted = 0; $totalUpdated = 0; $totalUpdated = 0; $totalDeleted = 0; $totalDeleted = 0; $totalSkipped = 0; $processedObjectIds = array(); $objectIds = array(); $domain = $this->domain; $objectRepository = $this->getDomainRepository(); $objectRepository = $this->getDomainRepository(); $objectValidator = $this->validatorResolver->getBaseValidatorConjunction($domain); $objectValidator = $this->validatorResolver->getBaseValidatorConjunction($this->domain); $identifierProperties = $this->getDomainMappingIdentifierProperties(); $identifierProperties = $this->getDomainMappingIdentifierProperties(); $sheet = $this->getFileActiveSheet(); $sheet = $this->getFileActiveSheet(); $numberOfRecordsToPersist = $this->settings['numberOfRecordsToPersist']; $persistRecordsChunkSize = intval($this->settings['persistRecordsChunkSize']); $i = 0; $totalCount = 0; /** @var \PHPExcel_Worksheet_Row $row */ /** @var \PHPExcel_Worksheet_Row $row */ foreach ($sheet->getRowIterator(2) as $row) { foreach ($sheet->getRowIterator(2) as $row) { $totalCount++; $object = $this->findObjectByIdentifierPropertiesPerRow($identifierProperties, $row); $object = $this->findObjectByIdentifierPropertiesPerRow($identifierProperties, $row); if (is_object($object)) { if (is_object($object)) { $objectIds[] = $this->persistenceManager->getIdentifierByObject($object); $processedObjectIds[] = $this->persistenceManager->getIdentifierByObject($object); if ($this->spreadsheetImport->isUpdating()) { if ($this->spreadsheetImport->isUpdating()) { $this->setObjectPropertiesByRow($object, $row); $this->setObjectPropertiesByRow($object, $row); $validationResult = $objectValidator->validate($object); $validationResult = $objectValidator->validate($object); if ($validationResult->hasErrors()) { if ($validationResult->hasErrors()) { $totalSkipped++; continue; continue; } } $objectRepository->update($object); $objectRepository->update($object); $totalUpdated++; $totalUpdated++; $i++; } else { } else { $totalSkipped++; continue; continue; } } } elseif ($this->spreadsheetImport->isInserting()) { } elseif ($this->spreadsheetImport->isInserting()) { $newObject = new $domain; $newObject = new $this->domain; $this->setObjectPropertiesByRow($newObject, $row); $this->setObjectPropertiesByRow($newObject, $row); $validationResult = $objectValidator->validate($newObject); $validationResult = $objectValidator->validate($newObject); if ($validationResult->hasErrors()) { if ($validationResult->hasErrors()) { $totalSkipped++; continue; continue; } } $objectRepository->add($newObject); $objectRepository->add($newObject); $objectIds[] = $this->persistenceManager->getIdentifierByObject($newObject); $processedObjectIds[] = $this->persistenceManager->getIdentifierByObject($newObject); $totalInserted++; $totalInserted++; $i++; } else { } else { $totalSkipped++; continue; continue; } } if ($i >= $numberOfRecordsToPersist) { if ($totalCount % $persistRecordsChunkSize === 0) { $this->persistenceManager->persistAll(); $this->persistenceManager->persistAll(); $i = 0; } } } } $deleteCount = 0; // remove objects which are not exist on the spreadsheet if ($this->spreadsheetImport->isDeleting()) { if ($this->spreadsheetImport->isDeleting()) { $notExistingObjects = $this->findObjectsByExcludedIds($objectIds); $notExistingObjects = $this->findObjectsByExcludedIds($processedObjectIds); foreach ($notExistingObjects as $object) { foreach ($notExistingObjects as $object) { $objectRepository->remove($object); $objectRepository->remove($object); $totalDeleted++; if (++$deleteCount % $persistRecordsChunkSize === 0) { $i++; if ($i >= $numberOfRecordsToPersist) { $this->persistenceManager->persistAll(); $this->persistenceManager->persistAll(); $i = 0; } } } } } } $this->persistenceManager->persistAll(); $this->spreadsheetImport->setTotalInserted($totalInserted); $this->spreadsheetImport->setTotalInserted($totalInserted); $this->spreadsheetImport->setTotalUpdated($totalUpdated); $this->spreadsheetImport->setTotalUpdated($totalUpdated); $this->spreadsheetImport->setTotalSkipped($totalCount - $totalInserted - $totalUpdated); $this->spreadsheetImport->setTotalDeleted($totalDeleted); $this->spreadsheetImport->setTotalDeleted($totalDeleted); $this->spreadsheetImport->setTotalSkipped($totalSkipped); } } /** /** Loading Configuration/Settings.yaml +2 −2 Original line number Original line Diff line number Diff line WE: WE: SpreadsheetImport: SpreadsheetImport: cleanupImportFromPreviousDay: 365 cleanupImportsThreasholdDays: 365 numberOfRecordsToPersist: 100 persistRecordsChunkSize: 100 Configuration/Settings.yaml.example +2 −2 Original line number Original line Diff line number Diff line WE: WE: SpreadsheetImport: SpreadsheetImport: cleanupImportFromPreviousDay: 365 cleanupImportsThreasholdDays: 365 numberOfRecordsToPersist: 100 persistRecordsChunkSize: 100 default: default: domain: WE\Sample\Domain\Model\User domain: WE\Sample\Domain\Model\User arguments: arguments: Loading Resources/Private/Translations/de/Main.xlf +2 −2 Original line number Original line Diff line number Diff line Loading @@ -44,10 +44,10 @@ <source>Ungültige Daten. Dieser Record wird nicht übersprungen.</source> <source>Ungültige Daten. Dieser Record wird nicht übersprungen.</source> </trans-unit> </trans-unit> <trans-unit id="label.spreadsheet_import.preview.record"> <trans-unit id="label.spreadsheet_import.preview.record"> <source>Vorschau Zeile</source> <source>Zeile</source> </trans-unit> </trans-unit> <trans-unit id="label.spreadsheet_import.list"> <trans-unit id="label.spreadsheet_import.list"> <source>Spreadsheet Imports</source> <source>Importe</source> </trans-unit> </trans-unit> <!-- Status --> <!-- Status --> Loading Loading
Classes/WE/SpreadsheetImport/Command/SpreadsheetImportCommandController.php +8 −8 Original line number Original line Diff line number Diff line Loading @@ -46,12 +46,12 @@ class SpreadsheetImportCommandController extends CommandController { protected $settings; protected $settings; /** /** * Import one pending queued spreadsheet into Domain data, and it will import the next one if it is done * Import next queued spreadsheets into domain objects asynchronously. */ */ public function importCommand() { public function importCommand() { $currentImportingCount = $this->spreadsheetImportRepository->countByImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); $currentImportingCount = $this->spreadsheetImportRepository->countByImportingStatus(SpreadsheetImport::IMPORTING_STATUS_IN_PROGRESS); if ($currentImportingCount > 0) { if ($currentImportingCount > 0) { $this->outputFormatted('There is a progressing importing spreadsheet.'); $this->outputFormatted('Previous spreadsheet import is still in progress.'); $this->quit(); $this->quit(); } } /** @var SpreadsheetImport $spreadsheetImport */ /** @var SpreadsheetImport $spreadsheetImport */ Loading @@ -67,25 +67,25 @@ class SpreadsheetImportCommandController extends CommandController { try { try { $this->spreadsheetImportService->import(); $this->spreadsheetImportService->import(); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_COMPLETED); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_COMPLETED); $this->outputFormatted('Spreadsheet has been imported. (totalInserted: %d, totalUpdated: %d, totalDeleted: %d, totalSkipped: %d)', $this->outputFormatted('Spreadsheet has been imported. %d inserted, %d updated, %d deleted, %d skipped', array($spreadsheetImport->getTotalInserted(), $spreadsheetImport->getTotalUpdated(), $spreadsheetImport->getTotalDeleted(), $spreadsheetImport->getTotalSkipped())); array($spreadsheetImport->getTotalInserted(), $spreadsheetImport->getTotalUpdated(), $spreadsheetImport->getTotalDeleted(), $spreadsheetImport->getTotalSkipped())); } catch (Exception $e) { } catch (Exception $e) { $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $spreadsheetImport->setImportingStatus(SpreadsheetImport::IMPORTING_STATUS_FAILED); $this->outputFormatted('Spreadsheet imported failed.'); $this->outputFormatted('Spreadsheet import failed.'); } } $this->spreadsheetImportRepository->update($spreadsheetImport); $this->spreadsheetImportRepository->update($spreadsheetImport); } else { } else { $this->outputFormatted('There is no spreadsheet importing in queue.'); $this->outputFormatted('No spreadsheet import in queue.'); } } } } /** /** * Cleanup previous spreadsheet imports by specific time (defined by settings) * Cleanup previous spreadsheet imports. Threashold defined in settings. */ */ public function cleanupCommand() { public function cleanupCommand() { $cleanupImportFromPreviousDay = $this->settings['cleanupImportFromPreviousDay']; $cleanupImportsThreasholdDays = intval($this->settings['cleanupImportsThreasholdDays']); $cleanupFromDate = new \DateTime(); $cleanupFromDate = new \DateTime(); $cleanupFromDate->sub(new \DateInterval('P' . $cleanupImportFromPreviousDay . 'D')); $cleanupFromDate->sub(new \DateInterval('P' . $cleanupImportsThreasholdDays . 'D')); $oldSpreadsheetImports = $this->spreadsheetImportRepository->findPreviousImportsBySpecificDate($cleanupFromDate); $oldSpreadsheetImports = $this->spreadsheetImportRepository->findPreviousImportsBySpecificDate($cleanupFromDate); if ($oldSpreadsheetImports->count() > 0) { if ($oldSpreadsheetImports->count() > 0) { /** @var SpreadsheetImport $oldSpreadsheetImport */ /** @var SpreadsheetImport $oldSpreadsheetImport */ Loading
Classes/WE/SpreadsheetImport/SpreadsheetImportService.php +15 −27 Original line number Original line Diff line number Diff line Loading @@ -137,8 +137,8 @@ class SpreadsheetImportService { public function getObjectByRow($number) { public function getObjectByRow($number) { $domain = $this->domain; $domain = $this->domain; $newObject = new $domain; $newObject = new $domain; // Plus one to skip the headings $sheet = $this->getFileActiveSheet(); $sheet = $this->getFileActiveSheet(); // Plus one to skip the headings $row = $sheet->getRowIterator($number + 1, $number + 1)->current(); $row = $sheet->getRowIterator($number + 1, $number + 1)->current(); $this->setObjectPropertiesByRow($newObject, $row); $this->setObjectPropertiesByRow($newObject, $row); return $newObject; return $newObject; Loading @@ -151,74 +151,62 @@ class SpreadsheetImportService { $totalInserted = 0; $totalInserted = 0; $totalUpdated = 0; $totalUpdated = 0; $totalDeleted = 0; $totalDeleted = 0; $totalSkipped = 0; $processedObjectIds = array(); $objectIds = array(); $domain = $this->domain; $objectRepository = $this->getDomainRepository(); $objectRepository = $this->getDomainRepository(); $objectValidator = $this->validatorResolver->getBaseValidatorConjunction($domain); $objectValidator = $this->validatorResolver->getBaseValidatorConjunction($this->domain); $identifierProperties = $this->getDomainMappingIdentifierProperties(); $identifierProperties = $this->getDomainMappingIdentifierProperties(); $sheet = $this->getFileActiveSheet(); $sheet = $this->getFileActiveSheet(); $numberOfRecordsToPersist = $this->settings['numberOfRecordsToPersist']; $persistRecordsChunkSize = intval($this->settings['persistRecordsChunkSize']); $i = 0; $totalCount = 0; /** @var \PHPExcel_Worksheet_Row $row */ /** @var \PHPExcel_Worksheet_Row $row */ foreach ($sheet->getRowIterator(2) as $row) { foreach ($sheet->getRowIterator(2) as $row) { $totalCount++; $object = $this->findObjectByIdentifierPropertiesPerRow($identifierProperties, $row); $object = $this->findObjectByIdentifierPropertiesPerRow($identifierProperties, $row); if (is_object($object)) { if (is_object($object)) { $objectIds[] = $this->persistenceManager->getIdentifierByObject($object); $processedObjectIds[] = $this->persistenceManager->getIdentifierByObject($object); if ($this->spreadsheetImport->isUpdating()) { if ($this->spreadsheetImport->isUpdating()) { $this->setObjectPropertiesByRow($object, $row); $this->setObjectPropertiesByRow($object, $row); $validationResult = $objectValidator->validate($object); $validationResult = $objectValidator->validate($object); if ($validationResult->hasErrors()) { if ($validationResult->hasErrors()) { $totalSkipped++; continue; continue; } } $objectRepository->update($object); $objectRepository->update($object); $totalUpdated++; $totalUpdated++; $i++; } else { } else { $totalSkipped++; continue; continue; } } } elseif ($this->spreadsheetImport->isInserting()) { } elseif ($this->spreadsheetImport->isInserting()) { $newObject = new $domain; $newObject = new $this->domain; $this->setObjectPropertiesByRow($newObject, $row); $this->setObjectPropertiesByRow($newObject, $row); $validationResult = $objectValidator->validate($newObject); $validationResult = $objectValidator->validate($newObject); if ($validationResult->hasErrors()) { if ($validationResult->hasErrors()) { $totalSkipped++; continue; continue; } } $objectRepository->add($newObject); $objectRepository->add($newObject); $objectIds[] = $this->persistenceManager->getIdentifierByObject($newObject); $processedObjectIds[] = $this->persistenceManager->getIdentifierByObject($newObject); $totalInserted++; $totalInserted++; $i++; } else { } else { $totalSkipped++; continue; continue; } } if ($i >= $numberOfRecordsToPersist) { if ($totalCount % $persistRecordsChunkSize === 0) { $this->persistenceManager->persistAll(); $this->persistenceManager->persistAll(); $i = 0; } } } } $deleteCount = 0; // remove objects which are not exist on the spreadsheet if ($this->spreadsheetImport->isDeleting()) { if ($this->spreadsheetImport->isDeleting()) { $notExistingObjects = $this->findObjectsByExcludedIds($objectIds); $notExistingObjects = $this->findObjectsByExcludedIds($processedObjectIds); foreach ($notExistingObjects as $object) { foreach ($notExistingObjects as $object) { $objectRepository->remove($object); $objectRepository->remove($object); $totalDeleted++; if (++$deleteCount % $persistRecordsChunkSize === 0) { $i++; if ($i >= $numberOfRecordsToPersist) { $this->persistenceManager->persistAll(); $this->persistenceManager->persistAll(); $i = 0; } } } } } } $this->persistenceManager->persistAll(); $this->spreadsheetImport->setTotalInserted($totalInserted); $this->spreadsheetImport->setTotalInserted($totalInserted); $this->spreadsheetImport->setTotalUpdated($totalUpdated); $this->spreadsheetImport->setTotalUpdated($totalUpdated); $this->spreadsheetImport->setTotalSkipped($totalCount - $totalInserted - $totalUpdated); $this->spreadsheetImport->setTotalDeleted($totalDeleted); $this->spreadsheetImport->setTotalDeleted($totalDeleted); $this->spreadsheetImport->setTotalSkipped($totalSkipped); } } /** /** Loading
Configuration/Settings.yaml +2 −2 Original line number Original line Diff line number Diff line WE: WE: SpreadsheetImport: SpreadsheetImport: cleanupImportFromPreviousDay: 365 cleanupImportsThreasholdDays: 365 numberOfRecordsToPersist: 100 persistRecordsChunkSize: 100
Configuration/Settings.yaml.example +2 −2 Original line number Original line Diff line number Diff line WE: WE: SpreadsheetImport: SpreadsheetImport: cleanupImportFromPreviousDay: 365 cleanupImportsThreasholdDays: 365 numberOfRecordsToPersist: 100 persistRecordsChunkSize: 100 default: default: domain: WE\Sample\Domain\Model\User domain: WE\Sample\Domain\Model\User arguments: arguments: Loading
Resources/Private/Translations/de/Main.xlf +2 −2 Original line number Original line Diff line number Diff line Loading @@ -44,10 +44,10 @@ <source>Ungültige Daten. Dieser Record wird nicht übersprungen.</source> <source>Ungültige Daten. Dieser Record wird nicht übersprungen.</source> </trans-unit> </trans-unit> <trans-unit id="label.spreadsheet_import.preview.record"> <trans-unit id="label.spreadsheet_import.preview.record"> <source>Vorschau Zeile</source> <source>Zeile</source> </trans-unit> </trans-unit> <trans-unit id="label.spreadsheet_import.list"> <trans-unit id="label.spreadsheet_import.list"> <source>Spreadsheet Imports</source> <source>Importe</source> </trans-unit> </trans-unit> <!-- Status --> <!-- Status --> Loading