מודול נאמנות מותאם אישית ל-1C-Bitrix: פיתוח, רמות, נקודות ותמחור
אנו משלבים תוכנית נאמנות ב-1C-Bitrix כמודול נפרד כאשר הבונוסים הסטנדרטיים כבר לא מספיקים. השדה המובנה b_user.UF_BONUS_POINTS הוא רק מספר ללא היסטוריה, ללא תפוגה, וללא קישור להזמנה. כאשר לקוח מבקש מערכת צבירה עם רמות, היסטוריית עסקאות, ותשלום חלקי בנקודות, אנו בונים אותה מאפס. במהלך 5 השנים האחרונות, יישמנו יותר מ-50 פרויקטים כאלה, והארכיטקטורה ניתנת לשחזור אך גם ניתנת להתאמה לצרכים עסקיים ספציפיים. תוכנית נאמנות היא לא רק נקודות; זו מערכת אקולוגית לשימור לקוחות.
מדוע בונוסים סטנדרטיים של Bitrix אינם מתאימים?
הגישה הסטנדרטית באמצעות שדות משתמש אינה ניתנת להרחבה. עם 10,000 לקוחות, נוצרות בעיות: שאילתות איטיות, אובדן נתונים במהלך תקלות, וחוסר יכולת ליצור דוחות צבירה. הפתרון שלנו משתמש בטבלאות ORM נפרדות, ומספק ביצועים ואמינות. השוו: השדה הסטנדרטי מאחסן מספר בודד—היתרה הנוכחית. המודול שלנו מאחסן כל עסקה, ומאפשר שחזור היסטוריה ומימוש נקודות FIFO נכון. בהתבסס על המדידות שלנו, המודול מעבד עסקאות פי 50 מהר יותר מגישת שדות המשתמש הסטנדרטית בעומס של 10,000 פעולות ביום.
כיצד אנו בונים את מודל הנתונים
המודול vendor.loyalty כולל ארבע טבלאות עיקריות:
-
b_vendor_loyalty_account— חשבון נאמנות: id, user_id, balance, total_earned, level_id, created_at -
b_vendor_loyalty_transaction— עסקאות: id, account_id, type (earn/spend/expire/cancel/manual), amount, order_id, description, expires_at, created_at -
b_vendor_loyalty_level— רמות: id, name, min_points, earn_multiplier, privileges (JSON), icon_id -
b_vendor_loyalty_rule— כללי צבירה: id, event_type, points_type, points_value, conditions (JSON), is_active
מבנה זה מאפשר הוספה קלה של סוגי צבירה חדשים (להרשמה, ביקורת, יום הולדת) וניהול דרך ממשק הניהול.
מנגנון צבירת נקודות
הצבירה מקושרת לאירועי Bitrix. עבור הזמנות, אנו משתמשים ב-OnSaleOrderPaid:
AddEventHandler('sale', 'OnSaleOrderPaid', ['\Vendor\Loyalty\EventHandler', 'onOrderPaid']);
public static function onOrderPaid(\Bitrix\Main\Event $event): void
{
$orderId = $event->getParameter('id');
$order = \Bitrix\Sale\Order::load($orderId);
$userId = $order->getUserId();
$account = AccountTable::getByUserId($userId);
$level = LevelTable::getById($account['LEVEL_ID']);
// Начисляем % от суммы заказа с учётом множителя уровня
$basePoints = floor($order->getPrice() * 0.05); // 5% базово
$earnedPoints = floor($basePoints * $level['EARN_MULTIPLIER']);
TransactionTable::add([
'ACCOUNT_ID' => $account['ID'],
'TYPE' => 'earn',
'AMOUNT' => $earnedPoints,
'ORDER_ID' => $orderId,
'EXPIRES_AT' => (new DateTime())->add(new DateInterval('P1Y')), // срок жизни — 1 год
'DESCRIPTION' => "Начисление за заказ №{$order->getField('ACCOUNT_NUMBER')}",
]);
AccountTable::update($account['ID'], [
'BALANCE' => $account['BALANCE'] + $earnedPoints,
'TOTAL_EARNED' => $account['TOTAL_EARNED'] + $earnedPoints,
]);
// Проверка повышения уровня
LevelUpgradeService::check($account['ID']);
}לפי תיעוד 1C-Bitrix, האירוע AddEventHandler('sale', 'OnSaleOrderPaid', ['\Vendor\Loyalty\EventHandler', 'onOrderPaid']); public static function onOrderPaid(\Bitrix\Main\Event $event): void { $orderId = $event->getParameter('id'); $order = \Bitrix\Sale\Order::load($orderId); $userId = $order->getUserId(); $account = AccountTable::getByUserId($userId); $level = LevelTable::getById($account['LEVEL_ID']); // Начисляем % от суммы заказа с учётом множителя уровня $basePoints = floor($order->getPrice() * 0.05); // 5% базово $earnedPoints = floor($basePoints * $level['EARN_MULTIPLIER']); TransactionTable::add([ 'ACCOUNT_ID' => $account['ID'], 'TYPE' => 'earn', 'AMOUNT' => $earnedPoints, 'ORDER_ID' => $orderId, 'EXPIRES_AT' => (new DateTime())->add(new DateInterval('P1Y')), // срок жизни — 1 год 'DESCRIPTION' => "Начисление за заказ №{$order->getField('ACCOUNT_NUMBER')}", ]); AccountTable::update($account['ID'], [ 'BALANCE' => $account['BALANCE'] + $earnedPoints, 'TOTAL_EARNED' => $account['TOTAL_EARNED'] + $earnedPoints, ]); // Проверка повышения уровня LevelUpgradeService::check($account['ID']); } נקרא לאחר תשלום ההזמנה. אנו משתמשים בו כנקודת כניסה לצבירת נקודות.
לאחר הצבירה, סוכן בודק האם יש לשדרג את הרמה של המשתמש. אם סך הנקודות שנצברו עולה על הסף, הרמה משודרגת אוטומטית.
טיפול בתפוגת נקודות
לכל עסקת צבירה יש תאריך תפוגה. סוכן שרץ בלילה מבצע מחיקה של נקודות שפגו תוקפן:
$expired = TransactionTable::getList([
'filter' => [
'TYPE' => 'earn',
'<=EXPIRES_AT' => new DateTime(),
'>AMOUNT' => 0,
],
])->fetchAll();
foreach ($expired as $tx) {
TransactionTable::add([
'TYPE' => 'expire',
'AMOUNT' => -$tx['REMAINING'],
...
]);
AccountTable::update($account['ID'], [
'BALANCE' => $account['BALANCE'] - $tx['REMAINING'],
]);
}המשתמש רואה תאריכי תפוגה קרובים בחשבון האישי שלו ויכול להשתמש בנקודות לפני שהן פוקעות.
יישום תשלום עם נקודות
תשלום חלקי עם נקודות פועל דרך מערכת תשלום מותאמת אישית (PaySystem):
public function processRequest(Payment $payment, Request $request): ProcessRequestResult {
$pointsToSpend = (int)$request->get('loyalty_points');
$account = AccountTable::getByUserId($payment->getOrder()->getUserId());
if ($account['BALANCE'] < $pointsToSpend) {
return ProcessRequestResult::error('Недостаточно баллов');
}
// 1 балл = $1–1 (настраивается в модуле)
$discountAmount = $pointsToSpend / (int)Option::get('vendor.loyalty', 'points_rate', 1);
$discountAmount = min($discountAmount, $payment->getSum() * 0.5); // максимум 50% заказа
// Списываем баллы и создаём скидку на заказ
TransactionTable::add(['TYPE' => 'spend', 'AMOUNT' => -$pointsToSpend, ...]);
AccountTable::update($account['ID'], ['BALANCE' => $account['BALANCE'] - $pointsToSpend]);
return ProcessRequestResult::success();
}מגבלת 50% מההזמנה מגנה מפני ניצול לרעה. האחוז ניתן להתאמה בלוח הניהול.
מבנה הרמות
הרמות משודרגות בהתבסס על סך הנקודות שנצברו. בעת השדרוג, מכפיל הצבירה וההטבות (משלוח חינם, תמיכה עדיפה) מופעלים. טבלת רמות:
| רמה | סף (סה"כ נקודות) | מכפיל צבירה |
|---|---|---|
| סטנדרטית | 0 | 1.0x |
| כסף | 5,000 | 1.2x |
| זהב | 20,000 | 1.5x |
| פלטינה | 50,000 | 2.0x |
הספים והמכפילים ניתנים להגדרה דרך ממשק הניהול. המודול משדרג את הרמה אוטומטית כאשר הסף מושג.
מה כלול בפיתוח המודול
אנו מספקים חבילה מלאה עם תוצרים ברורים:
- מודל ORM והגירות מסד נתונים
- מטפלי אירועים לצבירת נקודות
- סוכנים למחיקת נקודות שפגו
- מערכת תשלום למימוש נקודות במהלך הזמנה
- חשבון אישי למשתמש (יתרה, היסטוריה, רמות)
- ממשק ניהול לניהול רמות וכללים
- קוד מקור עם תיעוד
- גישה למאגר Git
- הדרכה מקוונת של שעתיים למנהלים
- חודש תמיכה חינם לאחר ההשקה
- ייעוץ לאינטגרציה עם 1C או מערכות אחרות
מה מייחד אותנו מפתרונות אחרים?
הצוות שלנו מחזיק בהסמכות 1C-Bitrix ויש לו ניסיון פיתוח של 5+ שנים. השלמנו מעל 50 פרויקטים, כולל אינטגרציות עם 1C, מערכות POS ו-CRM. הפתרון שלנו ניתן להרחבה למיליוני עסקאות—בניגוד לפתרונות שדות משתמש שנחלשים עם אלפי לקוחות. אנו מספקים אחריות על הקוד ועומדים בלוחות זמנים. התמחור מתחיל מ-$2,000, ואתם יכולים לחסוך עד 30% בהשוואה לפיתוח פנימי.לוח זמנים לפיתוח
| שלב | משך |
|---|---|
| טבלאות ORM, מודל חשבון ועסקאות | יום אחד |
| כללי צבירה, מטפלי אירועים | יומיים |
| תפוגת נקודות, סוכן תפוגה | יום אחד |
| PaySystem למימוש נקודות | יומיים |
| רמות, שדרוג אוטומטי, הטבות | יומיים |
| חשבון אישי, היסטוריית עסקאות | יומיים |
| ממשק ניהול | יום אחד |
| בדיקות | יום אחד |
סה"כ: 12 ימי עבודה. אינטגרציה עם POS או CRM מחוץ לאתר לצבירת נקודות עבור רכישות מחוץ לאתר מוערכת בנפרד.
צרו קשר כדי להעריך את הפרויקט שלכם. קבלו ייעוץ על שילוב מודול הנאמנות. חיסכון בתקציב יכול להגיע עד 30% בהשוואה לפיתוח פונקציונליות דומה בעצמכם.

