Skip to content

Commit c60ae65

Browse files
author
mmoser
committed
Mailchimp: improve cli sync processor + add delete not existing emails option
1 parent 9a34a77 commit c60ae65

File tree

2 files changed

+144
-32
lines changed

2 files changed

+144
-32
lines changed

src/Command/NewsletterSyncCommand.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ protected function configure()
4242
->addOption('force-segments', 's', null, 'force update of segments (otherwise only changed segments will be exported)')
4343
->addOption('force-customers', 'f', null, 'force update of customers (otherwise only changed customers will be exported)')
4444
->addOption('mailchimp-status-sync', 'm', null, 'mailchimp status sync (direction mailchimp => pimcore) for all mailchimp newsletter provider handlers')
45+
->addOption('delete-non-existing-items-in-mailchimp', null, null, 'delete email addresses in mailchimp which do not exist in the CMF database any more (only for maintenance purpose, should not be needed when the system is running regularly)')
4546
->addOption('process-queue-item', null, InputOption::VALUE_REQUIRED, 'process single queue item (provide json data of queue item)');
4647
}
4748

@@ -82,6 +83,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
8283
$this->mailchimpStatusSync();
8384
}
8485

86+
if($input->getOption('delete-non-existing-items-in-mailchimp')) {
87+
$this->deleteNonExistingItemsInMailchimp();
88+
}
89+
8590
if ($processQueueItem = $input->getOption('process-queue-item')) {
8691
$data = json_decode($processQueueItem, true);
8792

@@ -106,6 +111,16 @@ protected function mailchimpStatusSync()
106111
*/
107112
$cliSyncProcessor = \Pimcore::getContainer()->get(Mailchimp\CliSyncProcessor::class);
108113

109-
$cliSyncProcessor->process();
114+
$cliSyncProcessor->syncStatusChanges();
115+
}
116+
117+
protected function deleteNonExistingItemsInMailchimp()
118+
{
119+
/**
120+
* @var Mailchimp\CliSyncProcessor $cliSyncProcessor
121+
*/
122+
$cliSyncProcessor = \Pimcore::getContainer()->get(Mailchimp\CliSyncProcessor::class);
123+
124+
$cliSyncProcessor->deleteNonExistingItems();
110125
}
111126
}

src/Newsletter/ProviderHandler/Mailchimp/CliSyncProcessor.php

Lines changed: 128 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -70,58 +70,155 @@ public function __construct($pimcoreUserName = null, MailChimpExportService $exp
7070
$this->newsletterManager = $newsletterManager;
7171
}
7272

