## Why

Products like baby care items carry an expiry date and sometimes a bundled promotion (e.g. "tặng kèm 1 bông tắm"), but the Product model has no way to record either. Staff currently track expiry dates outside the system, so near-expiry stock isn't surfaced anywhere in the product list, risking unsold expired inventory.

## What Changes

- Add `expiry_date` (nullable date) and `promotion_note` (nullable text) columns to `products`.
- Add an "Hạn sử dụng" (expiry date) input and a "Ghi chú khuyến mãi" (promotion note) textarea to the product create/edit forms, positioned per the agreed layout (expiry date above the weight attribute select, promotion note below the qty/unit row).
- Accept and persist both fields in `ProductController@store` and `@update`.
- Add a generic `settings` table (`key`, `key_group`, `content`) and a `Setting` model to hold configurable app values, seeded with `key=near_expiry_days`, `key_group=product`, `content=30`.
- Add a "Cài đặt chung" settings page (`/settings/general`) to view/edit `near_expiry_days`.
- Add an "Hạn sử dụng" column to the product list table: near-expiry products get a warning (orange) highlight, already-expired products get a danger (red) highlight.
- Add a filter dropdown on the product list ("Tất cả" / "Gần hết hạn" / "Đã hết hạn") — replacing an initial toggle-button design — so an admin can list near-expiry products, already-expired products, or all products, sorted by `expiry_date` when a filter is active.
- Surface `promotion_note` and an expired-product warning icon on the POS "Bán hàng" screen (product search dropdown and cart line), so a cashier sees active promotions and is warned before selling expired stock.

## Capabilities

### New Capabilities
- `product-expiry-tracking`: Product-level expiry date and promotion note capture, display, near-expiry/expired filtering and highlighting in the product list, and expiry/promotion awareness on the POS screen.
- `app-settings`: Generic key/value settings storage and a settings page for editing configurable values, starting with the near-expiry threshold.

### Modified Capabilities
(none — no pre-existing specs in this repo)

## Impact

- **Database**: two new migrations — add columns to `products`; create `settings` table.
- **Models**: `App\Models\Product` (fillable + casts, `is_expired` accessor appended to JSON), new `App\Models\Setting`.
- **Controllers**: `ProductController` (validation in `store`/`update`, expiry filter modes in `index`), `PosController` (product search/scan JSON now carries `is_expired`), new `SettingController`.
- **Views**: `resources/views/pages/products-add.blade.php`, `products-edit.blade.php`, `products.blade.php`; `resources/views/vendor/admin/index.blade.php` (POS cart-row template); new `resources/views/pages/settings-general.blade.php` (or similar).
- **Routes**: `routes/web.php` — add `/settings/general` route inside the existing `settings` prefix group.
