Користувальницькькі налаштування

Налаштування сайту


discounts

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
Остання ревізія По сторонах наступні версії
discounts [2012/11/21 01:59]
discounts [2023/01/04 14:48]
nightfly
Рядок 1: Рядок 1:
  
 +
 +====== Знижки ======
 +
 +Механіка знижок доступна починаючи з Ubilling 0.3.4. У версії Ubilling 1.3.4 (ага, після сотні стабільних релізів) її було вдумливо переписано, і вона більше не спирається на "додаткові поля профілю", як це було раніше. 
 +
 +
 +
 +Суть реалізації знижок, полягає в тому, що при відповідному виклику **discountprocessing** з [[remoteapi|Remote API]] відбувається наступне:
 +
 +  * Видобуваються суми усіх позитивних платежів за якийсь період часу (поточний чи попередній місяць, чи добу, опційно).
 +  * У випадку, якщо для користувачів, що здійснили ці платежі встановлено ненульовий відсоток знижки, цей відсоток від суми всіх платежів користувача зараховується на його рахунок.
 +
 +{{:discounts00.jpg?400|}}
 +
 +====== Ввімкнення та налаштування ======
 +
 +Вся конфігурація, відбувається за допомогою кількох опцій [[alteriniconf|alter.ini]]:
 +
 +<file ini alter.ini>
 +; Підтримку механіки знижок увімкнено?
 +DISCOUNTS_ENABLED=1
 +; якщо (чомусь?) необхідно внесення коштів знижки на рахунок як оплати а не коригуванням, 
 +; дана опція може приймати значення ADD
 +DISCOUNT_OPERATION="CORR"
 +; ID типу платежів, під виглядом якого вноситимуться кошти на рахунок. За замовчуванням це типу "готівка".
 +DISCOUNT_CASHTYPEID=1
 +; розкоментування цієї опції, призведе до того, що при розрахунку знижок користувачів, 
 +; будуть розглядатись оплати за "попередній місяць" замість "за поточний" як це є за замовчуванням.
 +;DISCOUNT_PREVMONTH=1
 +; Ввімкніть дану опцію, для щоденної обробки знижок. В цьому випадку, будуть розглядатись тільки платежі за поточну добу.
 +DISCOUNT_DAILY=0
 +</file>
 +
 +та розміщенням необхідного виклику **discountprocessing** в якийсь певний час, в вашому crontab-і.
 +
 +У випадку, якщо ви бажаєте розраховувати знижки, по платежах за поточний місяць, в останній день місяця, ви можете зробити якось так:
 +
 +<code>
 +59 23 * * *   /bin/ubapi "discountprocessing&lastday=1"
 +</code>
 +
 +Що власне призведе до нарахування знижок, по платежах за поточний місяць, але тільки в 23:59 останнього дня місяця, за що відповідає параметр **lastday**.
 +
 +Також вам може захотітись, нараховувати знижки скажімо тільки "чемним користувачам", котрі спромоглись оплатити послуги до середини місяця, ігноруючи всі платежі після 15-го числа. В такому випадку виклик в crontab може мати наступний вигляд:
 +
 +<code>
 +59 23 15 * *   /bin/ubapi "discountprocessing"
 +</code>
 +
 +Ну або ж ви бажаєте нараховувати знижки по всіх платежах попереднього місяця, вночі першого числа нового місяця. В такому випадку, вам необхідно змінити чи розкоментувати відповідну опцію в значення "1"
 +
 +<code ini>
 +DISCOUNT_PREVMONTH=1
 +</code>
 +
 +Та використовувати виклик з crontab якось так:
 +<code>
 +20 1 1 * *      /bin/ubapi "discountprocessing"
 +</code>
 +
 +Також, з якоїсь причини, вам може захотітись обробляти знижки щоденно. Ну типу "пройшов день, користувачі щось там пооплачували, вони молодці, давайте нарахуємо їм знижок не в кінці місяця а наприкінці доби". Добре, без проблем. У цьому випадку нам необхідно увімкнути опцію DISCOUNT_DAILY в конфізі
 +
 +<code ini>
 +DISCOUNT_DAILY=1
 +</code>
 +
 +та здійснювати виклик з Remote API щоденно, наприкінці доби
 +
 +<code>
 +59 23 * * *   /bin/ubapi "discountprocessing"
 +</code>
 +
 +====== Використання ======
 +
 +Тепер, для того, щоб встановити знижку нашому абоненту в 10%, нам достатньо просто скористатись "Редагуванням користувача"
 +
 +{{:paydiscounts0.png?500|}}
 +
 +Клацнути на редагування знижки
 +
 +{{:paydiscounts1.png?500|}}
 +
 +Встановити необхідний нам відсоток
 +
 +{{:paydiscounts2.png?500|}}
 +
 +отримати очікуваний результат
 +
 +{{:paydiscounts3.png?500|}}
 +
 +та забути про це.
 +
 +При наступних викликах discountprocessing з Remote API кошти будуть самі собі зараховуватись на рахунок абонента згідно нашої конфігурації та відсотків вказаних для абонента.
 +
 +{{:paydiscounts4.png?500|}}
 +
 +Слід також зауважити, що для зміни відсотку знижки абонентів, у вашого персоналу повинно бути встановленим відповідне право керувати користувацькими знижками - **DISCOUNTS**.
 +
 +====== Міграція з старих знижок ======
 +
 +У випадку, якщо ви раніше, в доісторичні часи, використовували стару механіку знижок, що спиралась на "Додаткові поля профілю" aka CF <del>можемо тільки поспівчувати</del> - з турботою про вас, зроблено простий [[onepunch|One-punch скрипт]] для міграції отого всього мороку в нормальний сучасний вигляд. Просто, після оновлення Ubilling до 1.3.4 чи новішого, разочок запустіть його в "PHP консолі розробника" і все в вас буде добре ;)
 +
 +<code php>
 +    if ($ubillingConfig->getAlterParam('DISCOUNTS_ENABLED')) {
 +        $discountCfId = $ubillingConfig->getAlterParam('DISCOUNT_PERCENT_CFID');
 +        if ($discountCfId) {
 +            $cfDb = new nya_cfitems();
 +            $cfDb->where('typeid', '=', $discountCfId);
 +            $allOldDiscounts = $cfDb->getAll('login');
 +            if (!empty($allOldDiscounts)) {
 +                $discountsDb = new nya_discounts();
 +                $allDiscounts = $discountsDb->getAll('login');
 +                foreach ($allOldDiscounts as $eachLogin => $eachOldDiscountData) {
 +                    if (is_numeric($eachOldDiscountData['content'])) {
 +                        if (!isset($allDiscounts[$eachLogin])) {
 +                            $newDiscount = ubRouting::filters($eachOldDiscountData['content'], 'int');
 +                            $loginF = ubRouting::filters($eachOldDiscountData['login'], 'mres');
 +                            $loginF = trim($loginF);
 +                            $discountsDb->data('login', $loginF);
 +                            $discountsDb->data('percent', $newDiscount);
 +                            $discountsDb->create();
 +                            show_success(__('User') . ' (' . $eachLogin . ') ' . __('Discount') . ' ' . $newDiscount);
 +                        } else {
 +                            show_warning(__('User') . ' (' . $eachLogin . ') ' . __('already have discount'));
 +                        }
 +                    } else {
 +                        show_error(__('User') . ' (' . $eachLogin . ') ' . __('have wrong discount value') . ' ' . $newDiscount);
 +                    }
 +                }
 +                $cache = new UbillingCache();
 +                $cache->delete(Discounts::CACHE_KEY);
 +            } else {
 +                show_error(__('No old discounts found'));
 +            }
 +        } else {
 +            show_error(__('No DISCOUNT_PERCENT_CFID option set'));
 +        }
 +    } else {
 +        show_error(__('Discounts') . ' ' . __('is disabled'));
 +    }
 +</code>
 +
 +Всі ваші старі знижки, з додаткових подів профілю, буде сконвертовано для роботи в нову структуру даних, після чого ви зможете сміливо видалити це додаткове поле профілю і забути про нього як про страшний сон.
discounts.txt · Востаннє змінено: 2023/01/19 10:49 повз mixtery