✨ include email_id in group membership
This commit is contained in:
parent
8dab2377f5
commit
5a424771fd
5 changed files with 86 additions and 13 deletions
|
@ -340,8 +340,7 @@ class ADGroupMailingList extends GroupMailingList {
|
|||
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
||||
*/
|
||||
public
|
||||
static function syncContacts($recipients
|
||||
): array {
|
||||
static function syncContacts($recipients): array {
|
||||
$results = [];
|
||||
|
||||
foreach ($recipients as $contact) {
|
||||
|
@ -471,12 +470,13 @@ class ADGroupMailingList extends GroupMailingList {
|
|||
* @return array|array[]
|
||||
*/
|
||||
private
|
||||
function addRecipient(int $contactId
|
||||
): array {
|
||||
function addRecipient(int $contactId): array {
|
||||
$result = [];
|
||||
// Add the contact to the group
|
||||
try {
|
||||
$this->addContactToGroup($contactId);
|
||||
$contactEmail = MailingListRecipient::getContactById($contactId)
|
||||
->getEmailId(self::LOCATION_TYPE);
|
||||
$this->addContactToGroup($contactId, $contactEmail);
|
||||
$result['added'] = TRUE;
|
||||
}
|
||||
catch (MailinglistException $e) {
|
||||
|
@ -496,8 +496,7 @@ class ADGroupMailingList extends GroupMailingList {
|
|||
* @return array
|
||||
*/
|
||||
public
|
||||
function removeRecipient(MailingListRecipient $recipient
|
||||
): array {
|
||||
function removeRecipient(MailingListRecipient $recipient): array {
|
||||
$result = [
|
||||
'sid' => $recipient->getSid(),
|
||||
'contact_id' => $recipient->getContactId(),
|
||||
|
|
|
@ -41,5 +41,6 @@ class MailinglistException extends BaseException {
|
|||
public const ERROR_CODE_UPDATE_MAILING_LIST_FAILED = 'update_mailing_list_failed';
|
||||
public const ERROR_CODE_UPDATE_SUBSCRIBERS_FAILED = 'update_subscribers_failed';
|
||||
public const ERROR_CODE_DELETE_MAILING_LIST_FAILED = 'delete_mailing_list_failed';
|
||||
public const ERROR_CODE_GET_EMAIL_ID_FAILED = 'get_email_id_failed';
|
||||
}
|
||||
|
||||
|
|
|
@ -172,16 +172,20 @@ class GroupMailingList extends BaseMailingList {
|
|||
* Add a contact to this mailing lists related group.
|
||||
*
|
||||
* @param int $contactId
|
||||
* @param ?int $contactEmailId
|
||||
*
|
||||
* @return void
|
||||
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
||||
*/
|
||||
protected function addContactToGroup(int $contactId): void {
|
||||
protected function addContactToGroup(int $contactId, int $contactEmailId = NULL): void {
|
||||
try {
|
||||
\Civi\Api4\GroupContact::create()
|
||||
$query = \Civi\Api4\GroupContact::create()
|
||||
->addValue('contact_id', $contactId)
|
||||
->addValue('group_id', $this->group['id'])
|
||||
->execute();
|
||||
->addValue('group_id', $this->group['id']);
|
||||
if ($contactEmailId) {
|
||||
$query->addValue('email_id', $contactEmailId);
|
||||
}
|
||||
$query->execute();
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
if ($e->getMessage() === 'DB Error: already exists') {
|
||||
|
|
|
@ -128,7 +128,7 @@ class MailingListRecipient {
|
|||
* @return MailingListRecipient
|
||||
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
||||
*/
|
||||
public static function getContactIdEmail(string $email): MailingListRecipient {
|
||||
public static function getContactByEmail(string $email): MailingListRecipient {
|
||||
try {
|
||||
$recipientData = Contact::get()
|
||||
->addSelect('id', 'first_name', 'last_name', 'email.email', 'Active_Directory.SID')
|
||||
|
@ -163,6 +163,49 @@ class MailingListRecipient {
|
|||
return $recipient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a recipient by its id.
|
||||
*
|
||||
* @param int $id
|
||||
*
|
||||
* @return MailingListRecipient
|
||||
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
||||
*/
|
||||
public static function getContactById(int $id): MailingListRecipient {
|
||||
try {
|
||||
$recipientData = Contact::get()
|
||||
->addSelect('id', 'first_name', 'last_name', 'email.email', 'Active_Directory.SID')
|
||||
->addJoin('Email AS email', 'LEFT', ['id', '=', 'email.contact_id'])
|
||||
->addWhere('id', '=', $id)
|
||||
->addGroupBy('id')
|
||||
->execute()
|
||||
->first();
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
throw new MailinglistException(
|
||||
"Could not get recipient by id '{$id}': {$e->getMessage()}",
|
||||
MailinglistException::ERROR_CODE_GET_RECIPIENTS_FAILED
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
$recipient = new MailingListRecipient(
|
||||
sid: $recipientData['Active_Directory.SID'],
|
||||
contact_id: $recipientData['id'],
|
||||
first_name: $recipientData['first_name'],
|
||||
last_name: $recipientData['last_name'],
|
||||
email: $recipientData['email.email'],
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
throw new MailinglistException(
|
||||
"Could not create recipient object for contact with id '{$recipientData['id']}': {$e->getMessage()}",
|
||||
MailinglistException::ERROR_CODE_GET_RECIPIENTS_FAILED
|
||||
);
|
||||
}
|
||||
|
||||
return $recipient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of group mailing lists the contact is subscribed to.
|
||||
*
|
||||
|
@ -307,6 +350,32 @@ class MailingListRecipient {
|
|||
return $this->email;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the email id.
|
||||
*
|
||||
* @param string $locationType
|
||||
*
|
||||
* @return int|NULL
|
||||
* @throws \Civi\Mailinglistsync\Exceptions\MailinglistException
|
||||
*/
|
||||
public function getEmailId(string $locationType): ?int {
|
||||
try {
|
||||
return \Civi\Api4\Email::get()
|
||||
->addSelect('id')
|
||||
->addWhere('contact_id', '=', $this->getContactId())
|
||||
->addWhere('email', '=', $this->email)
|
||||
->addWhere('location_type_id:name', '=', $locationType)
|
||||
->execute()
|
||||
->first()['id'] ?? NULL;
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
throw new MailinglistException(
|
||||
"Failed to get email id: {$e->getMessage()}",
|
||||
MailinglistException::ERROR_CODE_GET_EMAIL_ID_FAILED,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the SID of the contact.
|
||||
*
|
||||
|
|
|
@ -110,7 +110,7 @@ function civicrm_api3_mailinglistsync_Mlmmjsync($params) {
|
|||
$mailingListsToSync[$event->getId()] = $event;
|
||||
}
|
||||
foreach ($emails as $email) {
|
||||
$recipient = MailingListRecipient::getContactIdEmail($email);
|
||||
$recipient = MailingListRecipient::getContactByEmail($email);
|
||||
$emailGroups = $recipient->getMailingLists();
|
||||
$emailEvents = $recipient->getEventMailingLists();
|
||||
foreach ($emailGroups as $group) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue