From 7a7a2dec91bcfa18e5d1d38bdca36d79f9d1303c Mon Sep 17 00:00:00 2001 From: Ivan Chaplygin Date: Tue, 9 Apr 2024 17:57:24 +0300 Subject: [PATCH] =?UTF-8?q?ref=20#72067=20=D0=A0=D0=B5=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BB=D0=B8=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D0=B5=20=D0=BB=D0=BE=D1=8F=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/pot/retailcrm-ru_RU.pot | 66 +++++++++++++ src/assets/js/retailcrm-loyalty-actions.js | 49 +++++++++- src/include/class-wc-retailcrm-base.php | 35 ++++++- src/include/class-wc-retailcrm-loyalty.php | 103 ++++++++++++++++----- src/languages/retailcrm-ru_RU.mo | Bin 17803 -> 19774 bytes 5 files changed, 224 insertions(+), 29 deletions(-) diff --git a/resources/pot/retailcrm-ru_RU.pot b/resources/pot/retailcrm-ru_RU.pot index c148d14..7d974d4 100644 --- a/resources/pot/retailcrm-ru_RU.pot +++ b/resources/pot/retailcrm-ru_RU.pot @@ -477,3 +477,69 @@ msgstr "Вставьте условия обработки персональн msgid "To activate the loyalty program it is necessary to activate the 'enable use of coupons option'" msgstr "Для активации программы лояльности необходимо активировать опцию 'включить использование купонов'" + +msgid "Bonus account" +msgstr "Бонусный счёт" + +msgid "Participation ID" +msgstr "ID участия" + +msgid "Current level" +msgstr "Текущий уровень" + +msgid "Bonuses on the account" +msgstr "Бонусов на счёте" + +msgid "Bonus card number" +msgstr "Номер бонусной карты" + +msgid "Date of registration" +msgstr "Дата регистрации" + +msgid "Current level rules" +msgstr "Правила текущего уровня" + +msgid "Required amount of purchases to move to the next level" +msgstr "Необходимая сумма покупок для перехода на следующий уровень" + +msgid "Activate participation in the loyalty program" +msgstr "Активировать участие в программе лояльности" + +msgid "Send" +msgstr "Отправить" + +msgid "To register in the Loyalty Program, fill in the form:" +msgstr "Для регистрации в Программе лояльности заполните форму:" + +msgid " I agree with " +msgstr " Я согласен с " + +msgid "loyalty program terms" +msgstr "условиями программы лояльности" + +msgid "terms of personal data processing" +msgstr "условиями обработки персональных данных" + +msgid "Phone" +msgstr "Телефон" + +msgid "Error while registering in the loyalty program. Try again later." +msgstr "Ошибка при регистрации в программе лояльности. Попробуйте позже." + +msgid "The card is not linked" +msgstr "Карта не привязана" + +msgid "Ordinary goods" +msgstr "Обычные товары" + +msgid "Promotional products" +msgstr "Акционные товары" + +msgid "bonus for every" +msgstr "бонус за каждые" + +msgid "bonuses" +msgstr "бонусов" + +msgid "discount" +msgstr "скидка" diff --git a/src/assets/js/retailcrm-loyalty-actions.js b/src/assets/js/retailcrm-loyalty-actions.js index 5351fae..85ec0fb 100644 --- a/src/assets/js/retailcrm-loyalty-actions.js +++ b/src/assets/js/retailcrm-loyalty-actions.js @@ -1,3 +1,50 @@ jQuery(function() { - alert('HOBA'); + jQuery('#loyaltyRegisterForm').on("submit", function (event) { + var termsCheck = jQuery('#termsLoyalty'); + var privacyCheck = jQuery('#privacyLoyalty'); + + if (termsCheck.length) { + if (!termsCheck.is(':checked')) { + event.preventDefault(); + return false; + } + } + + if (privacyCheck.length) { + if (!privacyCheck.is(':checked')) { + event.preventDefault(); + return false; + } + } + + let phone = jQuery('#phoneLoyalty'); + + if (!phone.val().match(/(?:\+|\d)[\d\-\(\) ]{7,}\d/)) { + phone.parent().append('test') + + event.preventDefault(); + return false; + } else { + jQuery('#warningLoyaltyPhone').remove(); + } + + jQuery.ajax({ + url: LoyaltyUrl.url + '/admin-ajax.php?action=register_customer_loyalty', + method: 'POST', + timeout: 0, + data: {ajax: 1, phone: phone.val(), userId: customerId}, + dataType: 'json' + }) + .done(function (response) { + if (response.hasOwnProperty('error')) { + jQuery('#loyaltyRegisterForm').append('

