1
0
Fork 0
mirror of synced 2025-04-18 16:41:02 +00:00

add customer edit request etc

This commit is contained in:
Sergey Chazov 2021-09-21 09:43:33 +03:00 committed by Neur0toxine
parent e5a85b38e8
commit 3ed8846dd9
14 changed files with 237 additions and 257 deletions

View file

@ -2,7 +2,6 @@
use Bitrix\Main\Context;
use Bitrix\Main\Loader;
use Intaro\RetailCrm\Component\Builder\Api\Request\LoyaltyAccountEditRequestBuilder;
use Intaro\RetailCrm\Component\ServiceLocator;
use Intaro\RetailCrm\Service\CookieService;
use Intaro\RetailCrm\Service\OrderLoyaltyDataService;
@ -11,6 +10,7 @@ use Intaro\RetailCrm\Service\LoyaltyAccountService;
use Intaro\RetailCrm\Service\CustomerService;
use Intaro\RetailCrm\Vendor\Doctrine\Common\Annotations\AnnotationReader;
use Intaro\RetailCrm\Vendor\Doctrine\Common\Annotations\AnnotationRegistry;
use \Intaro\RetailCrm\Component\Builder\Api\CustomerBuilder;
require_once __DIR__ . '/RetailcrmClasspathBuilder.php';
@ -38,7 +38,7 @@ ServiceLocator::registerServices([
LoyaltyService::class,
CustomerService::class,
OrderLoyaltyDataService::class,
LoyaltyAccountEditRequestBuilder::class
CustomerBuilder::class
]);
$arJsConfig = [

View file

@ -39,6 +39,8 @@ if (checkLoadIntaro()) {
$arResult['LP_REGISTER'] = $service->checkRegInLp();
}
$arResult['ACTIVATE'] = isset($_GET['activate']) && $_GET['activate'] === 'Y';
try {
$agreementPersonalData = AgreementRepository::getFirstByWhere(
['AGREEMENT_TEXT'],

View file

@ -14,8 +14,7 @@ function serializeObject(array) {
}
//TODO переименовать в saveUserLpFields
function createAccount() {
function saveUserLpFields() {
const formArray = $('#lpRegFormInputs').serializeArray();
const formObject = serializeObject(formArray);
@ -65,7 +64,7 @@ function activateAccount() {
}
)
form.find(':input[type="string"], :input[type="text"], textarea')
form.find(':input[type="string"], :input[type="text"], :input[type="email"], textarea')
.each(
(index, value) => {
strings[index] = {
@ -112,7 +111,7 @@ function activateAccount() {
}
).then(
function(response) {
if (response.data.result === true) {
if (response.data.status === 'activate') {
location.reload();
} else {
$('#errMsg').text(response.data.msg)

View file

@ -119,87 +119,80 @@ if ($arResult["SHOW_SMS_FIELD"] == true) {
<?php } ?>
<?php
foreach ($arResult['LP_REGISTER']['form']['externalFields'] as $externalField) {
?>
<lable>
<?php
if ($externalField['type'] === 'string' || $externalField['type'] === 'date') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="<?=$externalField['type']?>"
>
<?=$externalField['name']?>
<?php } ?>
if ($arResult['ACTIVATE'] === true) {
foreach ($arResult['LP_REGISTER']['form']['externalFields'] as $externalField) {
?>
<lable>
<?php
if ($externalField['type'] === 'string' || $externalField['type'] === 'date') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="<?=$externalField['type']?>"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'boolean') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="checkbox"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'boolean') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="checkbox"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'text') { ?>
<textarea
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
cols="30"
rows="10"
></textarea>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'text') { ?>
<textarea
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
cols="30"
rows="10"
></textarea>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'integer' || $externalField['type'] === 'numeric') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="number"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'integer' || $externalField['type'] === 'numeric') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="number"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'email') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="email"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'email') { ?>
<input
name="<?=$externalField['code']?>"
id="external_<?=$externalField['code']?>"
type="email"
>
<?=$externalField['name']?>
<?php } ?>
<?php
if ($externalField['type'] === 'dictionary') { ?>
<select name="<?=$externalField['code']?>">
<?php
foreach ($externalField['dictionaryElements'] as $dictionaryElement) {
<?php
if ($externalField['type'] === 'dictionary') { ?>
<select name="<?=$externalField['code']?>">
<?php
foreach ($externalField['dictionaryElements'] as $dictionaryElement) {
?>
<option value="<?=$dictionaryElement['code']?>"><?=$dictionaryElement['name']?> </option>
<?php
}
?>
<option value="<?=$dictionaryElement['code']?>"><?=$dictionaryElement['name']?> </option>
<?php
}
?>
</select>
<?=$externalField['name']?>
<?php } ?>
</lable>
<br>
<?php
</select>
<?=$externalField['name']?>
<?php } ?>
</lable>
<br>
<?php
}
}
?>
<?php
if (isset($arResult['LP_REGISTER']['form']['idInLoyalty'])) { ?>
<input
name="idInLoyalty"
id="idInLoyalty"
type="number"
value="<?=$arResult['LP_REGISTER']['form']['idInLoyalty']?>"
hidden>
<?php } ?>
</form>
<?php
if (isset($arResult['LP_REGISTER']['resendAvailable']) && !empty($arResult['LP_REGISTER']['resendAvailable'])) {

View file

@ -36,3 +36,4 @@ $MESS['EACH_RUB'] = 'рублей покупки';
$MESS['SIMPLE_PRODUCTS'] = 'Обычные товары:';
$MESS['SALE_PRODUCTS'] = 'Акционные товары:';
$MESS['REMAINING_SUM'] = 'Сумма, оставшаяся до перехода на следующий уровень:';
$MESS['ACTIVATE'] = 'Активировать';

View file

@ -22,7 +22,7 @@ if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
<?php if (isset($arResult['ACTIVE'])) { ?>
<b><?=GetMessage('ACTIVE')?></b> <?=$arResult['ACTIVE'] ? GetMessage('YES') : GetMessage('NO')?>
<?php if ($arResult['ACTIVE'] === false) { ?>
<a href="/lp-register"> Активировать</a>
<a href="/lp-register?activate=Y"> <?= GetMessage('ACTIVATE') ?></a>
<?php } ?>
<br>
<?php } ?>

View file

@ -13,7 +13,7 @@ function serializeObject(array) {
return object;
}
function createAccount() {
function saveUserLpFields() {
const formArray = $('#lpRegFormInputs').serializeArray();
const formObject = serializeObject(formArray);

View file

@ -4,8 +4,8 @@ $APPLICATION->SetTitle("Регистрация");
?>
<?php $APPLICATION->IncludeComponent(
"bitrix:main.register",
"default_loyalty",
"intaro:lp.register",
".default",
[
"AUTH" => "Y",
"REQUIRED_FIELDS" => [],

View file

@ -13,6 +13,7 @@
namespace Intaro\RetailCrm\Component\Builder\Api;
use DateTime;
use Intaro\RetailCrm\Component\Builder\Exception\BuilderException;
use Intaro\RetailCrm\Service\CookieService;
use Intaro\RetailCrm\Component\ConfigProvider;
@ -48,6 +49,9 @@ class CustomerBuilder implements BuilderInterface
/** @var bool */
private $attachDaemonCollectorId = false;
/** @var array */
private $customFields;
/**
* CustomerBuilder constructor.
*/
@ -61,16 +65,10 @@ class CustomerBuilder implements BuilderInterface
*/
public function build(): BuilderInterface
{
$contragentType = ConfigProvider::getContragentTypeForPersonType($this->personTypeId);
if (null === $contragentType) {
throw new BuilderException(sprintf(
'Cannot find corresponding contragent type for PERSON_TYPE_ID `%s`',
$this->personTypeId
));
}
$this->buildBase($contragentType);
$this->buildBase(
ConfigProvider::getContragentTypeForPersonType($this->personTypeId ?? '')
?? 'individual'
);
$this->buildNames();
$this->buildPhones();
$this->buildAddress();
@ -137,6 +135,18 @@ class CustomerBuilder implements BuilderInterface
return $this;
}
/**
* @param array $customFields
*
* @return $this
*/
public function setCustomFields(array $customFields): CustomerBuilder
{
$this->customFields = $customFields;
return $this;
}
/**
* Create base customer with initial data.
*
@ -152,6 +162,7 @@ class CustomerBuilder implements BuilderInterface
$this->customer->email = $this->user->getEmail();
$this->customer->createdAt = $this->user->getDateRegister();
$this->customer->subscribed = false;
$this->customer->customFields = $this->handleFields();
}
/**
@ -221,4 +232,60 @@ class CustomerBuilder implements BuilderInterface
$phone->number = $number;
$this->customer->phones[] = $phone;
}
private function handleFields(): array
{
$resultFieldsArray = [];
foreach ($this->customFields as $type => $fields) {
$resultFieldsArray = array_merge(
$resultFieldsArray,
$this->handleFieldByType($type, $fields)
);
}
return $resultFieldsArray;
}
/**
* @param string $type
* @param array $fields
*
* @return array
* @throws \Exception
*/
private function handleFieldByType(string $type, array $fields): array
{
$newFields = [];
foreach ($fields as $field) {
if ($type === 'checkboxes') {
$newFields[$field['code']] = (bool) $field['value'];
}
if ($type === 'numbers') {
$newFields[$field['code']] = (int) $field['value'];
}
if ($type === 'strings') {
if ($field['code'] === 'PERSONAL_PHONE') {
$this->addPhone(htmlspecialchars(trim($field['value'])));
continue;
}
$newFields[$field['code']] = htmlspecialchars(trim($field['value']));
}
if ($type === 'dates') {
$newFields[$field['code']] = date('d.m.Y', strtotime($field['value']));
}
if ($type === 'options') {
$newFields[$field['code']] = htmlspecialchars(trim($field['value']));
}
}
return $newFields;
}
}

View file

@ -1,129 +0,0 @@
<?php
/**
* PHP version 7.1
*
* @category Integration
* @package Intaro\RetailCrm\Component\Builder\API
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace Intaro\RetailCrm\Component\Builder\Api\Request;
use Bitrix\Main\Type\DateTime;
use Intaro\RetailCrm\Component\Builder\BuilderInterface;
use Intaro\RetailCrm\Model\Api\LoyaltyAccount;
use Intaro\RetailCrm\Model\Api\Request\Loyalty\Account\LoyaltyAccountEditRequest;
/**
* Class LoyaltyAccountEditRequestBuilder
*
*
* @package Intaro\RetailCrm\Component\Builder\Api\Request
*/
class LoyaltyAccountEditRequestBuilder implements BuilderInterface
{
/**
* @var array
*/
private $formFields;
/**
* @var \Intaro\RetailCrm\Model\Api\Request\Loyalty\Account\LoyaltyAccountEditRequest
*/
private $request;
/**
* @param array $formFields
*/
public function setFormFields(array $formFields): LoyaltyAccountEditRequestBuilder
{
$this->formFields = $formFields;
return $this;
}
public function build(): BuilderInterface
{
$this->request = new LoyaltyAccountEditRequest();
$this->request->loyaltyAccount = new LoyaltyAccount();
$this->request->loyaltyAccount->customFields = [];
foreach ($this->formFields as $type => $fields) {
$this->request->loyaltyAccount->customFields = array_merge(
$this->request->loyaltyAccount->customFields,
$this->handleFields($type, $fields)
);
}
return $this;
}
public function reset(): BuilderInterface
{
$this->request = new LoyaltyAccountEditRequest();
return $this;
}
public function getResult(): LoyaltyAccountEditRequest
{
return $this->request;
}
/**
* @param string $type
* @param array $fields
*
* @return array
*/
private function handleFields(string $type, array $fields): array
{
$newFields = [];
foreach ($fields as $field) {
if ($type === 'checkboxes') {
$newFields[$field['code']] = (bool) $field['value'];
}
if ($type === 'numbers') {
if ($field['code'] === 'idInLoyalty') {
$this->request->id = (int) $field['value'];
continue;
}
$newFields[$field['code']] = (int) $field['value'];
}
if ($type === 'strings') {
if ($field['code'] === 'PERSONAL_PHONE') {
$this->request->loyaltyAccount->phoneNumber = htmlspecialchars(trim($field['value']));
continue;
}
if ($field['code'] === 'UF_CARD_NUM_INTARO') {
$this->request->loyaltyAccount->cardNumber = htmlspecialchars(trim($field['value']));
continue;
}
$newFields[$field['code']] = htmlspecialchars(trim($field['value']));
}
if ($type === 'dates') {
$newFields[$field['code']] = strtotime($field['value']);
}
if ($type === 'options') {
$newFields[$field['code']] = htmlspecialchars(trim($field['value']));
}
}
return $newFields;
}
}

View file

@ -5,7 +5,7 @@ namespace Intaro\RetailCrm\Controller\Loyalty;
use Bitrix\Main\Engine\ActionFilter\Authentication;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Request;
use Intaro\RetailCrm\Component\Builder\Api\Request\LoyaltyAccountEditRequestBuilder;
use Intaro\RetailCrm\Component\Builder\Api\CustomerBuilder;
use Intaro\RetailCrm\Component\Factory\ClientFactory;
use Intaro\RetailCrm\Component\ServiceLocator;
use Intaro\RetailCrm\DataProvider\CurrentUserProvider;
@ -13,9 +13,11 @@ use Intaro\RetailCrm\Model\Api\LoyaltyAccount;
use Intaro\RetailCrm\Model\Api\Request\Loyalty\Account\LoyaltyAccountActivateRequest;
use Intaro\RetailCrm\Model\Api\Request\Loyalty\Account\LoyaltyAccountEditRequest;
use Intaro\RetailCrm\Model\Api\Request\SmsVerification\SmsVerificationConfirmRequest;
use Intaro\RetailCrm\Model\Api\Response\Loyalty\Account\LoyaltyAccountEditResponse;
use Intaro\RetailCrm\Model\Api\SmsVerificationConfirm;
use Intaro\RetailCrm\Model\Bitrix\User;
use Intaro\RetailCrm\Repository\UserRepository;
use Intaro\RetailCrm\Service\CustomerService;
use Intaro\RetailCrm\Service\LoyaltyService;
use Intaro\RetailCrm\Service\LoyaltyAccountService;
use Intaro\RetailCrm\Service\Utils;
@ -81,7 +83,7 @@ class Register extends Controller
}
if ((!isset($request['UF_AGREE_PL_INTARO'])
|| $request['UF_AGREE_PL_INTARO'] !== "on")
|| $request['UF_AGREE_PL_INTARO'] !== 'on')
&& $customer->getLoyalty()->getIsAgreeLoyaltyProgramRules() !== 1
) {
return [
@ -91,7 +93,7 @@ class Register extends Controller
}
if ((!isset($request['UF_PD_PROC_PL_INTARO'])
|| $request['UF_PD_PROC_PL_INTARO'] !== "on")
|| $request['UF_PD_PROC_PL_INTARO'] !== 'on')
&& $customer->getLoyalty()->getIsAgreePersonalDataRules() !== 1
) {
return [
@ -304,26 +306,66 @@ class Register extends Controller
*
* @return array
* @throws \Intaro\RetailCrm\Component\Builder\Exception\BuilderException
* @throws \ReflectionException
*/
public function activateAccountAction(array $allFields): array
{
/** @var LoyaltyAccountService $service */
$service = ServiceLocator::get(LoyaltyAccountService::class);
$editResponse = $service->editLoyaltyAccount($allFields);
global $USER;
if (
$editResponse === null
|| (!$editResponse->success && !empty($editResponse->errorMsg))
) {
/** @var CustomerService $customerService */
$customerService = ServiceLocator::get(CustomerService::class);
/** @var \Intaro\RetailCrm\Component\Builder\Api\CustomerBuilder $customerBuilder */
$customerBuilder = ServiceLocator::get(CustomerBuilder::class);
/** @var LoyaltyAccountService $loyaltyAccountService */
$loyaltyAccountService = ServiceLocator::get(LoyaltyAccountService::class);
$userObject = UserRepository::getById($USER->GetID());
if ($userObject === null) {
return [
'status' => 'error',
'msg' => GetMessage('ERROR') . $editResponse->errorMsg ?? '',
'msg' => GetMessage('ERROR'),
'msgColor' => 'brown',
];
}
$customer = $customerBuilder
->setCustomFields($allFields)
->setUser($userObject)
->build()
->getResult();
return $service->tryActivate($editResponse->id);
$customerBuilder->reset();
$editResponse = $customerService->editCustomer($customer);
if ($editResponse === false) {
return [
'status' => 'error',
'msg' => GetMessage('ERROR'),
'msgColor' => 'brown',
];
}
$response = $loyaltyAccountService->activateLoyaltyAccount($userObject->getLoyalty()->getIdInLoyalty());
//Если отметка не стоит, но аккаунт активирован на стороне CRM
if ($response !== null && $response->errorMsg === GetMessage('ALREADY_ACTIVE')) {
$loyaltyAccountService->setLoyaltyActivateFlag($USER->GetID());
return [
'status' => 'activate',
];
}
if ($response !== null && $response->loyaltyAccount->active === true) {
$loyaltyAccountService->setLoyaltyActivateFlag($userObject->getId());
return [
'status' => 'activate',
'msg' => GetMessage('SUCCESS_REGISTER'),
'msgColor' => 'green',
];
}
return $loyaltyAccountService->tryActivate($userObject->getLoyalty()->getIdInLoyalty());
}
}

View file

@ -11,3 +11,4 @@ $MESS["NOT_AGREE_PERSONAL_DATA_RULES"] = 'Необходимо согласие
$MESS["PHONE_EMPTY"] = 'Необходимо ввести номер телефона';
$MESS["NOT_REGISTER"] = 'Пользователь не зарегистрирован';
$MESS["ARGUMENT_ERROR"] = 'Ошибка валидации: некорректный id аккаунта в программе лояльности';
$MESS["ALREADY_ACTIVE"] = 'LoyaltyAccount has been already activated';

View file

@ -2,3 +2,7 @@
$MESS['LOYALTY_FIELD_ERROR']
= 'To activate participation in the loyalty program, the following fields should be filled in for the customer:';
$MESS['ALREADY_ACTIVE']
= 'LoyaltyAccount has been already activated';
$MESS['GO_TO_PERSONAL']
= 'Ваш аккаунт создан. Его можно активировать в личном кабинете';

View file

@ -15,8 +15,8 @@ namespace Intaro\RetailCrm\Service;
use CUser;
use DateTime;
use Intaro\RetailCrm\Component\Builder\Api\Request\LoyaltyAccountEditRequestBuilder;
use Intaro\RetailCrm\Component\ConfigProvider;
use Intaro\RetailCrm\Component\Constants;
use Intaro\RetailCrm\Component\Factory\ClientFactory;
use Intaro\RetailCrm\Component\Json\Deserializer;
use Intaro\RetailCrm\Component\Json\Serializer;
@ -227,6 +227,14 @@ class LoyaltyAccountService
return ['msg' => GetMessage('ACTIVATE_ERROR')];
}
//Если отметка не стоит, но аккаунт активирован на стороне CRM
if ($activateResponse->errorMsg === GetMessage('ALREADY_ACTIVE')) {
$this->setLoyaltyActivateFlag($USER->GetID());
return [
'msg' => GetMessage('REG_COMPLETE'),
];
}
if ($activateResponse->success && $activateResponse->loyaltyAccount->active === true) {
return ['msg' => GetMessage('REG_COMPLETE')];
}
@ -235,8 +243,6 @@ class LoyaltyAccountService
//если есть незаполненные обязательные поля
if (count($requiredFields) > 0) {
$extFields = $this->getExternalFields($requiredFields);
return [
'msg' => GetMessage('ACTIVATE_YOUR_ACCOUNT'),
'form' => [
@ -245,8 +251,7 @@ class LoyaltyAccountService
'action' => 'activateAccount',
],
'fields' => $this->getStandardFields($this->user),
'externalFields' => $extFields,
'idInLoyalty' => $loyalty->getIdInLoyalty(),
'externalFields' => $this->getExternalFields($requiredFields),
],
];
}
@ -272,7 +277,7 @@ class LoyaltyAccountService
'form' => [
'button' => [
'name' => GetMessage('CREATE'),
'action' => 'createAccount',
'action' => 'saveUserLpFields',
],
'fields' => $this->getStandardFields($this->user),
'externalFields' => (array)json_decode(ConfigProvider::getLoyaltyFields(), true),
@ -286,7 +291,7 @@ class LoyaltyAccountService
'form' => [
'button' => [
'name' => GetMessage('CREATE'),
'action' => 'createAccount',
'action' => 'saveUserLpFields',
],
'fields' => $this->getStandardFields($this->user),
'externalFields' => (array)json_decode(ConfigProvider::getLoyaltyFields(), true),
@ -385,24 +390,17 @@ class LoyaltyAccountService
}
/**
* @param array $allFields
*
* @return \Intaro\RetailCrm\Model\Api\Response\Loyalty\Account\LoyaltyAccountEditResponse|null
* @throws \Intaro\RetailCrm\Component\Builder\Exception\BuilderException
* @throws \ReflectionException
* @param int|null $userId
*/
public function editLoyaltyAccount(array $allFields): ?LoyaltyAccountEditResponse
public function setLoyaltyActivateFlag(?int $userId): void
{
/** @var LoyaltyAccountEditRequestBuilder $requestBuilder */
$requestBuilder = ServiceLocator::get(LoyaltyAccountEditRequestBuilder::class);
/** @var LoyaltyAccountEditRequest $editRequest */
$editRequest = $requestBuilder->setFormFields($allFields)->build()->getResult();
$requestBuilder->reset();
if ($userId === null) {
return;
}
/** @var \Intaro\RetailCrm\Component\ApiClient\ClientAdapter $client */
$client = ClientFactory::createClientAdapter();
global $USER_FIELD_MANAGER;
return $client->editLoyaltyAccount($editRequest);
$USER_FIELD_MANAGER->Update('USER', $userId, ['UF_REG_IN_PL_INTARO' => true]);
}
/**
@ -493,7 +491,9 @@ class LoyaltyAccountService
&& $createResponse->loyaltyAccount->activatedAt === null
&& isset($createResponse->loyaltyAccount->id)
) {
return $this->tryActivate($createResponse->loyaltyAccount->id);
return [
'msg' => GetMessage('GO_TO_PERSONAL')
];
}
if ($createResponse !== null && $createResponse->success === true) {