73-
public function process()
73+
public function syncStatusChanges()
7474
{
7575
$client = $this->exportService->getApiClient();
7676

7777
foreach ($this->newsletterManager->getNewsletterProviderHandlers() as $newsletterProviderHandler) {
7878
if ($newsletterProviderHandler instanceof Mailchimp) {
7979

8080
// get updates from the last 3 days
81-
$date = Carbon::createFromTimestamp(time() - (60 * 60 * 24 * 3));
81+
$date = Carbon::createFromTimestamp(time() - (60 * 60 * 24 * 300));
8282
$date = $date->toIso8601String();
8383

84-
$result = $client->get(
85-
$this->exportService->getListResourceUrl($newsletterProviderHandler->getListId(), 'members/?since_last_changed=' . urlencode($date))
86-
);
87-
88-
if ($client->success() && sizeof($result['members'])) {
89-
foreach ($result['members'] as $row) {
84+
$count = 20;
85+
$page = 0;
86+
while(true) {
87+
$result = $client->get(
88+
$this->exportService->getListResourceUrl(
89+
$newsletterProviderHandler->getListId(),
90+
'members/?since_last_changed='.urlencode($date) . '&count=' . $count . '&offset=' . ($page * $count)
91+
)
92+
);
93+
94+
if ($client->success() && sizeof($result['members'])) {
95+
foreach ($result['members'] as $row) {
96+
97+
// var_dump($row);
98+
/**
99+
* @var MailchimpAwareCustomerInterface $customer
100+
*/
101+
try {
102+
if (!$customer = $this->customerProvider->getActiveCustomerByEmail(
103+
$row['email_address']
104+
)) {
105+
$this->getLogger()->error(
106+
sprintf('no active customer with email %s found', $row['email_address'])
107+
);
108+
}
109+
} catch (\Exception $e) {
110+
$this->getLogger()->error(
111+
sprintf('multiple active customers with email %s found', $row['email_address'])
112+
);
113+
}
90114

91-
// var_dump($row);
92-
/**
93-
* @var MailchimpAwareCustomerInterface $customer
94-
*/
95-
try {
96-
if (!$customer = $this->customerProvider->getActiveCustomerByEmail($row['email_address'])) {
97-
$this->getLogger()->error(sprintf('no active customer with email %s found', $row['email_address']));
115+
if (!$customer) {
116+
continue;
98117
}
99-
} catch (\RuntimeException $e) {
100-
if (!$customer = $this->customerProvider->getActiveCustomerByEmail($row['email_address'])) {
101-
$this->getLogger()->error(sprintf('multiple active customers with email %s found', $row['email_address']));
118+
119+
$status = $row['status'];
120+
121+
$statusChanged = $this->updateFromMailchimpProcessor->updateNewsletterStatus(
122+
$newsletterProviderHandler,
123+
$customer,
124+
$status
125+
);
126+
$mergeFieldsChanged = $this->updateFromMailchimpProcessor->processMergeFields(
127+
$newsletterProviderHandler,
128+
$customer,
129+
$row['merge_fields']
130+
);
131+
132+
$changed = $statusChanged || $mergeFieldsChanged;
133+
134+
if ($changed) {
135+
$this->getLogger()->info(
136+
sprintf('customer id %s changed - updating...', $customer->getId())
137+
);
138+
} else {
139+
$this->getLogger()->info(
140+
sprintf('customer id %s did not change - no update needed.', $customer->getId())
141+
);
102142
}
103-
}
104143

105-
if (!$customer) {
106-
continue;
144+
$this->updateFromMailchimpProcessor->saveCustomerIfChanged($customer, $changed);
107145
}
108146

109-
$status = $row['status'];
147+
$page++;
148+
} else {
149+
break;
150+
}
151+
}
152+
}
153+
}
154+
}
110155

111-
$statusChanged = $this->updateFromMailchimpProcessor->updateNewsletterStatus($newsletterProviderHandler, $customer, $status);
112-
$mergeFieldsChanged = $this->updateFromMailchimpProcessor->processMergeFields($newsletterProviderHandler, $customer, $row['merge_fields']);
156+
public function deleteNonExistingItems()
157+
{
158+
$client = $this->exportService->getApiClient();
113159

114-
$changed = $statusChanged || $mergeFieldsChanged;
160+
foreach ($this->newsletterManager->getNewsletterProviderHandlers() as $newsletterProviderHandler) {
161+
if ($newsletterProviderHandler instanceof Mailchimp) {
115162

116-
if ($changed) {
117-
$this->getLogger()->info(sprintf('customer id %s changed - updating...', $customer->getId()));
118-
} else {
119-
$this->getLogger()->info(sprintf('customer id %s did not change - no update needed.', $customer->getId()));
120-
}
163+
$count = 20;
164+
$page = 0;
165+
while(true) {
166+
$result = $client->get(
167+
$this->exportService->getListResourceUrl($newsletterProviderHandler->getListId(), 'members/?count=' . $count . '&offset=' . ($page * $count) )
168+
);
169+
170+
if ($client->success() && sizeof($result['members'])) {
171+
foreach ($result['members'] as $row) {
172+
173+
$list = $this->customerProvider->getList();
174+
$list->setCondition('email = ?', $row['email_address']);
121175

122-
$this->updateFromMailchimpProcessor->saveCustomerIfChanged($customer, $changed);
176+
$this->getLogger()->info(sprintf('check email %s', $row['email_address']));
177+
if ($list->count()) {
178+
continue;
179+
}
180+
181+
$remoteId = $client->subscriberHash($row['email_address']);
182+
183+
$this->getLogger()->notice(
184+
sprintf(
185+
'[MailChimp][CUSTOMER %s][%s] Delete email in mailchimp. Remote ID is %s',
186+
$row['email_address'],
187+
$newsletterProviderHandler->getShortcut(),
188+
$remoteId
189+
)
190+
);
191+
192+
$client->delete(
193+
$this->exportService->getListResourceUrl($newsletterProviderHandler->getListId(), sprintf('members/%s', $remoteId))
194+
);
195+
196+
if ($client->success()) {
197+
$this->getLogger()->notice(
198+
sprintf(
199+
'[MailChimp][CUSTOMER %s][%s] Deletion was successful. Remote ID is %s',
200+
$row['email_address'],
201+
$newsletterProviderHandler->getShortcut(),
202+
$remoteId
203+
)
204+
);
205+
} else {
206+
$this->getLogger()->error(
207+
sprintf(
208+
'[MailChimp][CUSTOMER %s][%s] Deletion failed. Remote ID is %s',
209+
$row['email_address'],
210+
$newsletterProviderHandler->getShortcut(),
211+
$remoteId
212+
)
213+
);
214+
}
215+
}
216+
$page++;
217+
} else {
218+
break;
123219
}
124220
}
221+
125222
}
126223
}
127224
}

0 commit comments

Comments
 (0)