Add possibility set status for new or existing users in import
Fixes:#2968 [MAILPOET-2957]
This commit is contained in:
@ -46,6 +46,8 @@ function StepDataManipulation({
|
|||||||
doImport(
|
doImport(
|
||||||
stepMethodSelectionData.subscribers,
|
stepMethodSelectionData.subscribers,
|
||||||
selectedSegments,
|
selectedSegments,
|
||||||
|
newSubscribersStatus,
|
||||||
|
existingSubscribersStatus,
|
||||||
updateExistingSubscribers,
|
updateExistingSubscribers,
|
||||||
(importResults) => {
|
(importResults) => {
|
||||||
setStepDataManipulationData(importResults);
|
setStepDataManipulationData(importResults);
|
||||||
|
@ -3,7 +3,14 @@ import _ from 'underscore';
|
|||||||
import MailPoet from 'mailpoet';
|
import MailPoet from 'mailpoet';
|
||||||
import 'asyncqueue';
|
import 'asyncqueue';
|
||||||
|
|
||||||
export default (subscribersToImport, segments, updateExistingSubscribers, onImportComplete) => {
|
export default (
|
||||||
|
subscribersToImport,
|
||||||
|
segments,
|
||||||
|
newSubscribersStatus,
|
||||||
|
existingSubscribersStatus,
|
||||||
|
updateExistingSubscribers,
|
||||||
|
onImportComplete
|
||||||
|
) => {
|
||||||
const columns = {};
|
const columns = {};
|
||||||
const queue = new jQuery.AsyncQueue();
|
const queue = new jQuery.AsyncQueue();
|
||||||
let batchNumber = 0;
|
let batchNumber = 0;
|
||||||
@ -52,6 +59,8 @@ export default (subscribersToImport, segments, updateExistingSubscribers, onImpo
|
|||||||
subscribers: clickSubscribers[batchNumber],
|
subscribers: clickSubscribers[batchNumber],
|
||||||
timestamp,
|
timestamp,
|
||||||
segments,
|
segments,
|
||||||
|
newSubscribersStatus,
|
||||||
|
existingSubscribersStatus,
|
||||||
updateSubscribers: updateExistingSubscribers,
|
updateSubscribers: updateExistingSubscribers,
|
||||||
}),
|
}),
|
||||||
}).done((response) => {
|
}).done((response) => {
|
||||||
|
@ -682,7 +682,6 @@ class Subscriber extends Model {
|
|||||||
'is_woocommerce_user',
|
'is_woocommerce_user',
|
||||||
'email',
|
'email',
|
||||||
'created_at',
|
'created_at',
|
||||||
'status',
|
|
||||||
'last_subscribed_at',
|
'last_subscribed_at',
|
||||||
];
|
];
|
||||||
// check if there is anything to update after excluding ignored columns
|
// check if there is anything to update after excluding ignored columns
|
||||||
|
@ -19,6 +19,8 @@ use function MailPoetVendor\array_column;
|
|||||||
class Import {
|
class Import {
|
||||||
public $subscribersData;
|
public $subscribersData;
|
||||||
public $segmentsIds;
|
public $segmentsIds;
|
||||||
|
public $newSubscribersStatus;
|
||||||
|
public $existingSubscribersStatus;
|
||||||
public $updateSubscribers;
|
public $updateSubscribers;
|
||||||
public $subscribersFields;
|
public $subscribersFields;
|
||||||
public $subscribersCustomFields;
|
public $subscribersCustomFields;
|
||||||
@ -27,6 +29,7 @@ class Import {
|
|||||||
public $updatedAt;
|
public $updatedAt;
|
||||||
public $requiredSubscribersFields;
|
public $requiredSubscribersFields;
|
||||||
const DB_QUERY_CHUNK_SIZE = 100;
|
const DB_QUERY_CHUNK_SIZE = 100;
|
||||||
|
const STATUS_DONT_UPDATE = 'dont_update';
|
||||||
|
|
||||||
public function __construct($data) {
|
public function __construct($data) {
|
||||||
$this->validateImportData($data);
|
$this->validateImportData($data);
|
||||||
@ -35,6 +38,8 @@ class Import {
|
|||||||
$data['columns']
|
$data['columns']
|
||||||
);
|
);
|
||||||
$this->segmentsIds = $data['segments'];
|
$this->segmentsIds = $data['segments'];
|
||||||
|
$this->newSubscribersStatus = $data['newSubscribersStatus'];
|
||||||
|
$this->existingSubscribersStatus = $data['existingSubscribersStatus'];
|
||||||
$this->updateSubscribers = $data['updateSubscribers'];
|
$this->updateSubscribers = $data['updateSubscribers'];
|
||||||
$this->subscribersFields = $this->getSubscribersFields(
|
$this->subscribersFields = $this->getSubscribersFields(
|
||||||
array_keys($data['columns'])
|
array_keys($data['columns'])
|
||||||
@ -59,6 +64,8 @@ class Import {
|
|||||||
'columns',
|
'columns',
|
||||||
'segments',
|
'segments',
|
||||||
'timestamp',
|
'timestamp',
|
||||||
|
'newSubscribersStatus',
|
||||||
|
'existingSubscribersStatus',
|
||||||
'updateSubscribers',
|
'updateSubscribers',
|
||||||
];
|
];
|
||||||
// 1. data should contain all required fields
|
// 1. data should contain all required fields
|
||||||
@ -94,7 +101,7 @@ class Import {
|
|||||||
if ($newSubscribers['data']) {
|
if ($newSubscribers['data']) {
|
||||||
// add, if required, missing required fields to new subscribers
|
// add, if required, missing required fields to new subscribers
|
||||||
$newSubscribers = $this->addMissingRequiredFields($newSubscribers);
|
$newSubscribers = $this->addMissingRequiredFields($newSubscribers);
|
||||||
$newSubscribers = $this->setSubscriptionStatusToSubscribed($newSubscribers);
|
$newSubscribers = $this->setSubscriptionStatusToDefault($newSubscribers, $this->newSubscribersStatus);
|
||||||
$newSubscribers = $this->setSource($newSubscribers);
|
$newSubscribers = $this->setSource($newSubscribers);
|
||||||
$newSubscribers = $this->setLinkToken($newSubscribers);
|
$newSubscribers = $this->setLinkToken($newSubscribers);
|
||||||
$createdSubscribers =
|
$createdSubscribers =
|
||||||
@ -105,6 +112,14 @@ class Import {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($existingSubscribers['data'] && $this->updateSubscribers) {
|
if ($existingSubscribers['data'] && $this->updateSubscribers) {
|
||||||
|
$allowedStatuses = [
|
||||||
|
Subscriber::STATUS_SUBSCRIBED,
|
||||||
|
Subscriber::STATUS_UNSUBSCRIBED,
|
||||||
|
Subscriber::STATUS_INACTIVE,
|
||||||
|
];
|
||||||
|
if (in_array($this->existingSubscribersStatus, $allowedStatuses, true)) {
|
||||||
|
$existingSubscribers = $this->addField($existingSubscribers, 'status', $this->existingSubscribersStatus);
|
||||||
|
}
|
||||||
$updatedSubscribers =
|
$updatedSubscribers =
|
||||||
$this->createOrUpdateSubscribers(
|
$this->createOrUpdateSubscribers(
|
||||||
'update',
|
'update',
|
||||||
@ -258,31 +273,41 @@ class Import {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function addMissingRequiredFields($subscribers) {
|
public function addMissingRequiredFields($subscribers) {
|
||||||
$subscribersCount = count($subscribers['data'][key($subscribers['data'])]);
|
|
||||||
foreach (array_keys($this->requiredSubscribersFields) as $requiredField) {
|
foreach (array_keys($this->requiredSubscribersFields) as $requiredField) {
|
||||||
if (in_array($requiredField, $subscribers['fields'])) continue;
|
$subscribers = $this->addField($subscribers, $requiredField, $this->requiredSubscribersFields[$requiredField]);
|
||||||
$subscribers['data'][$requiredField] = array_fill(
|
|
||||||
0,
|
|
||||||
$subscribersCount,
|
|
||||||
$this->requiredSubscribersFields[$requiredField]
|
|
||||||
);
|
|
||||||
$subscribers['fields'][] = $requiredField;
|
|
||||||
}
|
}
|
||||||
return $subscribers;
|
return $subscribers;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function setSubscriptionStatusToSubscribed($subscribersData) {
|
private function addField($subscribers, $fieldName, $fieldValue) {
|
||||||
|
if (in_array($fieldName, $subscribers['fields'])) return $subscribers;
|
||||||
|
|
||||||
|
$subscribersCount = count($subscribers['data'][key($subscribers['data'])]);
|
||||||
|
$subscribers['data'][$fieldName] = array_fill(
|
||||||
|
0,
|
||||||
|
$subscribersCount,
|
||||||
|
$fieldValue
|
||||||
|
|
||||||
|
);
|
||||||
|
$subscribers['fields'][] = $fieldName;
|
||||||
|
|
||||||
|
return $subscribers;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setSubscriptionStatusToDefault($subscribersData, $defaultStatus) {
|
||||||
if (!in_array('status', $subscribersData['fields'])) return $subscribersData;
|
if (!in_array('status', $subscribersData['fields'])) return $subscribersData;
|
||||||
$subscribersData['data']['status'] = array_map(function() {
|
$subscribersData['data']['status'] = array_map(function() use ($defaultStatus) {
|
||||||
return Subscriber::STATUS_SUBSCRIBED;
|
return $defaultStatus;
|
||||||
}, $subscribersData['data']['status']);
|
}, $subscribersData['data']['status']);
|
||||||
|
|
||||||
|
if ($defaultStatus === Subscriber::STATUS_SUBSCRIBED) {
|
||||||
if (!in_array('last_subscribed_at', $subscribersData['fields'])) {
|
if (!in_array('last_subscribed_at', $subscribersData['fields'])) {
|
||||||
$subscribersData['fields'][] = 'last_subscribed_at';
|
$subscribersData['fields'][] = 'last_subscribed_at';
|
||||||
}
|
}
|
||||||
$subscribersData['data']['last_subscribed_at'] = array_map(function() {
|
$subscribersData['data']['last_subscribed_at'] = array_map(function() {
|
||||||
return $this->createdAt;
|
return $this->createdAt;
|
||||||
}, $subscribersData['data']['status']);
|
}, $subscribersData['data']['status']);
|
||||||
|
}
|
||||||
return $subscribersData;
|
return $subscribersData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user