Model - Promocja

Cześć!

Może ktoś z Was przerabiał modelowanie “promocji”. Mam pakiety usług, które posiadają swoją cenę - tu nie ma problemu.

I teraz tak, chcę dodać do sprzedaży promocje typu:

Promocja 1: pierwszy miesiąc złotówka, dwa kolejne 50% rabatu. Czas trwania umowy 12 m-cy
Promocja 2: 70% na cały czas trwania umowy, Czas trwania umowy: 24 m-ce
Promocja 3: 6 m-cy po złotówce, Czas trwania umowy: 24 m-ce
itd.

Problem jest taki, że generując umowę muszę wyliczyć przyznane ulgi, więc muszę w modelu zawrzeć w jakiś sposób konkretne miesiące.

Jakbyście to rozwiązali? Model Promotion -> has_many: promotion_periods i PromotionPeriod z konkretnymi wartościami na poszczególne m-ce czy jakoś inaczej?

Tak też zrobiłem,

class PromotionPeriod < ApplicationRecord
  belongs_to :promotion
end

class Promotion < ApplicationRecord
  has_many :promotion_periods
  has_and_belongs_to_many :packages, join_table: :package_promotions
end

create_table "promotion_periods", force: :cascade do |t|
    t.integer  "period_start"
    t.integer  "period_end"
    t.integer  "discount"
    t.string   "discount_type"
...

Zobaczymy jak to się sprawdzi na dniach…

ponieważ każda promocja ma okres trwania pola z modelu PromotionPeriods możesz włączyć do promocji

PromotionPeriods … zbędny model

Robiłem coś podobnego skończyło się na tym że promocja miała pole typu Hash w bazie z opisem matematyki

w zestawie promocji, promocja miała priorytet - istotna kolejność obliczeń

miałem kalkulator promocji który:

  1. na wejściu dostawał id umowy
  2. sprawdzał powiązane promocje obliczając cenę końcową w oparciu o priorytet promocji
  3. zapisywał cenę końcową w cennikach umowy

nie pokazałeś jak przechowujesz umowy/ceny umów, a to stamtąd matematyka przychodzi i tam wraca

Widzę to bardziej tak:
Promocja: pierwszy miesiąc za złotówkę, dwa kolejne 50% ceny
Do takiej promocji podpinam dwa pola PromotionPeriod:

  • period_start: 1, period_end: 1, discount: 1, discount_type: ‘pln’ (przykładowo)
  • period_start: 2, period_end: 3, discount: 50, discount_type: ‘%’

W ten sposób mogę w zasadzie stworzyć dowolną promocję i dowolnie kształtować ceny w trakcie jej trwania.

Promocja będzie przypisana do Pakietu Produktów (a w zasadzie uściślając - usług) - który ma ustaloną konkretną cenę. Umów jeszcze nie robiłem, ale na jednej umowie będzie: jeden pakiet i jedna promocja

PrmotionPeriods trzyma u Ciebie ramy czasowe i matematykę, PromotionPeriods === PromotionRules

Jeżeli - jak napisałeś - promocji nie można łączyć - relacje dokumentów z promocją 1:1 to wszystko jest OK

Ja musiałem łączyć :slight_smile: i miałem jeszcze promocje “opisowe” - kubek gratis … i zdjęcie kubka :slight_smile:

Jeżeli to pierwsza iteracja to tymbardziej OK

w moim shopie byłby to zestaw 2 promocji podstawowych

  • Pierwszy miesiąc za złotówkę + Hash

  • 2 miesiące gratis + Hash

  • PromotionCalculator w backendzie przyjmuje Hash

dopóki nie musisz się martwić o alternatywne warunki rozpoczęcia/zakończenia promocji Twoje rozwiązanie jest OK