diff --git a/data/maarchRM/conf/configuration.ini.default b/data/maarchRM/conf/configuration.ini.default index d188e8d21c4e46ce7352a7d00c477ac4d30f31b8..3f96e0877ac5927758e9a48e90044222eb36101c 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 280f83ea7269bf81c28136ce8e617d49a80b0d88..4e1f8285fc6c8b03b300e4dcf25a729f3abb28e8 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/medona/Controller/ArchiveTransfer.php b/src/bundle/medona/Controller/ArchiveTransfer.php index 032f11fdcc0d9820f35c2890094950c26c963d73..f2e650f535c4400dbd6dac6bee32a8be29406ffd 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 93bfa0075f42df1e05c3824850a4e6050c426d93..2cfee121819bad8c9d7fbe8f1482a527ff1267c6 100755 --- a/src/bundle/recordsManagement/Controller/archiveEntryTrait.php +++ b/src/bundle/recordsManagement/Controller/archiveEntryTrait.php @@ -456,6 +456,12 @@ trait archiveEntryTrait $this->manageFileplanPosition($archive); + $generator = \laabs::configuration('recordsManagement')['archiveIdGenerator']; + if (!empty($generator)) { + $generatorService = \laabs::newService($generator['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 0000000000000000000000000000000000000000..986f87a62844ae25c4337d3e2cff466b4dee5271 --- /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 0000000000000000000000000000000000000000..39b1d258fcf34be5708fdec1cdf65635c3347c0e --- /dev/null +++ b/src/bundle/recordsManagement/Generator/Sequence.php @@ -0,0 +1,81 @@ +. + */ +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) && $sequenceConfiguration['isInheritedFromParent']) { + $parentArchive = $this->sdoFactory->read('recordsManagement/archive', $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 { + $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 63278dddc3e59b54fc94e43df68f8588a8a4b9d5..5d51e7fa41ee2a1e38c6cb64ab13b9ca2a134b82 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";