Skip to content

Supplier Price Lists (قوائم أسعار الموردين)

Supplier price lists store supplier-specific pricing for products. Prices support validity periods, minimum order quantities, and lead time tracking. The comparison endpoint lets you compare prices across suppliers for a given product.

Feature Toggles

SettingDefaultDescription
purchases.enable_supplier_price_listsfalseEnable CRUD endpoints (returns 403 when disabled)
purchases.enable_supplier_comparisonfalseEnable comparison endpoint (returns 403 when disabled)

Entity Attributes

SupplierPriceList

FieldTypeRequiredDescription
idintegerautoPrimary key
company_idFKautoCompany
partner_idFKyesSupplier (business partner)
product_idFKyesProduct
product_variant_idFKnoProduct variant
unit_idFKyesUnit of measure
pricedecimal(15,3)yesUnit price
currency_idFKyesCurrency
min_quantitydecimal(15,3)noMinimum order quantity (MOQ)
lead_time_daysintegernoSupplier lead time in days
valid_fromdatenoPrice validity start
valid_untildatenoPrice validity end
notestextnoNotes
is_activebooleanautoDefault true
last_updated_attimestampautoLast price update time

Unique constraint: One price per (company_id, partner_id, product_id, product_variant_id, unit_id).

ER Diagram

API Endpoints

MethodEndpointPermissionDescription
GET/api/purchases/supplier-pricespurchases.supplier-prices.viewList prices
POST/api/purchases/supplier-pricespurchases.supplier-prices.createCreate price
GET/api/purchases/supplier-prices/{id}purchases.supplier-prices.viewShow price
PUT/api/purchases/supplier-prices/{id}purchases.supplier-prices.updateUpdate price
DELETE/api/purchases/supplier-prices/{id}purchases.supplier-prices.deleteDelete price
GET/api/purchases/supplier-prices/comparepurchases.supplier-prices.viewCompare suppliers
POST/api/purchases/supplier-prices/bulk-importpurchases.supplier-prices.createCSV import

Query Parameters (Index)

ParameterTypeDescription
partner_idintegerFilter by supplier
product_idintegerFilter by product
currency_idintegerFilter by currency
is_activebooleanFilter by active status
valid_onlybooleanOnly currently valid prices (not expired, not future)
searchstringSearch supplier name/code or product name/SKU

Create Request

bash
curl -X POST /api/purchases/supplier-prices \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "partner_id": 1,
    "product_id": 5,
    "unit_id": 2,
    "price": 25.500,
    "currency_id": 1,
    "min_quantity": 10,
    "lead_time_days": 7,
    "valid_from": "2026-01-01",
    "valid_until": "2026-12-31"
  }'
dart
final response = await dio.post(
  '/api/purchases/supplier-prices',
  data: {
    'partner_id': 1,
    'product_id': 5,
    'unit_id': 2,
    'price': 25.500,
    'currency_id': 1,
    'min_quantity': 10,
    'lead_time_days': 7,
    'valid_from': '2026-01-01',
    'valid_until': '2026-12-31',
  },
);

Compare Request

bash
curl -X GET "/api/purchases/supplier-prices/compare?product_id=5" \
  -H "Authorization: Bearer {token}"
dart
final response = await dio.get(
  '/api/purchases/supplier-prices/compare',
  queryParameters: {'product_id': 5},
);

Compare Response:

json
{
  "data": [
    {
      "id": 3,
      "partner_id": 2,
      "partner_name": "Best Supplier Co.",
      "price": "20.000",
      "currency": { "id": 1, "code": "KWD" },
      "min_quantity": "5.000",
      "lead_time_days": 3,
      "valid_until": "2026-12-31",
      "is_best_price": true
    },
    {
      "id": 1,
      "partner_id": 1,
      "partner_name": "Standard Supplier",
      "price": "30.000",
      "currency": { "id": 1, "code": "KWD" },
      "min_quantity": null,
      "lead_time_days": 7,
      "valid_until": null,
      "is_best_price": false
    }
  ]
}

CSV Bulk Import

Upload a CSV file with the following columns:

ColumnRequiredDescription
supplier_codeyesBusiness partner code
product_skuyesProduct SKU
unit_codeyesUnit symbol or name
priceyesUnit price
currency_codeyesCurrency code (e.g., KWD)
min_quantitynoMinimum order quantity
lead_timenoLead time in days
valid_fromnoValidity start date
valid_untilnoValidity end date

Existing entries (same supplier+product+unit) are updated (upsert).

Business Rules

  1. Feature Toggle: All CRUD endpoints return 403 if purchases.enable_supplier_price_lists is disabled. Compare returns 403 if purchases.enable_supplier_comparison is disabled.
  2. Uniqueness: One price per supplier+product+variant+unit combination per company.
  3. Validity Scopes: active() filters is_active = true. valid() filters entries where valid_from <= today and valid_until >= today (nulls treated as open-ended).
  4. Compare: Returns only active and valid prices, sorted by price ascending. First entry is flagged is_best_price: true.
  5. PO Auto-fill: When creating purchase orders, if enable_supplier_price_lists is enabled and an item has unit_cost = 0, the system auto-fills unit_cost from the supplier's active/valid price for that product+variant+unit.
  6. CSV Import: Uses upsert logic -- existing entries are updated, new ones created. Rows with unresolvable supplier/product/unit/currency codes are skipped with error messages.

Moon ERP API Documentation