From bd23cbf916083785b025e9740b343ecd0652f072 Mon Sep 17 00:00:00 2001 From: aynsix Date: Mon, 17 Jun 2024 20:24:17 +0300 Subject: [PATCH] download report by field --- .../Command/Report/DownloadsCommand.php | 37 ++++++++++++++++--- lib/Alchemy/Phrasea/Report/ReportActions.php | 19 ++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php index 606b992758..8f78aa6bb1 100644 --- a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php +++ b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php @@ -9,7 +9,7 @@ class DownloadsCommand extends AbstractReportCommand { - const TYPES = ['user', 'record']; + const TYPES = ['user', 'record', 'field']; public function __construct() { @@ -20,6 +20,7 @@ public function __construct() ->addOption('type', null, InputOption::VALUE_REQUIRED, 'type of report downloads, if not defined or empty it is for all downloads') ->addOption('collection_id', 'c', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'Distant collection ID in the databox, get all available collection if not defined') ->addOption('permalink', 'p', InputOption::VALUE_REQUIRED, 'the subdefinition name to retrieve permalink if exist, available only for type record and for all downloads type ""') + ->addOption('meta_struct_id', 'm', InputOption::VALUE_REQUIRED, 'the meta_struct_id of the field to do grouping, available only for type field') ->setHelp( "eg: bin/report downloads:all --databox_id 2 --email 'noreply@mydomaine.com' --dmin '2022-12-01' --dmax '2023-01-01' --type 'user' \n" @@ -27,6 +28,7 @@ public function __construct() . "- '' or not defined all downloads\n" . "- 'user' downloads by user\n" . "- 'record' downloads by record\n" + . "- 'field' downloads by field, need --meta_struct_id option\n" ); } @@ -38,6 +40,7 @@ protected function getReport(InputInterface $input, OutputInterface $output) $type = $input->getOption('type'); $collectionIds = $input->getOption('collection_id'); $permalink = $input->getOption('permalink'); + $metaStructId = $input->getOption('meta_struct_id'); if (!empty($type) && !in_array($type, self::TYPES)) { $output->writeln("wrong '--type' option (--help for available value)"); @@ -51,6 +54,12 @@ protected function getReport(InputInterface $input, OutputInterface $output) return 1; } + if ($type == 'field' && empty($metaStructId)) { + $output->writeln("you have to set option --meta_struct_id with type=field"); + + return 1; + } + $databox = $this->findDbOr404($this->sbasId); $collIds = []; @@ -66,14 +75,21 @@ protected function getReport(InputInterface $input, OutputInterface $output) } } + if (!$this->isFieldExist($databox, $metaStructId)) { + $output->writeln("there is no field find with this meta_struct_id!"); + + return 1; + } + return (new ReportActions( $databox, [ - 'dmin' => $this->dmin, - 'dmax' => $this->dmax, - 'group' => $type, - 'anonymize' => $this->container['conf']->get(['registry', 'modules', 'anonymous-report']) + 'dmin' => $this->dmin, + 'dmax' => $this->dmax, + 'group' => $type, + 'anonymize' => $this->container['conf']->get(['registry', 'modules', 'anonymous-report']), + 'meta_struct_id' => $metaStructId ] )) ->setAppKey($this->container['conf']->get(['main', 'key'])) @@ -82,4 +98,15 @@ protected function getReport(InputInterface $input, OutputInterface $output) ->setAsDownloadReport(true) ; } + + private function isFieldExist(\databox $databox, $metaStructId) + { + foreach($databox->get_meta_structure() as $field) { + if ($field->get_id() == $metaStructId) { + return true; + } + } + + return false; + } } diff --git a/lib/Alchemy/Phrasea/Report/ReportActions.php b/lib/Alchemy/Phrasea/Report/ReportActions.php index faeece0644..baaac741dc 100644 --- a/lib/Alchemy/Phrasea/Report/ReportActions.php +++ b/lib/Alchemy/Phrasea/Report/ReportActions.php @@ -233,6 +233,25 @@ private function computeVars() ; $this->keyName = 'record_id'; break; + case 'field': + $this->name = "Downloads by field"; + foreach($this->getDatabox()->get_meta_structure() as $field) { + if ($field->get_id() == $this->parms['meta_struct_id']) { + $this->columnTitles =[$field->get_name()]; + } + } + $this->columnTitles[] = 'nb'; + + $sql = "SELECT `m`.`value`, count(`ld`.`record_id`) as `nb`\n" + . " FROM `log_docs` AS `ld` INNER JOIN `log` AS `l` ON `l`.`id`=`ld`.`log_id`\n" + . " LEFT JOIN `metadatas` AS `m` ON (`ld`.`record_id`=`m`.`record_id` AND `m`.`meta_struct_id`=". $this->parms['meta_struct_id'] .") " + . " WHERE {{GlobalFilter}}\n" + . " GROUP BY `m`.`value`\n" + . " ORDER BY `nb` DESC" + ; + + $this->keyName = 'value'; + break; default: throw new InvalidArgumentException('invalid "group" argument'); break;