137 lines
5.4 KiB
PHP
137 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace Lts\Netterm\Observer;
|
|
|
|
use JR\NetSuite\Lib\Restful\NetSuiteAPI;
|
|
use JR\NetSuite\Logger\Logger as NetSuiteLogger;
|
|
use Lts\Customer\Model\CustomerRepository;
|
|
use Lts\Netterm\Model\Payment\Netterm;
|
|
use Magento\Framework\DataObject;
|
|
use Magento\Framework\Event\Observer;
|
|
use Magento\Framework\Event\ObserverInterface;
|
|
use Magento\Quote\Api\CartRepositoryInterface;
|
|
use Magento\Quote\Api\Data\CartInterface;
|
|
use Random\RandomException;
|
|
|
|
class IsNettermActive implements ObserverInterface
|
|
{
|
|
private NetSuiteAPI $netSuiteAPI;
|
|
private NetSuiteLogger $netSuiteLogger;
|
|
private CartRepositoryInterface $cartRepository;
|
|
|
|
private array $nettermPayments = [
|
|
23 => 'Net 10',
|
|
21 => 'Net 120',
|
|
1 => 'Net 15',
|
|
2 => 'Net 30',
|
|
16 => 'Net 45',
|
|
3 => 'Net 60',
|
|
7 => 'Net 7',
|
|
20 => 'Net 90',
|
|
];
|
|
|
|
public function __construct(
|
|
CartRepositoryInterface $cartRepository,
|
|
NetSuiteAPI $netSuiteAPI,
|
|
NetSuiteLogger $netSuiteLogger,
|
|
protected CustomerRepository $customerRepository
|
|
) {
|
|
$this->netSuiteAPI = $netSuiteAPI;
|
|
$this->netSuiteLogger = $netSuiteLogger;
|
|
$this->cartRepository = $cartRepository;
|
|
}
|
|
|
|
protected function updateCustomer(CartInterface $quote, int $netsuiteId, $cseg_ncg_rep_office)
|
|
{
|
|
$customer = $quote->getCustomer();
|
|
$old_netsuite_cseg_ncg_rep_office = $customer->getExtensionAttributes()?->getNetsuiteCsegNcgRepOffice();
|
|
if (!$old_netsuite_cseg_ncg_rep_office) {
|
|
$service = sprintf('record/v1/customer/%d', $netsuiteId);
|
|
try {
|
|
if (!$cseg_ncg_rep_office) {
|
|
$response = $this->netSuiteAPI->get($service);
|
|
$cseg_ncg_rep_office = isset($response['response']['cseg_ncg_rep_office']['id'])? $response['response']['cseg_ncg_rep_office']['id']:0;
|
|
}
|
|
|
|
// $this->netSuiteLogger->warning('netsuite_cseg_ncg_rep_office', [
|
|
// 'netsuite_cseg_ncg_rep_office' => $cseg_ncg_rep_office,
|
|
// '!$customer->getData(\'netsuite_cseg_ncg_rep_office\')' => var_export(!$old_netsuite_cseg_ncg_rep_office, true)
|
|
// ]
|
|
// );
|
|
if ($cseg_ncg_rep_office) {
|
|
$customer->getExtensionAttributes()?->setNetsuiteCsegNcgRepOffice($cseg_ncg_rep_office);
|
|
$this->customerRepository->save($customer);
|
|
}
|
|
// $this->netSuiteLogger->warning('netsuite_cseg_ncg_rep_office after save', [
|
|
// '$customer->getExtensionAttributes()?->getNetsuiteCsegNcgRepOffice()' => $customer->getExtensionAttributes()?->getNetsuiteCsegNcgRepOffice()
|
|
// ]
|
|
// );
|
|
} catch (\Exception $e) {
|
|
$this->netSuiteLogger->error(
|
|
sprintf('update customer cseg_ncg_rep_office %s exception: ', $quote->getCustomerEmail()).
|
|
$e->getMessage(),
|
|
$e->getTrace()
|
|
);
|
|
}
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param CartInterface $quote
|
|
* @param int $netsuiteId
|
|
* @return bool
|
|
*/
|
|
protected function isNettermAvailable(CartInterface $quote, int $netsuiteId)
|
|
{
|
|
$result = false;
|
|
$cseg_ncg_rep_office = null;
|
|
if (!$quote->getNetsuitePaymentId()) {
|
|
$service = sprintf('record/v1/customer/%d', $netsuiteId);
|
|
try {
|
|
$response = $this->netSuiteAPI->get($service);
|
|
$this->netSuiteLogger->warning('netsuite customer api response', $response);
|
|
$nettermId = isset($response['response']['terms']['id'])? intval($response['response']['terms']['id']):0;
|
|
$cseg_ncg_rep_office = isset($response['response']['cseg_ncg_rep_office']['id'])? $response['response']['cseg_ncg_rep_office']['id']:0;
|
|
if ($nettermId && in_array($nettermId, array_keys($this->nettermPayments)) ) {
|
|
$result = true;
|
|
$quote->setNetsuitePaymentId($nettermId);
|
|
$this->cartRepository->save($quote);
|
|
}
|
|
|
|
} catch (\Exception $e) {
|
|
$this->netSuiteLogger->error(
|
|
sprintf('check customer %s exception: ', $quote->getCustomerEmail()).
|
|
$e->getMessage(),
|
|
$e->getTrace()
|
|
);
|
|
}
|
|
} else {
|
|
$result = in_array(intval($quote->getNetsuitePaymentId()), array_keys($this->nettermPayments));
|
|
}
|
|
|
|
$this->updateCustomer($quote, $netsuiteId, $cseg_ncg_rep_office);
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function execute(Observer $observer)
|
|
{
|
|
/* @var $checkResult DataObject */
|
|
$checkResult = $observer->getData('result');
|
|
|
|
/* @var $methodInstance Netterm */
|
|
$methodInstance = $observer->getData('method_instance');
|
|
|
|
/* @var $quote CartInterface */
|
|
$quote = $observer->getData('quote');
|
|
if ($methodInstance->getCode()==Netterm::PAYMENT_METHOD_NETTERM_CODE) {
|
|
$checkResult->setData('is_available', false);
|
|
$dataCustomer = $quote->getCustomer();
|
|
$netsuiteId = $dataCustomer->getCustomAttribute('netsuite_id')?->getValue();
|
|
if ($netsuiteId) {
|
|
$checkResult->setData('is_available', $this->isNettermAvailable($quote, $netsuiteId));
|
|
}
|
|
}
|
|
}
|
|
} |