# Coupons, Wallet, and Loyalty Models

## Localization storage

All bilingual names and content below are JSON attributes (`name`, `content`, and similar), declared in `$translatable` and edited through Filament’s `->translatable()` field. Legacy `*_arabic` and `*_english` values map to the `ar` and `en` JSON keys.

## `Coupon` → `coupons`

Fields: `id`, `name_ar/en`, unique code, type, decimal discount/minimum order, nullable total/per-user limits, expiry, counters, status/audit/timestamps.

Relationships: redemptions, orders, creating/updating admins.

Renames: `title_* → name_*`, `number_users_use_code → maximum_total_redemptions`, `number_use_code → maximum_redemptions_per_user`, `deadline → expires_at`, `discount_amount → discount_value`, `TotalMinOrderPriceAllowUse → minimum_order_total`, `visits_app/site → app_views_count/site_views_count`.

## `CouponRedemption` → `coupon_redemptions`

Fields: `id`, coupon/user/order IDs, JSON coupon snapshot, nullable decimal discount, `created_at`. Immutable; belongs to all three parents.

Renames: `platform_coupons_users_orders → coupon_redemptions`, `CouponJsonInfo → coupon_snapshot`.

## `WalletEntry` → `wallet_entries`

Fields: `id`, user ID, credit/debit type, decimal amount, nullable order/payment-method/admin/driver IDs, status, notes, unique nullable idempotency key, request metadata, occurred/created times. Immutable.

Relationships: belongs to user and optional related parents.

Renames: `platform_users_wallet → wallet_entries`, `payment_id → payment_method_id`, `admin_user_id → admin_id`, `driver_user_id → driver_id`, `status_deserved → status`, `sys_notes → notes`, `add_date/sys_date → occurred_at/created_at`, `ipaddress → ip_address`.

## `LoyaltyCondition` → `loyalty_conditions` (empty)

Fields: bilingual name, type, points, nullable max order count/minimum total, counters, status/audit/timestamps. Has many entries.

Renames: `number_points → points`, `max_count_orders → maximum_order_count`, `sum_total_order → minimum_order_total` after confirmation.

## `LoyaltyCoupon` → `loyalty_coupons` (empty)

Fields: bilingual name/content, unique code, nullable redemption limit, points cost, decimal reward amount, counters/status/audit/timestamps. Has many entries/orders.

Renames: `number_users_use_code → maximum_total_redemptions`, `number_points → points_cost`, `sum_total_order → reward_amount` after confirmation.

## `LoyaltyEntry` → `loyalty_entries` (empty)

Fields: user/type/points, nullable order/condition/coupon/referral IDs, nullable monetary and point-value snapshots, JSON rule snapshot, status/notes, unique idempotency key, occurred/created times. Immutable.

Consolidates deposit, withdrawal and trigger tables. Renames: `number_points → points`, `ConfigGetPriceOfOneLoyaltyPointint → point_value_snapshot`, legacy JSON → `rule_snapshot`, `status_deserved → status`, `sys_notes → notes`.

Do not generate empty misspelled `platform_cobons*` models.
