From 531cd6a42c9e667980576ccc6bd46103e08f7d6c Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Mon, 10 Feb 2025 20:00:21 +0200 Subject: [PATCH] AttributeCollector verify email step --- .../Model/Table/AttributeCollectorsTable.php | 73 ++++++++++++++++++- .../src/Model/Table/EmailVerifiersTable.php | 11 +-- .../element/petition/emailVerifiersStep.php | 2 +- .../petition/invitationAcceptersStep.php | 27 ++++--- 4 files changed, 95 insertions(+), 18 deletions(-) diff --git a/app/plugins/CoreEnroller/src/Model/Table/AttributeCollectorsTable.php b/app/plugins/CoreEnroller/src/Model/Table/AttributeCollectorsTable.php index 03ecee815..5b55f4b2e 100644 --- a/app/plugins/CoreEnroller/src/Model/Table/AttributeCollectorsTable.php +++ b/app/plugins/CoreEnroller/src/Model/Table/AttributeCollectorsTable.php @@ -29,14 +29,15 @@ namespace CoreEnroller\Model\Table; +use App\Lib\Enum\PetitionActionEnum; +use App\Lib\Enum\StatusEnum; use App\Model\Entity\Petition; -use Cake\Datasource\ConnectionManager; +use Cake\Database\Expression\QueryExpression; +use Cake\Datasource\EntityInterface; use Cake\ORM\Query; -use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\ORM\TableRegistry; use Cake\Validation\Validator; -use App\Lib\Enum\PetitionActionEnum; class AttributeCollectorsTable extends Table { use \App\Lib\Traits\AutoViewVarsTrait; @@ -143,6 +144,28 @@ public function finalize(int $id, \App\Model\Entity\Petition $petition) { ->firstOrFail(); // XXX Should i save the primary name? + // Since we're not modifying $person, it's a bit clearer if we save each entity + // individually than try to save related + + $Names = TableRegistry::getTableLocator()->get('Names'); + + // Get the Primary Name + $primaryName = $Names->primaryName($person->id); + + // XXX enforce CoSettings required/permitted fields here? + $name = [ + 'person_id' => $person->id, + 'primary_name' => true, + 'type_id' => $cfg->name_type_id + ]; + + foreach(['honorific', 'given', 'middle', 'family', 'suffix'] as $n) { + if(!empty($attributes->$n)) { + $name[$n] = $attributes->$n; + } + } + + $Names->saveOrFail($Names->newEntity($name)); // XXX Should i save the email? return true; @@ -267,4 +290,48 @@ public function validationDefault(Validator $validator): Validator { return $validator; } + + /** + * Obtain the set of Email Addresses known to this plugin that are eligible for + * verification. + * + * @since COmanage Registry v5.1.0 + * @param EntityInterface $config Configuration entity for this plugin + * @param int $petitionId Petition ID + * @return array Array of Email Addrsses that are eligible for verification + */ + + public function verifiableEmailAddresses( + EntityInterface $config, + int $petitionId + ): array { + // First get the Enrollment Attributes for this petition + $vv_enrollment_attributes = $this->EnrollmentAttributes->find('list', + [ + 'keyField' => 'id', + 'valueField' => 'attribute_type' + ])->where([ + 'attribute_collector_id' => $config->id, + 'attribute' => 'emailAddress', + 'status' => StatusEnum::Active, + ]) + ->order(['ordr' => 'ASC']) + ->toArray(); + + if (empty($vv_enrollment_attributes)) { + return []; + } + + $set = $this->EnrollmentAttributes + ->PetitionAttributes + ->find('list', + [ + 'keyField' => 'id', + 'valueField' => 'value' + ])->where(['petition_id' => $petitionId]) + ->where(fn(QueryExpression $exp, Query $q) => $exp->in('enrollment_attribute_id', array_keys($vv_enrollment_attributes))) + ->toArray(); + + return !empty($set) ? $set : []; + } } diff --git a/app/plugins/CoreEnroller/src/Model/Table/EmailVerifiersTable.php b/app/plugins/CoreEnroller/src/Model/Table/EmailVerifiersTable.php index 4a409cd82..f08d24f8a 100644 --- a/app/plugins/CoreEnroller/src/Model/Table/EmailVerifiersTable.php +++ b/app/plugins/CoreEnroller/src/Model/Table/EmailVerifiersTable.php @@ -29,17 +29,18 @@ namespace CoreEnroller\Model\Table; +use App\Lib\Enum\EnrollmentActorEnum; +use App\Lib\Enum\PetitionStatusEnum; +use App\Lib\Enum\SuspendableStatusEnum; +use App\Lib\Util\StringUtilities; +use App\Model\Entity\Petition; use Cake\Datasource\ConnectionManager; +use Cake\Datasource\EntityInterface; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\ORM\TableRegistry; use Cake\Validation\Validator; -use App\Lib\Enum\EnrollmentActorEnum; -use App\Lib\Enum\PetitionStatusEnum; -use App\Lib\Enum\SuspendableStatusEnum; -use App\Lib\Util\StringUtilities; -use App\Model\Entity\Petition; use CoreEnroller\Lib\Enum\VerificationModeEnum; use CoreEnroller\Model\Entity\EmailVerifier; diff --git a/app/plugins/CoreEnroller/templates/element/petition/emailVerifiersStep.php b/app/plugins/CoreEnroller/templates/element/petition/emailVerifiersStep.php index 8e1aec591..33b48278b 100644 --- a/app/plugins/CoreEnroller/templates/element/petition/emailVerifiersStep.php +++ b/app/plugins/CoreEnroller/templates/element/petition/emailVerifiersStep.php @@ -24,7 +24,7 @@ $this->Time->nice($pv->verification->verification_time, $vv_tz) ]) ?> - ?> + diff --git a/app/plugins/CoreEnroller/templates/element/petition/invitationAcceptersStep.php b/app/plugins/CoreEnroller/templates/element/petition/invitationAcceptersStep.php index 08ca25823..b3ba8f668 100644 --- a/app/plugins/CoreEnroller/templates/element/petition/invitationAcceptersStep.php +++ b/app/plugins/CoreEnroller/templates/element/petition/invitationAcceptersStep.php @@ -3,12 +3,21 @@ $vv_pa = $PetitionAcceptances->find()->where(['petition_id' => $vv_obj->id])->first(); -if(!empty($vv_pa)) { - if($vv_pa['accepted']) { - print __d('core_enroller', 'result.InvitationAccepters.accepted', [$vv_pa['modified']]); - } else { - print __d('core_enroller', 'result.InvitationAccepters.declined', [$vv_pa['modified']]); - } -} else { - print __d('core_enroller', 'result.InvitationAccepters.none'); -} +?> + + +