'+ response.error + '

') + + event.preventDefault(); + return false; + } else { + alert('success'); + return true; + } + }) + }); }); diff --git a/src/include/class-wc-retailcrm-base.php b/src/include/class-wc-retailcrm-base.php index 247bedb..a605984 100644 --- a/src/include/class-wc-retailcrm-base.php +++ b/src/include/class-wc-retailcrm-base.php @@ -90,6 +90,7 @@ if (!class_exists('WC_Retailcrm_Base')) { add_action('wp_ajax_upload_selected_orders', [$this, 'upload_selected_orders']); add_action('wp_ajax_clear_cron_tasks', [$this, 'clear_cron_tasks']); add_action('wp_ajax_get_status_coupon', [$this, 'get_status_coupon']); + add_action('wp_ajax_register_customer_loyalty', [$this, 'register_customer_loyalty']); add_action('admin_print_footer_scripts', [$this, 'ajax_generate_icml'], 99); add_action('woocommerce_update_customer', [$this, 'update_customer'], 10, 1); add_action('user_register', [$this, 'create_customer'], 10, 2); @@ -629,6 +630,33 @@ if (!class_exists('WC_Retailcrm_Base')) { wp_die(); } + public function register_customer_loyalty() + { + $phone = filter_input(INPUT_POST, 'phone'); + $userId = filter_input(INPUT_POST, 'userId'); + + $site = $this->apiClient->getSingleSiteForKey(); + + if (empty($site)) { + writeBaseLogs('Error with CRM credentials: need an valid apiKey assigned to one certain site'); + echo json_encode(['error' => __('Error while registering in the loyalty program. Try again later.', 'retailcrm')]); + } + + if (!$userId || !$phone) { + writeBaseLogs('Errors when registering a loyalty program. Passed parameters: userId = ' . $userId ?? 'NULL' . ' phone = ' . $phone ?? 'NULL'); + echo json_encode(['error' => __('Error while registering in the loyalty program. Try again later.', 'retailcrm')]); + } + + $response = $this->loyalty->registerCustomer($userId, $phone, $site); + + if (!$response->isSuccessful()) { + writeBaseLogs('Error while registering in the loyalty program: ' . $response->getRawResponse()); + echo json_encode(['error' => __('Error while registering in the loyalty program. Try again later.', 'retailcrm')]); + } + + wp_die(); + } + /** * In this method we include CSS file * @@ -827,7 +855,7 @@ if (!class_exists('WC_Retailcrm_Base')) { public function add_loyalty_item($items) { - $items['loyalty'] = __('Loyalty program'); + $items['loyalty'] = __('Loyalty program', 'retailcrm'); return $items; } @@ -839,8 +867,6 @@ if (!class_exists('WC_Retailcrm_Base')) { public function show_loyalty() { - global $wp; - $userId = get_current_user_id(); if (!isset($userId)) { @@ -848,12 +874,13 @@ if (!class_exists('WC_Retailcrm_Base')) { } $jsScript = 'retailcrm-loyalty-actions'; - $loyaltyUrl = home_url(add_query_arg([], $wp->request)); + $loyaltyUrl = ['url' => get_admin_url()]; $jsScriptsPath = plugins_url() . '/woo-retailcrm/assets/js/'; wp_register_script($jsScript, $jsScriptsPath . $jsScript . '.js', false, '0.1'); wp_enqueue_script($jsScript, $jsScriptsPath . $jsScript . '.js', '', '', true); wp_localize_script($jsScript, 'LoyaltyUrl', $loyaltyUrl); + wp_localize_script($jsScript, 'customerId', $userId); echo $this->loyalty->getForm($userId); } diff --git a/src/include/class-wc-retailcrm-loyalty.php b/src/include/class-wc-retailcrm-loyalty.php index c13339c..77e7e2c 100644 --- a/src/include/class-wc-retailcrm-loyalty.php +++ b/src/include/class-wc-retailcrm-loyalty.php @@ -48,37 +48,92 @@ if (!class_exists('WC_Retailcrm_Loyalty')) : if (isset($response['loyaltyAccounts'][0]) && (int)$loyaltyAccount['customer']['externalId'] === $userId) { if ($loyaltyAccount['active'] === true) { - $result = ' -

