Files
PriceForge/bible-local/data-rules.md
2026-03-07 23:11:42 +03:00

52 lines
1.5 KiB
Markdown

# Data Rules
## Component Categories (lot_category)
### Source
Categories are **always** taken from `lot.lot_category` (table `lot`).
**NOT** from `qt_lot_metadata`.
**NOT** derived from the LOT name or article name.
### When creating pricelists
1. **Estimate**: include only components with `current_price > 0` and `is_hidden = 0`, then load `lot.lot_category`.
2. **Warehouse**: load `lot.lot_category` for all positions.
3. Persist into `lot_category` column of `qt_pricelist_items`.
### Model
```go
type PricelistItem struct {
LotCategory *string `gorm:"column:lot_category;size:50" json:"category,omitempty"`
// JSON field is "category" for the frontend
}
```
### Rules
- Category is **not** a virtual field — it is persisted to DB when the pricelist is created.
- JOIN with `lot` is only needed for `lot_description`; category is already in `qt_pricelist_items`.
- Default value when category is absent in source or LOT row is missing: `PART_`.
---
## Price Method
- Warehouse pricelist: `price_method` = `"weighted_avg"` (quantity-weighted average).
- Estimate pricelist: method determined by per-component settings.
---
## Warehouse: Filtering by qt_partnumber_book_items
**Rule (CRITICAL)**: only positions with a matching record in `qt_partnumber_book_items` are included in the warehouse pricelist. Unmapped partnumbers are completely excluded.
---
## Component Data Source
- Source: MariaDB (not SQLite).
- `handlers/component.go` uses `componentService.List()` (MariaDB).