Files
ltsecurityinc/app/code/JR/NetSuite/Service/CustomersSyncService.php
T

170 lines
5.4 KiB
PHP
Executable File

<?php
namespace JR\NetSuite\Service;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Api\Data\CustomerInterface;
use Magento\Customer\Api\Data\CustomerInterfaceFactory;
use Magento\Customer\Api\Data\AddressInterfaceFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
class CustomersSyncService {
/**
* @var \Magento\Customer\Api\CustomerRepositoryInterface
*/
protected $customerRepository;
/**
* @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressFactory;
/**
* @var \JR\NetSuite\Helper\Data
*/
protected $helper;
/**
* @var \JR\NetSuite\Logger\Logger
*/
protected $logger;
/**
* CustomersSyncService constructor.
* @param CustomerRepositoryInterface $customerRepository
* @param CustomerInterfaceFactory $customerFactory
* @param AddressInterfaceFactory $addressFactory
* @param \JR\NetSuite\Helper\Data $helper
* @param \JR\NetSuite\Logger\Logger $logger
*/
public function __construct(
CustomerRepositoryInterface $customerRepository,
CustomerInterfaceFactory $customerFactory,
AddressInterfaceFactory $addressFactory,
\JR\NetSuite\Helper\Data $helper,
\JR\NetSuite\Logger\Logger $logger
) {
$this->customerRepository = $customerRepository;
$this->customerFactory = $customerFactory;
$this->addressFactory = $addressFactory;
$this->helper = $helper;
$this->logger = $logger;
}
/**
* Create or Update a customer based on the provided data
*
* @param array $data
* @return array
* @throws LocalizedException
*/
public function createOrSkip(array $data) {
$this->logger->info("[CustomersSyncService] createOrSkip: customer data -> " . json_encode($data, JSON_PRETTY_PRINT));
if (!isset($data['email']) || empty($data['email'])) {
throw new LocalizedException(__('Email is required.'));
}
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
throw new LocalizedException(__('Invalid email address.'));
}
try {
// Try to load existing customer by email
$customer = $this->customerRepository->get($data['email']);
return [
'data' => $customer,
'is_new' => false
];
} catch (NoSuchEntityException $e) {
if (!isset($data['firstname']) || empty($data['firstname'])) {
throw new LocalizedException(__('First name is required.'));
}
if (!isset($data['lastname']) || empty($data['lastname'])) {
throw new LocalizedException(__('Last name is required.'));
}
// Customer does not exist, create a new one
$customer = $this->customerFactory->create();
$customer->setWebsiteId('1')->setStoreId('1');
// Populate customer object with new data
$customer->setEmail($data['email'])
->setFirstname($data['firstname'] ?? '')
->setLastname($data['lastname'] ?? '');
// set customer group
if (!empty($data['group_id'] ?? '')) {
$customer->setGroupId($data['group_id']);
}
// set reporting office
if (!empty($data['reporting_office'] ?? '')) {
$customer->setNetsuiteCsegNcgRepOffice($data['reporting_office']);
}
// Additional data can be set as needed
$customer
// ->setCustomAttribute('is_active', $data['is_active'] ?? true)
// ->setCustomAttribute('is_netsuite_customer', true)
->setCustomAttribute('company_name', $data['company_name'] ?? '')
->setCustomAttribute('netsuite_id', $data['netsuite_customer_id'] ?? '');
// Save customer
$customer = $this->customerRepository->save($customer);
$addresses = [];
// If shipping_address data is provided, create and associate address with customer
$shippingAddressData = $data['shipping_address'] ?? null;
if ($shippingAddressData && !empty($shippingAddressData['street'][0]) && !empty($shippingAddressData['city']) && !empty($shippingAddressData['postcode'])) {
$shippingAddress = $this->addressFactory->create(['data' => $shippingAddressData]);
$shippingAddress->setIsDefaultShipping(true);
$addresses[] = $shippingAddress;
}
// If billing_address data is provided, create and associate address with customer
$billingAddressData = $data['billing_address'] ?? null;
if ($billingAddressData && !empty($billingAddressData['street'][0]) && !empty($billingAddressData['city']) && !empty($billingAddressData['postcode'])) {
$billingAddress = $this->addressFactory->create(['data' => $billingAddressData]);
$billingAddress->setIsDefaultBilling(true);
$addresses[] = $billingAddress;
}
$customer->setAddresses($addresses);
$customer = $this->customerRepository->save($customer);
return [
'data' => $customer,
'is_new' => true
];
}
}
/**
* Save NetSuite Customer ID to Magento Customer
*
* @param string $email
* @param string $netsuiteCustomerId
* @return void
*/
public function saveNetsuiteId(string $email, string $netsuiteCustomerId) {
$customer = $this->customerRepository->get($email);
$customer->setCustomAttribute('netsuite_id', $netsuiteCustomerId);
$this->customerRepository->save($customer);
}
}