WIP: Logic for company replacement via component (which was surprisingly easy to implement)
This commit is contained in:
parent
c25c26b9da
commit
388df3c56f
5 changed files with 46 additions and 278 deletions
|
@ -77,6 +77,7 @@
|
|||
<field id="shipment_date" group="order">shipmentDate</field>
|
||||
<field id="shipped" group="order">shipped</field>
|
||||
<field id="contact" group="order">contact</field>
|
||||
<field id="company" group="order">company</field>
|
||||
<!--<field id="order_product" group="order">item</field>-->
|
||||
<field id="payment" group="order">payment</field>
|
||||
<field id="payments.amount" group="order">amount</field>
|
||||
|
|
|
@ -156,7 +156,11 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) :
|
|||
$lastChange = end($history);
|
||||
$customers = WC_Retailcrm_History_Assembler::assemblyCustomer($history);
|
||||
WC_Retailcrm_Plugin::$history_run = true;
|
||||
<<<<<<< HEAD
|
||||
>>>>>>> WIP: Change client in the order (not ready at this point; also tests should fail)
|
||||
=======
|
||||
WC_Retailcrm_Logger::debug(__METHOD__, 'Assembled customers history:', $customers);
|
||||
>>>>>>> WIP: Logic for company replacement via component (which was surprisingly easy to implement)
|
||||
|
||||
foreach ($customers as $crmCustomer) {
|
||||
if (!isset($crmCustomer['externalId'])) {
|
||||
|
@ -240,7 +244,7 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) :
|
|||
if (!empty($history)) {
|
||||
$last_change = end($history);
|
||||
$historyAssembly = WC_Retailcrm_History_Assembler::assemblyOrder($history);
|
||||
|
||||
WC_Retailcrm_Logger::debug(__METHOD__, 'Assembled orders history:', $historyAssembly);
|
||||
WC_Retailcrm_Plugin::$history_run = true;
|
||||
|
||||
foreach ($historyAssembly as $orderHistory) {
|
||||
|
@ -394,6 +398,7 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) :
|
|||
$wc_order->set_shipping_last_name($order['lastName']);
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
if (isset($order['phone'])) {
|
||||
$wc_order->set_billing_phone($order['phone']);
|
||||
|
@ -405,6 +410,10 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) :
|
|||
|
||||
=======
|
||||
>>>>>>> fixes & more fields for sync
|
||||
=======
|
||||
|
||||
|
||||
>>>>>>> WIP: Logic for company replacement via component (which was surprisingly easy to implement)
|
||||
if (array_key_exists('items', $order)) {
|
||||
foreach ($order['items'] as $key => $item) {
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ class WC_Retailcrm_Customer_Switcher implements WC_Retailcrm_Builder_Interface
|
|||
|
||||
/**
|
||||
* In fact, this will execute customer change in provided order.
|
||||
* This will not build anything.
|
||||
* This will not produce any new entities.
|
||||
*
|
||||
* @return $this|\WC_Retailcrm_Builder_Interface
|
||||
* @throws \WC_Data_Exception
|
||||
|
@ -38,9 +38,8 @@ class WC_Retailcrm_Customer_Switcher implements WC_Retailcrm_Builder_Interface
|
|||
|
||||
$wcOrder = $this->data->getWcOrder();
|
||||
$newCustomer = $this->data->getNewCustomer();
|
||||
$newCorporateCustomer = $this->data->getNewCorporateCustomer();
|
||||
$newContact = $this->data->getNewContact();
|
||||
$newCompany = $this->data->getNewCompany();
|
||||
$newCompany = $this->data->getNewCompanyName();
|
||||
|
||||
if (!empty($newCustomer)) {
|
||||
$this->processChangeToRegular($wcOrder, $newCustomer);
|
||||
|
@ -52,7 +51,7 @@ class WC_Retailcrm_Customer_Switcher implements WC_Retailcrm_Builder_Interface
|
|||
}
|
||||
|
||||
if (!empty($newCompany)) {
|
||||
$this->updateCompany($wcOrder, $newCorporateCustomer, $newCompany);
|
||||
$this->updateCompany($wcOrder, $newCompany);
|
||||
}
|
||||
|
||||
return $this;
|
||||
|
@ -76,6 +75,21 @@ class WC_Retailcrm_Customer_Switcher implements WC_Retailcrm_Builder_Interface
|
|||
if (!empty($wcCustomer)) {
|
||||
$wcOrder->set_customer_id($wcCustomer->get_id());
|
||||
}
|
||||
} else {
|
||||
//TODO:
|
||||
// 1. Too risky! Consider using default WooCommerce object.
|
||||
// 2. Will it work as expected with such property name? Check that.
|
||||
// 3. It will remove user from order directly, WC_Order logic is completely skipped here.
|
||||
// It can cause these problems:
|
||||
// 1) Order is changed and it's state in WC_Order is inconsistent, which can lead to problems
|
||||
// and data inconsistency while saving. For example, order saving can overwrite `_customer_user`
|
||||
// meta, which will revert this operation and we'll end up with a broken data (order is still
|
||||
// attached to an old customer). Whichever, this last statement should be checked.
|
||||
// 2) The second problem is a lifecycle in general. We're using builder interface, and code inside
|
||||
// doesn't do anything which is not expected from builder. For example, besides this line, there's no
|
||||
// CRUD operations. Such operation will not be expected here, so, it's better to remove it from here.
|
||||
// The best solution would be to use WC_Order, and not modify it's data directly.
|
||||
delete_post_meta($wcOrder->get_id(), '_customer_user');
|
||||
}
|
||||
|
||||
$fields = array(
|
||||
|
@ -96,12 +110,13 @@ class WC_Retailcrm_Customer_Switcher implements WC_Retailcrm_Builder_Interface
|
|||
* Update company in the order
|
||||
*
|
||||
* @param WC_Order $wcOrder
|
||||
* @param array $corporateCustomer
|
||||
* @param array $company
|
||||
* @param string $company
|
||||
*
|
||||
* @throws \WC_Data_Exception
|
||||
*/
|
||||
public function updateCompany($wcOrder, $corporateCustomer, $company)
|
||||
public function updateCompany($wcOrder, $company)
|
||||
{
|
||||
// TODO: Implement
|
||||
$wcOrder->set_billing_company($company);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,249 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Class WC_Retailcrm_WC_Customer_Corporate_Builder
|
||||
* It converts retailCRM customer data (array) into WC_Customer
|
||||
*/
|
||||
class WC_Retailcrm_WC_Customer_Corporate_Builder extends WC_Retailcrm_Abstract_Builder
|
||||
{
|
||||
/**
|
||||
* @var \WC_Customer $customer
|
||||
*/
|
||||
private $customer;
|
||||
|
||||
/**
|
||||
* @var array $contactPerson
|
||||
*/
|
||||
private $contactPerson;
|
||||
|
||||
/**
|
||||
* @var \WC_Retailcrm_Builder_Interface $customerBuilder
|
||||
*/
|
||||
private $customerBuilder;
|
||||
|
||||
/**
|
||||
* WC_Retailcrm_WC_Customer_Builder constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $contactPerson
|
||||
*
|
||||
* @return \WC_Retailcrm_WC_Customer_Corporate_Builder
|
||||
*/
|
||||
public function setContactPerson($contactPerson)
|
||||
{
|
||||
$this->contactPerson = $contactPerson;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getContactPerson()
|
||||
{
|
||||
return $this->contactPerson;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WC_Retailcrm_Builder_Interface $customerBuilder
|
||||
*/
|
||||
public function setCustomerBuilder($customerBuilder)
|
||||
{
|
||||
$this->customerBuilder = $customerBuilder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $firstName
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setFirstName($firstName)
|
||||
{
|
||||
$this->contactPerson['firstName'] = $firstName;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $lastName
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setLastName($lastName)
|
||||
{
|
||||
$this->contactPerson['lastName'] = $lastName;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $email
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEmail($email)
|
||||
{
|
||||
$this->contactPerson['email'] = $email;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $externalId
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setExternalId($externalId)
|
||||
{
|
||||
$this->contactPerson['externalId'] = $externalId;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $phones
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setPhones($phones)
|
||||
{
|
||||
if (self::isPhonesArrayValid($phones)) {
|
||||
$this->contactPerson['phones'] = $phones;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $address
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setAddress($address)
|
||||
{
|
||||
if (is_array($address)) {
|
||||
$this->contactPerson['address'] = $address;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WC_Customer $customer
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setWcCustomer($customer)
|
||||
{
|
||||
if ($customer instanceof WC_Customer) {
|
||||
$this->customer = $customer;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets provided externalId and loads associated customer from DB (it it exists there).
|
||||
* Returns true if everything went find; returns false if customer wasn't found.
|
||||
*
|
||||
* @param string $externalId
|
||||
*
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function loadExternalId($externalId)
|
||||
{
|
||||
try {
|
||||
$wcCustomer = new WC_Customer($externalId);
|
||||
} catch (\Exception $exception) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->setExternalId($externalId);
|
||||
$this->setWcCustomer($wcCustomer);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function reset()
|
||||
{
|
||||
parent::reset();
|
||||
$this->customer = new WC_Customer();
|
||||
$this->contactPerson = array();
|
||||
$this->customerBuilder = new WC_Retailcrm_WC_Customer_Builder();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill WC_Customer fields with customer data from retailCRM.
|
||||
* If field is not present in retailCRM customer - it will remain unchanged.
|
||||
*
|
||||
* @return $this|\WC_Retailcrm_Builder_Interface
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
$this->checkBuilderValidity();
|
||||
WC_Retailcrm_Logger::debug(
|
||||
__METHOD__,
|
||||
'Building WC_Customer from corporate data:',
|
||||
$this->data,
|
||||
"\nContact:",
|
||||
$this->contactPerson
|
||||
);
|
||||
|
||||
$wcCustomer = $this->customerBuilder
|
||||
->setData($this->contactPerson)
|
||||
->build()
|
||||
->getResult();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed|\WC_Customer|null
|
||||
*/
|
||||
public function getResult()
|
||||
{
|
||||
return $this->customer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws an exception if internal state is not ready for data building.
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
private function checkBuilderValidity()
|
||||
{
|
||||
if (empty($this->data)) {
|
||||
throw new \RuntimeException('Empty data');
|
||||
}
|
||||
|
||||
if (!is_array($this->data)) {
|
||||
throw new \RuntimeException('Data must be an array');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if provided variable contains array with customer phones.
|
||||
*
|
||||
* @param mixed $phones
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private static function isPhonesArrayValid($phones)
|
||||
{
|
||||
if (!is_array($phones)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($phones as $phone) {
|
||||
if (!is_array($phone) || count($phone) != 1 || !array_key_exists('number', $phone)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -15,11 +15,8 @@ class WC_Retailcrm_Customer_Switcher_State
|
|||
/** @var array */
|
||||
private $newContact;
|
||||
|
||||
/** @var array */
|
||||
private $newCorporateCustomer;
|
||||
|
||||
/** @var array $newCompany */
|
||||
private $newCompany;
|
||||
/** @var string $newCompanyName */
|
||||
private $newCompanyName;
|
||||
|
||||
/**
|
||||
* @return \WC_Order
|
||||
|
@ -79,32 +76,24 @@ class WC_Retailcrm_Customer_Switcher_State
|
|||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @return string
|
||||
*/
|
||||
public function getNewCorporateCustomer()
|
||||
public function getNewCompanyName()
|
||||
{
|
||||
return $this->newCorporateCustomer;
|
||||
return $this->newCompanyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $newCorporateCustomer
|
||||
* @param string $newCompanyName
|
||||
*
|
||||
* @return WC_Retailcrm_Customer_Switcher_State
|
||||
*/
|
||||
public function setNewCorporateCustomer($newCorporateCustomer)
|
||||
public function setNewCompanyName($newCompanyName)
|
||||
{
|
||||
$this->newCorporateCustomer = $newCorporateCustomer;
|
||||
$this->newCompanyName = $newCompanyName;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getNewCompany()
|
||||
{
|
||||
return $this->newCompany;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $newCompany
|
||||
*
|
||||
|
@ -112,7 +101,10 @@ class WC_Retailcrm_Customer_Switcher_State
|
|||
*/
|
||||
public function setNewCompany($newCompany)
|
||||
{
|
||||
$this->newCompany = $newCompany;
|
||||
if (isset($newCompany['name'])) {
|
||||
$this->setNewCompany($newCompany['name']);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue