->select("$contact.id as contact_id, $entityTable.id as $entityColumn")
->join($entityTable, " INNER JOIN $entityTable ON $entityTable.contact_id = $contact.id ")
->join('gc', " INNER JOIN civicrm_group_contact_cache gc ON $contact.id = gc.contact_id ")
+ ->join('gcr', " LEFT JOIN civicrm_group_contact gcr ON gc.group_id = gcr.group_id AND gc.contact_id = gcr.contact_id")
->join('mg', " INNER JOIN civicrm_mailing_group mg ON gc.group_id = mg.entity_id AND mg.search_id IS NULL ")
->join('temp', " LEFT JOIN $excludeTempTablename temp ON $contact.id = temp.contact_id ")
->where('gc.group_id IN (#groups)')
+ ->where('gcr.status IS NULL OR gcr.status != "Removed"')
->merge($criteria)
->replaceInto($includedTempTablename, array('contact_id', $entityColumn))
->param('#groups', $includeSmartGroupIDs)
unset($expected[0], $expected[4], $expected[8]);
$this->assertRecipientsCorrect($mailing['id'], $expected);
+ // Tear down: delete mailing, groups, contacts
+ $this->deleteMailing($mailing['id']);
+
+ // Create a New mailing, Testing contacts removed from smart group.
+ // In this case groupIDs6 will only pick up contacts[0] amd contacts[8] with it's
+ // criteria. However we are deliberly going to remove contactIds[8] from the group
+ // Which should mean the mainling only finds 1 contact that is contactIds[0]
+ $mailing = $this->callAPISuccess('Mailing', 'create', array());
+ $this->callAPISuccess('GroupContact', 'Create', array(
+ 'group_id' => $groupIDs[6],
+ 'contact_id' => $contactIDs[8],
+ 'status' => 'Removed',
+ ));
+ $this->createMailingGroup($mailing['id'], $groupIDs[6]);
+ $this->assertRecipientsCorrect($mailing['id'], [$contactIDs[0]]);
// Tear down: delete mailing, groups, contacts
$this->deleteMailing($mailing['id']);
foreach ($groupIDs as $groupID) {