Бонусный счёт

-

ID участия: TEST

-

Статус участия: ТЕСТ

-

Текущий уровень: ТЕСТ

-

И так далее

- '; + $result = $this->getLoyaltyInfo($loyaltyAccount); } else { - $result = ' -
- - -
- -
- '; + $result = sprintf( + ' +
+ + +
+ +
', + __('Activate participation in the loyalty program', 'retailcrm'), + __('Send', 'retailcrm') + ); } } else { - $result = ' -
-

Для регистрации в Программе лояльности заполните форму:

-

Я согласен с условиями программы лояльности.

-

Я согласен с условиями обработки персональных данных.

-

-

-
- '; + $result = sprintf( + ' +
+

%s

+

%s%s.

+

%s%s.

+

+

+
', + __('To register in the Loyalty Program, fill in the form:', 'retailcrm'), + __(' I agree with ', 'retailcrm'), + __('loyalty program terms', 'retailcrm'), + __(' I agree with ', 'retailcrm'), + __('terms of personal data processing', 'retailcrm'), + __('Phone', 'retailcrm'), + __('Send', 'retailcrm') + ); } return $result; } + + public function registerCustomer(int $userId, string $phone, string $site): WC_Retailcrm_Response + { + $parameters = [ + 'phoneNumber' => $phone, + 'customer' => [ + 'externalId' => $userId + ] + ]; + + return $this->apiClient->createLoyaltyAccount($parameters, $site); + } + + private function getLoyaltyInfo(array $loyaltyAccount) + { + $data = [ + '' . __('Bonus account', 'retailcrm') . '', + __('Participation ID', 'retailcrm') . ': ' . $loyaltyAccount['id'], + __('Current level', 'retailcrm') . ': ' . $loyaltyAccount['level']['name'], + __('Bonuses on the account', 'retailcrm') . ': ' . $loyaltyAccount['amount'], + __('Bonus card number' , 'retailcrm') . ': ' . ($loyaltyAccount['cardNumber'] ?? __('The card is not linked', 'retailcrm')), + __('Date of registration', 'retailcrm') . ': ' . $loyaltyAccount['activatedAt'], + '
', + '' . __('Current level rules', 'retailcrm') . '', + __('Required amount of purchases to move to the next level', 'retailcrm') . ': ' . $loyaltyAccount['nextLevelSum'], + ]; + + switch ($loyaltyAccount['level']['type']) { + case 'bonus_converting': + $data[] = __('Ordinary goods', 'retailcrm') . ': 1 ' . __('bonus for every', 'retailcrm') . ' '. $loyaltyAccount['level']['privilegeSize']; + $data[] = __('Promotional products', 'retailcrm') . ': 1 ' . __('bonus for every', 'retailcrm') . ' '. $loyaltyAccount['level']['privilegeSizePromo']; + break; + case 'bonus_percent': + $data[] = __('Ordinary goods', 'retailcrm') . ': ' . $loyaltyAccount['level']['privilegeSize'] . '% ' . __('bonuses', 'retailcrm'); + $data[] = __('Promotional products', 'retailcrm') . ': ' . $loyaltyAccount['level']['privilegeSizePromo'] . '% ' . __('bonuses', 'retailcrm'); + break; + case 'discount': + $data[] = __('Ordinary goods', 'retailcrm') . ': ' . $loyaltyAccount['level']['privilegeSize'] . '% ' . __('discount', 'retailcrm'); + $data[] = __('Promotional products', 'retailcrm') . ': ' . $loyaltyAccount['level']['privilegeSizePromo'] . '% ' . __('discount', 'retailcrm'); + break; + } + + $result = ''; + + foreach ($data as $line) { + $result .= "

