From cdb59aa6a6d06dce994524f310471a57b6ff1041 Mon Sep 17 00:00:00 2001 From: Jerome_maarch Date: Tue, 13 Oct 2020 16:53:02 +0200 Subject: [PATCH 1/3] feat/15005 generate automatic id --- data/maarchRM/conf/configuration.ini.default | 22 +++++ .../maarchRM/sql/pgsql/migrationV2.6_V2.7.sql | 2 + .../Controller/archiveEntryTrait.php | 6 ++ .../archiverArchiveIdGeneratorInterface.php | 31 +++++++ .../recordsManagement/Generator/Sequence.php | 80 +++++++++++++++++++ .../Resources/sql/schema.pgsql.sql | 2 + 6 files changed, 143 insertions(+) create mode 100644 src/bundle/recordsManagement/Controller/archiverArchiveIdGeneratorInterface.php create mode 100644 src/bundle/recordsManagement/Generator/Sequence.php diff --git a/data/maarchRM/conf/configuration.ini.default b/data/maarchRM/conf/configuration.ini.default index d188e8d21..3f96e0877 100755 --- a/data/maarchRM/conf/configuration.ini.default +++ b/data/maarchRM/conf/configuration.ini.default @@ -60,6 +60,28 @@ refDirectory = "%laabsDirectory%/data/maarchRM/ref" ; 3 = both archivalProfileType = 2 +; Automatic generation of archiverArchiveId on deposit +; format : The format with constant and variable values (see doc for available variables and parameters). +; Variable parameters are following a %1$s syntax identic than one use for php sprintf function +; % is mandatory, it tell system it's a variable +; number. Argument repetition. 1 MUST be delegated to separator +; $ mandatory +; s see sprintf documentation +; +; isAutomaticallyForced : false : a value will be generated and set only if no value is provided on the submission +; true : a value will be generated and replace any incoming value on the submission +; sequenceSeparator : string : a string representing the delimiter between sequences. This separator MUST not be used inside format +; +archiveIdGenerator = "{ + 'service' : 'recordsManagement/Generator/Sequence', + 'archiverArchiveIdRules' : { + 'isAutomaticallyForced' : true, + 'isInheritedFromParent' : true, + 'format' : 'FR094080%1$s%2$d%1$sAE%3$s', + 'sequenceSeparator' : '_' + } +}" + ; Default Retention Rule if any retention rule is set up ("dispose" or "preserve") actionWithoutRetentionRule = "dispose" diff --git a/data/maarchRM/sql/pgsql/migrationV2.6_V2.7.sql b/data/maarchRM/sql/pgsql/migrationV2.6_V2.7.sql index 280f83ea7..4e1f8285f 100644 --- a/data/maarchRM/sql/pgsql/migrationV2.6_V2.7.sql +++ b/data/maarchRM/sql/pgsql/migrationV2.6_V2.7.sql @@ -4,3 +4,5 @@ UPDATE "lifeCycle"."eventFormat" SET format = 'type senderOrgRegNumber senderOrg INSERT INTO "lifeCycle"."eventFormat" (type, format, message, notification) VALUES ('digitalResource/integrityCheck', 'repositoryReference addressesToCheck checkedAddresses failed', 'Contrôle d''intégrité des ressources présentes dans %6$s', false); ALTER TABLE "organization"."organization" ADD COLUMN "history" text; + +CREATE SEQUENCE IF NOT EXISTS "recordsManagement"."archiverArchiveIdSequence"; diff --git a/src/bundle/recordsManagement/Controller/archiveEntryTrait.php b/src/bundle/recordsManagement/Controller/archiveEntryTrait.php index 93bfa0075..7df06770d 100755 --- a/src/bundle/recordsManagement/Controller/archiveEntryTrait.php +++ b/src/bundle/recordsManagement/Controller/archiveEntryTrait.php @@ -456,6 +456,12 @@ trait archiveEntryTrait $this->manageFileplanPosition($archive); + $generators = \laabs::configuration('recordsManagement')['archiveIdGenerator']; + if (!empty($generators)) { + $generatorService = \laabs::newService($generators['service']); + $generatorService->generate($archive); + } + if (empty($archive->descriptionClass) && isset($this->currentArchivalProfile->descriptionClass)) { $archive->descriptionClass = $this->currentArchivalProfile->descriptionClass; } diff --git a/src/bundle/recordsManagement/Controller/archiverArchiveIdGeneratorInterface.php b/src/bundle/recordsManagement/Controller/archiverArchiveIdGeneratorInterface.php new file mode 100644 index 000000000..986f87a62 --- /dev/null +++ b/src/bundle/recordsManagement/Controller/archiverArchiveIdGeneratorInterface.php @@ -0,0 +1,31 @@ +. + */ + +namespace bundle\recordsManagement\Controller; + +interface archiverArchiveIdGeneratorInterface +{ + /** + * Receive an archive + * + * @param recordsManagement/archive $archive The archive to receive + */ + public function generate($archive); +} diff --git a/src/bundle/recordsManagement/Generator/Sequence.php b/src/bundle/recordsManagement/Generator/Sequence.php new file mode 100644 index 000000000..54696144c --- /dev/null +++ b/src/bundle/recordsManagement/Generator/Sequence.php @@ -0,0 +1,80 @@ +. + */ +namespace bundle\recordsManagement\Generator; + +class Sequence implements \bundle\recordsManagement\Controller\archiverArchiveIdGeneratorInterface +{ + /** + * Sdo Factory for management of archive persistance + * @var dependency/sdo/Factory + */ + protected $sdoFactory; + + public function __construct(\dependency\sdo\Factory $sdoFactory) + { + $this->sdoFactory = $sdoFactory; + } + /** + * Generate archiverArchiveId + * + * @param recordsManagement/archive $archive + * + * @return recordsManagement/archive $archive + */ + public function generate($archive) + { + $sequenceConfiguration = \laabs::configuration('recordsManagement')['archiveIdGenerator']['archiverArchiveIdRules']; + if (is_null($sequenceConfiguration) || empty($sequenceConfiguration)) { + return; + } + + if (!empty($archive->archiverArchiveId) && !$sequenceConfiguration['isAutomaticallyForced']) { + return; + } + + if (isset($archive->parentArchiveId) && !empty($archive->parentArchiveId)) { + $parentArchive = $this->sdoFactory->read('recordsManagement/archive', $archive->parentArchiveId); + $directChildrenCount = $this->sdoFactory->count('recordsManagement/archive', "parentArchiveId='$archive->parentArchiveId'"); + + $archive->archiverArchiveId = $parentArchive->archiverArchiveId . $sequenceConfiguration['sequenceSeparator'] . str_pad($directChildrenCount + 1, 7, 0, STR_PAD_LEFT); + } else { + $sequenceId = $this->getNewSequenceId(); + $year = date("Y"); + $archive->archiverArchiveId = sprintf($sequenceConfiguration['format'], $sequenceConfiguration['sequenceSeparator'], $year, str_pad($sequenceId, 7, 0, STR_PAD_LEFT)); + } + } + + protected function getNewSequenceId() + { + $sequenceId = null; + + $query = <<sdoFactory->das->pdo->prepare($query); + $stmt->execute(); + while ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) { + $sequenceId = $result['nextval']; + } + + return $sequenceId; + } +} diff --git a/src/bundle/recordsManagement/Resources/sql/schema.pgsql.sql b/src/bundle/recordsManagement/Resources/sql/schema.pgsql.sql index 63278dddc..5d51e7fa4 100755 --- a/src/bundle/recordsManagement/Resources/sql/schema.pgsql.sql +++ b/src/bundle/recordsManagement/Resources/sql/schema.pgsql.sql @@ -347,3 +347,5 @@ CREATE INDEX "recordsManagement_archive_originatorArchiveId_idx" ON "recordsMana CREATE INDEX "recordsManagement_archiveRelationship_archiveId_idx" ON "recordsManagement"."archiveRelationship" USING btree ("archiveId"); CREATE INDEX "recordsManagement_archiveRelationship_relatedArchiveId_idx" ON "recordsManagement"."archiveRelationship" USING btree ("relatedArchiveId"); + +CREATE SEQUENCE IF NOT EXISTS "recordsManagement"."archiverArchiveIdSequence"; -- GitLab From 95d53d1997cff8be9f920cf2c8e0afa11577332e Mon Sep 17 00:00:00 2001 From: Jerome_maarch Date: Wed, 14 Oct 2020 12:15:37 +0200 Subject: [PATCH 2/3] feat/15005 add generateid when deposing from external --- src/bundle/medona/Controller/ArchiveTransfer.php | 15 +++++++++++++++ .../Controller/archiveEntryTrait.php | 6 +++--- .../recordsManagement/Generator/Sequence.php | 3 ++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/bundle/medona/Controller/ArchiveTransfer.php b/src/bundle/medona/Controller/ArchiveTransfer.php index 032f11fdc..f2e650f53 100644 --- a/src/bundle/medona/Controller/ArchiveTransfer.php +++ b/src/bundle/medona/Controller/ArchiveTransfer.php @@ -965,6 +965,9 @@ class ArchiveTransfer extends abstractMessage $this->archiveController->manageFileplanPosition($archive); $this->archiveController->convertArchive($archive); + + $this->generateId($archive); + $this->archiveController->deposit($archive, $storagePath); $unitIdentifier = \laabs::newInstance("medona/unitIdentifier"); @@ -983,6 +986,7 @@ class ArchiveTransfer extends abstractMessage } } + $message->status = "processed"; $this->update($message); } catch (\Exception $e) { @@ -1024,6 +1028,17 @@ class ArchiveTransfer extends abstractMessage return (string) $replyMessage->messageId; } + protected function generateId($archive) + { + $generator = \laabs::configuration('recordsManagement')['archiveIdGenerator']; + if (empty($generator)) { + return; + } + + $generatorService = \laabs::newService($generator['service']); + $generatorService->generate($archive); + } + /** * Get received archive tranfer message * diff --git a/src/bundle/recordsManagement/Controller/archiveEntryTrait.php b/src/bundle/recordsManagement/Controller/archiveEntryTrait.php index 7df06770d..2cfee1218 100755 --- a/src/bundle/recordsManagement/Controller/archiveEntryTrait.php +++ b/src/bundle/recordsManagement/Controller/archiveEntryTrait.php @@ -456,9 +456,9 @@ trait archiveEntryTrait $this->manageFileplanPosition($archive); - $generators = \laabs::configuration('recordsManagement')['archiveIdGenerator']; - if (!empty($generators)) { - $generatorService = \laabs::newService($generators['service']); + $generator = \laabs::configuration('recordsManagement')['archiveIdGenerator']; + if (!empty($generator)) { + $generatorService = \laabs::newService($generator['service']); $generatorService->generate($archive); } diff --git a/src/bundle/recordsManagement/Generator/Sequence.php b/src/bundle/recordsManagement/Generator/Sequence.php index 54696144c..08cc29039 100644 --- a/src/bundle/recordsManagement/Generator/Sequence.php +++ b/src/bundle/recordsManagement/Generator/Sequence.php @@ -52,7 +52,8 @@ class Sequence implements \bundle\recordsManagement\Controller\archiverArchiveId if (isset($archive->parentArchiveId) && !empty($archive->parentArchiveId)) { $parentArchive = $this->sdoFactory->read('recordsManagement/archive', $archive->parentArchiveId); - $directChildrenCount = $this->sdoFactory->count('recordsManagement/archive', "parentArchiveId='$archive->parentArchiveId'"); + $parentArchiveId = (string) $parentArchive->archiveId; + $directChildrenCount = $this->sdoFactory->count('recordsManagement/archive', "parentArchiveId='$parentArchiveId'"); $archive->archiverArchiveId = $parentArchive->archiverArchiveId . $sequenceConfiguration['sequenceSeparator'] . str_pad($directChildrenCount + 1, 7, 0, STR_PAD_LEFT); } else { -- GitLab From f8f6641f5c3e44ffab61cb0c4bcd5ccbf1bea656 Mon Sep 17 00:00:00 2001 From: Jerome_maarch Date: Thu, 15 Oct 2020 10:47:42 +0200 Subject: [PATCH 3/3] feat/15005 add config param --- src/bundle/recordsManagement/Generator/Sequence.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bundle/recordsManagement/Generator/Sequence.php b/src/bundle/recordsManagement/Generator/Sequence.php index 08cc29039..39b1d258f 100644 --- a/src/bundle/recordsManagement/Generator/Sequence.php +++ b/src/bundle/recordsManagement/Generator/Sequence.php @@ -50,7 +50,7 @@ class Sequence implements \bundle\recordsManagement\Controller\archiverArchiveId return; } - if (isset($archive->parentArchiveId) && !empty($archive->parentArchiveId)) { + if (isset($archive->parentArchiveId) && !empty($archive->parentArchiveId) && $sequenceConfiguration['isInheritedFromParent']) { $parentArchive = $this->sdoFactory->read('recordsManagement/archive', $archive->parentArchiveId); $parentArchiveId = (string) $parentArchive->archiveId; $directChildrenCount = $this->sdoFactory->count('recordsManagement/archive', "parentArchiveId='$parentArchiveId'"); -- GitLab