Products, Combinations και Stock στο PrestaShop: πώς συνδέονται πραγματικά
Το request ακούγεται απλό:
“Θέλω όλα τα προϊόντα με SKU και stock.”
Μετά ανοίγεις τη database ή το Webservice και ανακαλύπτεις ότι ένα product μπορεί να έχει combinations, το πραγματικό SKU μπορεί να είναι variant-level και το stock βρίσκεται σε διαφορετικό entity.
1. Simple product
ps_product
│
│ id_product
↓
ps_stock_availableΓια simple product:
id_product_attribute = 02. Product με combinations
ps_product
│
│ id_product
↓
ps_product_attribute
│
│ id_product_attribute
↓
ps_stock_available3. Πού βρίσκονται τα attributes;
ps_product_attribute
│
↓
ps_product_attribute_combination
│
↓
ps_attribute
│
↓
ps_attribute_lang4. Παράδειγμα catalogue
PRODUCT
Basic T-Shirt
id_product: 42
reference: TSHIRT-BASIC101 → TSHIRT-BLK-S
102 → TSHIRT-BLK-M
103 → TSHIRT-BLK-L5. Πού βρίσκεται πραγματικά το stock;
Simple product:
id_product = 42
id_product_attribute = 0
quantity = 19Combination:
id_product = 42
id_product_attribute = 103
quantity = 76. Query για simple products και stock
SELECT
p.id_product,
p.reference,
pl.name,
sa.quantity
FROM ps_product p
INNER JOIN ps_product_lang pl
ON pl.id_product = p.id_product
AND pl.id_lang = 1
AND pl.id_shop = 1
LEFT JOIN ps_stock_available sa
ON sa.id_product = p.id_product
AND sa.id_product_attribute = 0
WHERE p.active = 1;7. Query για combination stock
SELECT
p.id_product,
pl.name AS product_name,
pa.id_product_attribute,
pa.reference AS combination_reference,
sa.quantity
FROM ps_product p
INNER JOIN ps_product_lang pl
ON pl.id_product = p.id_product
AND pl.id_lang = 1
AND pl.id_shop = 1
INNER JOIN ps_product_attribute pa
ON pa.id_product = p.id_product
LEFT JOIN ps_stock_available sa
ON sa.id_product = pa.id_product
AND sa.id_product_attribute = pa.id_product_attribute
WHERE p.active = 1
ORDER BY p.id_product, pa.id_product_attribute;8. Γιατί το product-only export μπορεί να είναι λάθος
Basic T-Shirt | TSHIRT-BASIC | 19.90έναντι:
Basic T-Shirt / Black / S | TSHIRT-BLK-S | 19.90 | 4
Basic T-Shirt / Black / M | TSHIRT-BLK-M | 19.90 | 8
Basic T-Shirt / Black / L | TSHIRT-BLK-L | 19.90 | 79. Product-level ή combination-level identifier;
Parent:
ONE ROW PER PRODUCTVariant:
ONE ROW PER COMBINATION10. EAN / UPC / MPN
Τα combinations μπορούν να έχουν δικά τους identification fields.
11. Webservice mental model
/api/products
│
↓
/api/combinations
│
↓
/api/stock_availables
│
↓
available stock12. Multistore
Σε multistore setup το stock έχει και shop context.
13. Γράψε πρώτα το dataset specification
ONE ROW PER:
Combination
FIELDS:
Product ID
Combination ID
Product name
Combination reference
EAN
Price
Stock
LANGUAGE:
Greek
SHOP:
Shop 114. Άλλες production αποφάσεις
Πρέπει να οριστούν price/tax context, specific prices, categories, images, language, shop, currency και supplier reference.
15. Το mental model
PRODUCT
│
├── Product-level data
│
└── COMBINATIONS
│
├── Variant SKU / EAN / impacts
│
└── STOCK AVAILABLEProduct page στο Back Office με combinations και διαφορετικές quantities ανά variant.
Official references
- https://devdocs.prestashop-project.org/9/faq/stock/
- https://devdocs.prestashop-project.org/9/webservice/resources/products/
- https://devdocs.prestashop-project.org/9/webservice/resources/combinations/
- https://devdocs.prestashop-project.org/9/webservice/resources/stock_availables/
Πού να συνεχίσεις
Χρησιμοποίησε αυτό το relationship model για catalogue reports με ξεκάθαρα SQL joins. Για API writes, κράτησε την ίδια διάκριση product/combination στο ασφαλές Webservice update workflow.