$line

"; + } + + return $result; + } } endif; diff --git a/src/languages/retailcrm-ru_RU.mo b/src/languages/retailcrm-ru_RU.mo index 6aaec635745737aab7d090c5edb2b1d027a8507b..1604a876be82022e7e248f09e557e57cb9b6d954 100644 GIT binary patch delta 5271 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 Ub6jx2yuv}>9k4rtpNuW|57)Y8Pyhe` delta 3576 zcmYk;32;nz0LStFMnW737D)unYDf@Q+_y+VLK0U{S6mSlL{izf*(T~t(OO4bHPN9n z#&n_&Q?${;U{u?rI-^w4QPoaO)i9Wrw%_0GOQ-*tUq1i$_U-%MOXVI%X{p0=(;2wK zQ1+6RDUnGV{=?#-`|0axh}^Dv}`Zq z%f@)jT`GO~AUM>R7MO^7a2iJ85>$h`FdYwKBYc3(P^|_*80vmYjKNN*_l?8aSb#KT zmY@^Y`mR03lu?P~#$gP{Pf>%vhV;Adi)bsJEk)@+LI1TBO$;H;V)c$-A zsv}1+2`{1s+<-6lp?x!qN=NiyE*`}=45OQx`b5;{BQOz{pgM9IN8-1rjz>4~ceFoh zr0GcC&14*g^X$)$p_cA5^yq=Fspti_P$Pbdx*yrpm=4$hXW)1of+tZge1<$~2D1(t zc_!-lS*Ru0j05mE_QHp#=i7xD(-{YZvHlv_d~T@WGVF$DP#yRkHIlzkFKj?BnLX1T zbw3$<;8?7U>ygPYTadn)a@2DtQ4O9$b>I=|J#`|Oe|;f>9XA}~P*YQcTd@RnDxA!B zFm^$`xDPTIlYy+3$wuv&BGhvpR6`r=>wTz>9KtSWVH>=o2Q|`Qc9gylfwXBl;w~JD zFX0c^37=yt?7)tS#Z=Vu1*naC#!EV@6>n=A#Qg$3*-I zH(@ManvWk~3BE+HreHa~gD)@%_r(~l1^4`W%tuDAnN;d$gcCYd9k&6khb z)tit5WDcUH{v%}nnP7TP-%SkaxsgcU%p7FXnXRaS{@9uM*O~`$DDU88+<=23&KQbgZD*oJUV!T8Db$SIwQWda z^uhGSYMuWADg(HY*q`-54>EZ3GqUWa1s`fAQgIFJ8Jg1P<}9VK2R<>9uBq>bn&RR1bs+|GU4pddTTU>w$UNdDYFEYcieIw?huifUqNvm-W9=InonEYI zRC$eLk}tXzlgdt_Qbt^=P^ObG zUyXlCahF~9J`Jt(-f8%y_g8eS_TyQt8epO>>JDL*eS$NO9KRBu+BNNabSB8L?lQ|z$* zij8$xCGD>{yj5}StgqraJFJ$SW(Qf%x>W>6mRFsvs;n-qs;oLzUFw3fRcERys!OU% tz5n#ju^taN=divQ6dGVXPgogf-5z>9$a^e3-1{Oe)EkkW<*i6h{1^GFjo<(P