Arhitektura cenikov in popustov, da se cene tudi v dolgih košaricah preračunavajo hitro Ceniki (pricelists) - Redni cenik (velja vedno - tega vedno upoštevamo zraven) - Ostali ceniki, npr. veleprodajni, VIP, … - jih upoštevamo, če so izpolnjeni pogoji (skupina strank, stranka, tip naročila, …) - source_type: parent (se nanaša samo na starša) ali ancestor (se nanaša na vse cenike, ki imajo med predniki cenik z source_id) - source_id: vir cenika (obvezen, če gre za popust, ker popust ne more biti brez vira) - Pogoji, pri katerih velja cenik (če ima starša, moraš preveriti tudi veljavnost starša): - Pogoji samega cenika: status, valid_from, valid_to - Pogoji, vezani na naročilo (npr. promokoda, skupina strank, stranka, tip naročila, prvo naročilo stranke, način plačila, način dostave, …) - Pogoji, vezani na vsebino košarice, npr. št. izdelkov v košarici, skupni znesek košarice, število ali znesek določenih izdelkov v košarici, … - Dodatni pogoji, vezani na izdelek v košarici, npr. popust na najcenejši ali najdražji izdelek (ugotoviti moramo, ali je ta izdelek najcenejši oz. najdražji) Cene (prices) - Vedno vsebuje pricelist_id. - Lahko vsebuje category_id, če se nanaša samo na določeno blagovno skupino (v tem primeru je nujno type="definition", podatek pa je praviloma discount, lahko pa je tudi price ali price_net, če želimo dati isto ceno vsem izdelkom v kategoriji) - type: definition, price ali price_net (označuje, kaj smo definirali v zapisu - ostala dva podatka sta izračuna) - Vsebuje te podatke: discount, price, price_net (če gre za popust na blagovno skupino, imamo samo podatek discount, ostali so null) - Lahko vsebuje še dodatne informacije, za katere izdelke cena velja (npr. za najcenejši izdelek ali pa najcenejši izdelek določene kategorije) ???? - Če gre za type price ali price_net, v polje discount vpišemo popust glede na redno ceno, v polje price_net oz. price pa izračunano neto ali bruto ceno - Tabela vsebuje predkalkulirane osnovne bruto in neto cene, znižane bruto in neto cene ter popuste, pa tudi bruto in neto znižane cene in popuste v obdobju 30 dni pred znižanjem: - base_price - base_price_net - price - price_net - discount - prev_price - prev_price_net - prev_discount - Ideja je, da ob rekalkuliranju košarice poiščemo vse zapise prices za vse aktivne pricelists in vse izdelke v košarici (en query), potem pa za vsak izdelek samo poiščemo tistega z najbolj ugodno ceno. Price_id tega izdelka vpišemo v tabelo positions, kjer sicer več nimamo nobene cene ali popusta (s tem precej zmanjšamo velikost te tabele). - Ob dodajanju ali spremembi zapisov pricelists in prices, se morajo preračunati ustrezni zapisi v tabeli prices. Če se prices spremeni, v tabeli positions pa že obstaja price_id, je potrebno kreirati novi zapis prices, staremu pa status prestaviti na inactive. - Če zapis prices nima nobene pozicije, ga samo spremenimo (ne ustvarimo novega, da nam ne stojijo po nepotrebnem v bazi), - Vsak zapis tipa definition ustvari še množico zapisov tipa price ali price_net za vse izdelke izbrane kategorije. Ustrezno mora biti tudi brisanje oz. ažuriranje. Ne pozabiti na ažuriranje ob sprembi kategorij v oknu izdelka. Catch: če daš popust na skupni znesek nakupa nad X EUR, se skupni znesek zmanjša in lahko pade pod X EUR. Isti problem imaš pri popustu na znesek izdelkov določene kategorije. Rešitev: dvostopenjska kalkulacija popustov; samo 2x jo zaženemo: - prvi zagon bo brez skupnih zneskov v košarici, dobimo cene z ostalimi popusti, - drugi zagon bo s skupnimi zneski z ostalimi popusti, morda dobimo dodatne popuste, - nikoli ne delamo tretjega zagona; - drugi zagon delamo samo v primeru, da imamo med ceniki vsaj enega, ki je vezan na vsebino košarice (to si zapomnimo pri prvem zagonu).