favorites

GoldenFavoritesService

src/golden/favorites/GoldenFavoritesService.ts · GoldenFavoritesController.ts

Як RU стають фаворитами TU, коли це оновлюється, що читається на екран Favorites. Перелік ендпоінтів — у Swagger.

Сховище

  • golden_favorites — одна пара TU↔RU = один запис (ladyId_api × manId_api). Тримає агреговані profit і gifts, межі активності (startDate, lastDate, time), мітки (type, contacts + contactDetails, blocked, blockedByTU, name, note).
  • golden_calendar — по одному запису на пару (TU, yearMonth) з масивом днів: uniqueList (усі RU з витратою в цей день) і newList (ті, кого до цього дня ще не бачили в історії).
  • golden_other_bonuses — бонуси по TU які вона заробила не у нас в компанії.
  • Нотатки по фавориту — окрема колекція.

Як RU стає фаворитом

Фаворитом стає будь-який RU, що зробив витратну операцію на TU. Перевірка йде по обʼєднаному набору з golden_statistic і golden_other_bonuses за умовами:

  • тип операції не в GoldenIgnoredAggregateTypes (службові/ігноровані типи відкидаються);
  • sum != 0;

Для кожної унікальної пари (TU, RU) рахуємо:

  • profit = сума витрат не-подарункового типу;
  • gifts = кількість операцій типу з GoldenGiftsTypes;
  • startDate = найраніша дата витрати;
  • lastDate / time = найпізніша дата + час витрати.

Якщо запису пари ще нема — створюється з дефолтами (type: New, contacts: No, blocked: false, порожні name/note). Якщо є — поля профілю активності перезаписуються, мітки (type, name, note, blocked, contacts) не чіпаються (вони ведуться оператором).

Коли оновлюється

Щодоби в пайплайні статистики

крок #4 downloadMainStatistics (~13:06)

updateFavoritesV2 викликається з statistics після того, як свіжа добова статистика вже лягла у golden_statistic. Тому фаворити «доганяють» статистику з тим самим тимінгом — не свіжіше.

Календар у тому ж циклі

updateCalendarItems — у складі генерації статистики V2

По кожній TU з нової порції бонусів довантажуємо/створюємо місяць у golden_calendar: додаємо manId_api у uniqueList дня (якщо ще нема в дні) і у newList дня (якщо RU взагалі не бачили раніше в історії цієї TU).

Ручний тригер

convertContacts · роль technical_department

Перебудувати фаворитів вручну (повний updateFavoritesV2). Адмінська дія, не для звичайних ролей.

Init (одноразово)

initFavorites · initCalendarItems · роль technical_department

Повна побудова з нуля по всіх TU. Використовується при налаштуванні / після значних змін схеми. У звичайному циклі не потрібні.

Алгоритм оновлення фаворитів

updateFavoritesV2

  1. Зливаємо golden_statistic + golden_other_bonuses в один потік.
  2. Фільтруємо: тип не ігнорований, sum != 0, є ladyId_api+manId_api.
  3. Групуємо по (ladyId_api, manId_api) і рахуємо profit / gifts / startDate / lastDate / lastTime.
  4. Bulk upsert у golden_favorites: оновлюємо лише profit / gifts / startDate / lastDate / time; решту полів проставляємо тільки при вставці ($setOnInsert).
  5. Тригеримо перерахунок global-favorites (для крос-TU екрану).

Алгоритм оновлення календаря

updateCalendarItems

  1. Беремо унікальні TU зі свіжої порції бонусів, тягнемо їхні існуючі місяці з golden_calendar.
  2. Для кожної TU збираємо seed «всі вже бачені RU» (із усіх існуючих днів усіх її місяців).
  3. По хронології (sort за date+time) проходимо бонуси: для кожного беремо місяць (новий або існуючий) і день; додаємо manId_api у uniqueList (якщо ще не в дні) і у newList (якщо ще не в seed «бачених»).
  4. Записуємо: оновлюємо існуючий запис місяця або створюємо новий.

«New men» = RU, що зʼявився в історії TU уперше в цей день; не «нових за тиждень/місяць».

Нюанси

  • Active Favorite (зелений рядок на UI) на golden рахується на фронті з lastDate (<7 днів). Окремого прапора в golden_favorites нема.
  • Мітки оператора не затираються при оновленніtype, name, note, blocked, contacts живуть незалежно від агрегатних полів.
  • Свіжість фаворитів = свіжість статистики. Не відпрацював добовий download — список не оновився.
  • «New men» у календарі — означає «вперше зʼявився у цієї TU за всю історію», а не «новий цього місяця/тижня».

Зв’язки

  • favorites — UI-екран Favorites (per-family)
  • favorites — крос-сервісна фіча
  • statistics — пайплайн, з якого тригериться updateFavoritesV2 (крок #4)