# DB Design - comments to the scheme
## sp_compensation_links
SPs compensation models are very likely to change over time, so i think table should include sth like
effective_from: date
effective_to: date
with a model validation making sure only one is active at any time
## price_models
I would imagine price models like these:
Let's assume we have only two price models
#### Linear
`price = qty * unit_price`
#### Regressive
(price decreased after some treshold of qty is reached ):
```
if qty > some_treshold
price = (some_treshold * unit_price) + ((qty - some_treshold) * discounted_price )
else
price = (qty * unit_price) // normal, linear price
end
```
I would have two classes like `LinearPriceModel` and `RegressivePriceModel` both descendants of `PriceModel::Base or sth` with calculation logic
and then I'd have a price model row containing all possible args that get passed to instance of a price model class
and then have sth like
```plantuml
@startuml
class PriceModelAssignment {
price_model_type
product_id
begins_at:date
ends_at:date
.. // params for PriceModel STI such as:
qty_discount_treshold eg. 100 units
discount_value eg. 50
discount_unit eg. 'percent'
}
class Product {}
Product "1" -- "*many" PriceModelAssignment
@enduml
```
```csvpreview {header="true"}
id, price_model_type, product_id, begins_at, ends_at, qty_discount_treshold, discount_value, discount_unit
1, LinearPriceModel, 123, 2021-08-01, 2021-08-31, NULL, NULL, NULL
2, RegressivePriceModel, 123, 2021-09-01, 2021-09-30, 2, 50, 'percent'
```
which would mean: in September, whenever you buy Socks (productID 123) whenever you buy more than 2 of them, 3rd and every next one comes at 50% of price.
## extra_services
can we have some examples please? I'm not sure what cases are to be handled
## orders
1. stripe_charge_id -> payment_provider_charge_id
2. why have `marketing_consent_at` and `save_user_consent_at` in here?
3. should't we have a reference to an addrtess object in t he order?
4. having coupon code as a field limits our ability to handle multiple coupons. Consider having coupons as a type of LineItem in the order.
## sp_type_links
Is it really that SPs can be of multiple types at the same time and require join table? Seems like total edge case to me.
## Line items
1. Discount(integer) - is it a FK or some value?
2. How lineItem is being related with booking? It looks like that there is only a poisibility to by Products? What happend with sellableThings?
3. How about adding some calculated prices/discounts/etc?