feat(shopping): alışveriş listeleri, stok eşiği önerileri ve akıllı mağaza önerisi motoru

- shoppingLists koleksiyonu (ürün tipi / marka / serbest metin kalemleri), migration 015
- planShopping saf fonksiyonu: paket yuvarlama, zahmet ve hacimli cezası, teslimat, yemek kartı önceliği, ek mağaza eşiği
- eşik önerileri onay/red (red stok yenilenene kadar), ürün tipine hacimli işareti
- fiyat servisinde ortak loadTypeOffers; seed listeleri ve testler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-06 23:28:54 +03:00
parent 0b7de17b5c
commit 8ab2244755
21 changed files with 2325 additions and 16 deletions
+4
View File
@@ -87,6 +87,7 @@ type ProductLean = {
step: number;
countEveryDays: number | null;
note: string;
bulky?: boolean;
archivedAt: Date | null;
createdAt: Date;
};
@@ -132,6 +133,7 @@ export type ProductTypeView = {
step: number;
countEveryDays: number | null;
note: string;
bulky: boolean;
archived: boolean;
current: number;
level: StockLevel;
@@ -331,6 +333,7 @@ function toView(p: ProductLean, moves: MoveLean[], ctx: ViewContext): ProductTyp
step: p.step,
countEveryDays: p.countEveryDays,
note: p.note,
bulky: Boolean(p.bulky),
archived: Boolean(p.archivedAt),
current,
level,
@@ -807,6 +810,7 @@ const productFields = (input: ProductTypeForm) => ({
step: input.step,
countEveryDays: input.countEveryDays,
note: input.note,
bulky: input.bulky,
});
export async function createProductType(