src/cluster_erp/modules/products_and_services/ içindeki products_and_services modülü malzeme ana verisidir. Planlama, stok ebadı ve maliyet alanlarıyla ürünleri ve hizmetleri, zorunlu ürün, model ve versiyon kırılımını, bir kategori ağacını, kırılım başına tedarikçi kaynaklarını ve ölçü birimlerini tutar. Bir ürünü anan diğer her modül bu modüle EventBus üzerinden sorar. Ortak kırılım kuralı ürün kırılımı ve stok dönüşümü sayfasında açıklanır.
Bir bakışta¶
| Öğe | Değer | Kaynak |
|---|---|---|
| Paket | src/cluster_erp/modules/products_and_services/ |
klasör |
| Modül sınıfı | Module |
src/cluster_erp/modules/products_and_services/module.py:18 |
name / version |
products_and_services / 0.1.0 |
src/cluster_erp/modules/products_and_services/module.py:19-25 |
| API öneki | /api/v1/products_and_services (ModuleBase.api_prefix) |
src/cluster_erp/core/module_base.py:37-38 |
| Alt modüller | 6: products, product_models, product_versions, categories, vendors, settings |
klasör listesi |
| Tablolar | 9 (paketteki __tablename__ sayısı) |
src/cluster_erp/modules/products_and_services/models.py |
| Metadata'daki varlıklar | 7: product, product_model, product_version, product_vendor, category, unit_category, unit |
src/cluster_erp/modules/products_and_services/module.py:998-1006 |
| Uçlar | Pakette 55 uç dekoratörü | @router. için grep |
| Web uygulamasında yeri | Katalog uygulaması products |
src/cluster_erp/modules/app_store/catalog.json (products girdisi) |
| Masaüstünde yeri | Yalnızca genel bileşenler; src/cluster_erp/desktop/modules/ içinde klasör yok |
klasör |
Modül ne yapar¶
- Ürünleri ve hizmetleri malzeme türü, dört yetenek bayrağı, durum, birimler, fiziksel veriler, stok ebadı ve üret-ya-da-satın-al verileri, planlama parametreleri, maliyet alanları ve ticari verilerle tutar (
src/cluster_erp/modules/products_and_services/products/models.py:20-351). - Her ürüne en az bir model ve her modele en az bir versiyon verir; böylece stok ve belgeler her zaman tam bir kırılıma kayıt atabilir (
src/cluster_erp/modules/products_and_services/product_versions/models.py:16-19). - Bir ürünü bir kategori ağacının birden çok kategorisine bağlar (
src/cluster_erp/modules/products_and_services/products/models.py:395-417,src/cluster_erp/modules/products_and_services/categories/models.py:11-30). - Tedarikçi kaynaklarını ürün, model, versiyon ve tedarikçi tarafı başına kaydeder (
src/cluster_erp/modules/products_and_services/vendors/models.py:14-63). - Dönüşüm katsayılarıyla birim kategorilerini ve birimleri tutar ve başlangıçta varsayılan bir küme tohumlar (
src/cluster_erp/modules/products_and_services/module.py:31-50).
Alt modüller¶
| Alt modül | Amaç | Ana varlıklar | Yönlendirici | Kaynak |
|---|---|---|---|---|
products |
Ürünler ve hizmetler, kategori bağları, hizmet bölümü, fotoğraf | Product, ProductServiceAttributes, ProductCategoryLink |
/products |
src/cluster_erp/modules/products_and_services/products/routes.py:32 |
product_models |
Bir ürünün modelleri, fotoğraf | ProductModel |
/models |
src/cluster_erp/modules/products_and_services/product_models/routes.py:25 |
product_versions |
Bir modelin versiyonları | ProductVersion |
/versions |
src/cluster_erp/modules/products_and_services/product_versions/routes.py:22 |
categories |
Kategori ağacı | ProductCategory |
/categories |
src/cluster_erp/modules/products_and_services/categories/routes.py:22 |
vendors |
Tedarikçi kaynakları | ProductVendor |
/vendors |
src/cluster_erp/modules/products_and_services/vendors/routes.py:24 |
settings |
Birim kategorileri ve birimler | UnitCategory, UnitOfMeasure |
/settings |
src/cluster_erp/modules/products_and_services/settings/routes.py:29 |
Yönlendirici yolları modül önekine görelidir; altı yönlendiricinin tamamı uygulama yetkisine bağlı tek bir modül yönlendiricisi altında durur (src/cluster_erp/modules/products_and_services/module.py:75-83).
Veri modeli¶
Ürün, model ve versiyon kırılımı¶
Şema kırılım tablolarını ve onları gösteren satırları gösterir.
erDiagram
Product ||--|{ ProductModel : "product_id"
ProductModel ||--|{ ProductVersion : "product_model_id"
Product ||--o{ ProductCategoryLink : "product_id"
ProductCategory ||--o{ ProductCategoryLink : "category_id"
Product ||--o| ProductServiceAttributes : "product_id"
ProductVersion ||--o{ ProductVendor : "product_version_id"
UnitCategory ||--|{ UnitOfMeasure : "category_id"
UnitOfMeasure ||--o{ Product : "base_unit_id"Düz anlatımla: bir ürünün bir veya daha fazla modeli, bir modelin bir veya daha fazla versiyonu vardır. Ürün başına tam olarak bir canlı model ve model başına tam olarak bir canlı versiyon is_default taşır; bunu kısmi benzersiz indeksler zorlar (src/cluster_erp/modules/products_and_services/product_models/models.py:32-38, src/cluster_erp/modules/products_and_services/product_versions/models.py:35-41). Bir versiyon adı kendi modeli içinde benzersizdir (src/cluster_erp/modules/products_and_services/product_versions/models.py:42-49). Bir ürünün kategori bağları ve, bir hizmetse, tek bir hizmet bölümü satırı vardır. Bir tedarikçi kaynağı bir ürünü, bir modeli, bir versiyonu ve bir tedarikçi tarafını belirtir (src/cluster_erp/modules/products_and_services/vendors/models.py:16-49). Birimler bir birim kategorisine aittir ve bir ürün temel, satın alma, satış, ağırlık, hacim ve boyut birimlerini gösterir (src/cluster_erp/modules/products_and_services/products/models.py:103-138).
Varlıklar¶
| Varlık | Tablo | Anahtar alanlar | Notlar | Kaynak |
|---|---|---|---|---|
Product |
products_products |
code, name, sku, barcode, material_type, category_id, is_purchasable, is_sellable, is_manufacturable, is_stockable, status, stock_form, sourcing_preference, standard_cost, extra |
sku ve barcode canlı satırlar arasında benzersiz |
src/cluster_erp/modules/products_and_services/products/models.py:20-351 |
ProductServiceAttributes |
products_service_attributes |
product_id, billing_method, rate_basis, standard_rate, currency_code, duration_value, is_billable |
ürün başına bir canlı satır | src/cluster_erp/modules/products_and_services/products/models.py:353-392 |
ProductCategoryLink |
products_product_category_links |
product_id, category_id |
canlı satırlar arasında benzersiz çift | src/cluster_erp/modules/products_and_services/products/models.py:395-417 |
ProductModel |
products_models |
code, product_id, name, sku, barcode, attributes, is_default, photo_attachment_id |
ürün başına bir canlı varsayılan | src/cluster_erp/modules/products_and_services/product_models/models.py:17-66 |
ProductVersion |
products_model_versions |
code, product_model_id, name, sku, barcode, attributes, is_default |
model başına bir canlı varsayılan | src/cluster_erp/modules/products_and_services/product_versions/models.py:16-63 |
ProductCategory |
products_categories |
code, name, parent_id, sort_order |
kendine başvuran ağaç | src/cluster_erp/modules/products_and_services/categories/models.py:11-30 |
ProductVendor |
products_product_vendors |
product_id, product_model_id, product_version_id, party_id, vendor_part_number, lead_time_days, unit_price, currency, is_preferred, valid_from, valid_to |
canlı satırlar arasında kırılım ve taraf başına benzersiz | src/cluster_erp/modules/products_and_services/vendors/models.py:14-63 |
UnitCategory |
products_unit_categories |
code, name, translations |
kod ve ad canlı satırlar arasında benzersiz | src/cluster_erp/modules/products_and_services/settings/models.py:13-39 |
UnitOfMeasure |
products_units_of_measure |
code, category_id, name, symbol, is_base_unit, conversion_factor, sort_order |
symbol canlı satırlar arasında benzersiz; katsayı Numeric(24, 6) |
src/cluster_erp/modules/products_and_services/settings/models.py:42-79 |
Para ve miktar sütunları Numeric türündedir; maliyetler ve tedarikçi fiyatları Numeric(18, 4) kullanır (src/cluster_erp/modules/products_and_services/products/models.py:313-314, src/cluster_erp/modules/products_and_services/vendors/models.py:56). Decimal değerler dizge olarak serileştirilir (src/cluster_erp/modules/products_and_services/products/schemas.py:149-151, src/cluster_erp/modules/products_and_services/products/schemas.py:478-481). Bkz. para ve Decimal.
Ekranlar ve metadata¶
get_metadata üç bölümlü bir Ürünler ve Hizmetler (İngilizce Products & Services) kenar çubuğu grubu bildirir: Ürünler (liste), Kategoriler (ağaç) ve unit_category ile unit sekmeli Ayarlar (src/cluster_erp/modules/products_and_services/module.py:954-997). Ürün ayrıntısında Genel, Hizmet, Fiziksel Özellikler, Envanter ve Planlama, Üretim ve Maliyet, Tedarikçiler, Modeller, Ürün Ağaçları ve Stok sekmeleri vardır (src/cluster_erp/modules/products_and_services/products/metadata.py:222-295). Hizmet sekmesi yalnızca service malzeme türü için görünür; fiziksel, envanter, üretim ve stok sekmeleri onun için gizlenir. Ürün Ağaçları sekmesi yalnızca üretilebilir ürünler için görünür ve bom modülünün listesini okur; Stok ise inventory modülünün listesini okur (src/cluster_erp/modules/products_and_services/products/metadata.py:230-294). Oluşturma formu ilk modelin adını, SKU'sunu ve barkodunu ve ilk versiyonun adını toplar (src/cluster_erp/modules/products_and_services/products/metadata.py:381-424). Ürünlerin ve modellerin fotoğrafları vardır (src/cluster_erp/modules/products_and_services/products/metadata.py:118, src/cluster_erp/modules/products_and_services/products/metadata.py:1328). Kategori ağacı GET /categories/tree kullanır (src/cluster_erp/modules/products_and_services/categories/metadata.py:26-32).
Durumlar ve aksiyonlar¶
Ürün durumları draft, active, blocked ve obsolete olur (src/cluster_erp/modules/products_and_services/products/schemas.py:24-28). Durum bir form alanıdır ve değişikliği ProductStatusChanged yayar (src/cluster_erp/modules/products_and_services/products/services.py:590-598). Modül tek bir ActionMeta bildirir.
| Aksiyon | Etiket | Koşul | Uç | İzin | Kaynak |
|---|---|---|---|---|---|
seed_defaults (birim kategorisi) |
Varsayılanları Yükle | yok (genel) | POST /settings/unit-categories/seed-defaults |
unit_category.seed |
src/cluster_erp/modules/products_and_services/settings/metadata.py:29-37, src/cluster_erp/modules/products_and_services/settings/routes.py:84-91 |
İş kuralları¶
- Her malzeme türünün, yük bir bayrağı belirtmediğinde kullanılan varsayılan yetenek bayrakları vardır (
src/cluster_erp/modules/products_and_services/products/schemas.py:34-89,src/cluster_erp/modules/products_and_services/products/services.py:296-312). - Kesin kısıtlar: bir hizmet ne stoklanabilir ne üretilebilirdir, bir sarf malzemesi stoklanamaz ve bir hammadde üretilemez; ihlal
PRODUCT_CAPABILITY_VIOLATIONyanıtını verir (src/cluster_erp/modules/products_and_services/products/schemas.py:91-95,src/cluster_erp/modules/products_and_services/products/services.py:671-683). - Stoklanamayan bir ürünün parti, seri, raf ömrü, emniyet stoku ve yeniden sipariş noktası alanları temizlenir (
src/cluster_erp/modules/products_and_services/products/services.py:48-55,src/cluster_erp/modules/products_and_services/products/services.py:316-318). - SKU ve barkod canlı ürünler arasında boş olmalıdır (
src/cluster_erp/modules/products_and_services/products/services.py:272-292). - Bir ürün oluşturmak varsayılan modelini oluşturur; ad verilmezse model ürünün adını alır. Model de varsayılan versiyonunu oluşturur; versiyonun adı varsayılan olarak
1olur (src/cluster_erp/modules/products_and_services/products/services.py:376-395,src/cluster_erp/modules/products_and_services/product_models/services.py:103-112,src/cluster_erp/modules/products_and_services/product_models/schemas.py:22). - Bir ürünün ilk modeli ve bir modelin ilk versiyonu varsayılan olur; yeni bir varsayılan bayrağı eskisinden alır (
src/cluster_erp/modules/products_and_services/product_models/services.py:78-99,src/cluster_erp/modules/products_and_services/product_versions/services.py:72-90). - Varsayılan model veya versiyon varsayılanlıktan düşürülemez, kullanımdan kaldırılamaz veya silinemez; yanıt HTTP 409 ile
PRODUCT_MODEL_DEFAULT_PROTECTEDveyaPRODUCT_VERSION_DEFAULT_PROTECTEDolur (src/cluster_erp/modules/products_and_services/product_models/services.py:115-160,src/cluster_erp/modules/products_and_services/product_versions/services.py:92-140). - Etkin bir ürün ağacı versiyonunun canlı bileşeni olan bir ürün silinemez; modül
bommodülüneGetPartUsageCountsile sorar vePRODUCT_IN_ACTIVE_BOMyanıtını verir (src/cluster_erp/modules/products_and_services/products/services.py:604-626). - Bir ürünü silmek kategori bağlarını ve hizmet bölümünü de aynı zaman damgasıyla geçici olarak siler; yeniden etkinleştirmek onları geri getirir (
src/cluster_erp/modules/products_and_services/products/services.py:628-660,src/cluster_erp/modules/products_and_services/module.py:165-236). - Bir üründe belirtilen her kategori canlı olmalıdır; ilki normalleştirilmemiş
category_idolur (src/cluster_erp/modules/products_and_services/products/services.py:151-206). - Bir tedarikçi kaynağı ürünün ve tarafın var olduğunu denetler, kırılımı doğrular ve aynı kırılım ve taraf için ikinci bir canlı kaynağı HTTP 409 ile reddeder (
src/cluster_erp/modules/products_and_services/vendors/services.py:94-143). - Birim dönüşümü yalnızca tek bir birim kategorisi içinde çalışır: değer çarpı kaynak katsayı, bölü hedef katsayı (
src/cluster_erp/modules/products_and_services/settings/services.py:237-247). Tohumda 13 birim kategorisi vardır (src/cluster_erp/modules/products_and_services/settings/seed_data.py,codeanahtarlı girdiler). - Kodlar
product,product_model,product_version,product_categoryveunit_of_measureyıllık dizilerinden gelir (src/cluster_erp/modules/products_and_services/products/services.py:325,src/cluster_erp/modules/products_and_services/product_models/services.py:79,src/cluster_erp/modules/products_and_services/product_versions/services.py:73).
Olaylar ve sorgular¶
Modül 19 sözleşme tüketir ve 8 sözleşme üretir; sayım parties modülü sayfasındaki gibi yapıldı. Üreticilerin ve tüketicilerin tam listesi sözleşmeler başvurusu sayfasındadır.
| Yön | Sözleşme sınıfı | İşleyici veya yayan | Kaynak |
|---|---|---|---|
| yayar | ProductCreated, ServiceCreated |
ProductService.create |
src/cluster_erp/modules/products_and_services/products/services.py:407-424 |
| yayar | ProductUpdated, ProductStatusChanged |
ProductService.update |
src/cluster_erp/modules/products_and_services/products/services.py:582-598 |
| yayar | ProductDeleted |
ProductService.delete |
src/cluster_erp/modules/products_and_services/products/services.py:652-659 |
| sorgular | GetPartUsageCounts, GetProductById, GetPartyById |
ürün silme; tedarikçi oluşturma | src/cluster_erp/modules/products_and_services/products/services.py:609-616, src/cluster_erp/modules/products_and_services/vendors/services.py:96-111 |
| sorguyu yanıtlar | ValidateProductBreakdown, GetProductDefaultBreakdown, GetBulkProductDefaultBreakdowns |
_handle_validate_breakdown, _handle_default_breakdown, _handle_bulk_default_breakdowns |
src/cluster_erp/modules/products_and_services/module.py:131-138, src/cluster_erp/modules/products_and_services/module.py:759-916 |
| sorguyu yanıtlar | GetProductById |
_handle_get_product |
src/cluster_erp/modules/products_and_services/module.py:108, src/cluster_erp/modules/products_and_services/module.py:238-317 |
| sorguyu yanıtlar | ConvertQuantity, GetUnitOfMeasure, FindUnitOfMeasure |
birim işleyicileri | src/cluster_erp/modules/products_and_services/module.py:109-115 |
| sorguyu yanıtlar | IsProductManufacturable, IsProductPurchasable, IsProductSellable, GetProductsByMaterialType |
bayrak işleyicileri | src/cluster_erp/modules/products_and_services/module.py:116-119 |
| sorguyu yanıtlar | GetProductVendors, GetBulkProductVendors, GetProductPlanningData, SetProductPlanningClassification, ApplyProductBufferZones |
planlama işleyicileri | src/cluster_erp/modules/products_and_services/module.py:120-130 |
| sorguyu yanıtlar | CreateScaffoldIntermediate |
_handle_create_scaffold_intermediate |
src/cluster_erp/modules/products_and_services/module.py:133-135, src/cluster_erp/modules/products_and_services/module.py:806-875 |
| abone olur | RecordActivated, DescribeAnalyticsFacts |
_on_record_activated, describe_analytics_facts |
src/cluster_erp/modules/products_and_services/module.py:107, src/cluster_erp/modules/products_and_services/module.py:142-147 |
CreateScaffoldIntermediate, bir rota operasyonunun çıktısı için stoklanabilir ama üretilemez bir yarı mamul ürünü oluşturur veya SKU'ya göre yeniden kullanır (src/cluster_erp/modules/products_and_services/module.py:806-875). BOM modülü sayfasında anlatılan rota iskeleti tarafından kullanılır.
Yetkiler¶
| İzin anahtarı | Kullanan | Kaynak |
|---|---|---|
product.read, .create, .update, .delete, .bulk_delete |
ürün ve fotoğraf uçları | src/cluster_erp/modules/products_and_services/products/routes.py:55-266 |
product_model.read, .create, .update, .delete, .bulk_delete |
model ve fotoğraf uçları | src/cluster_erp/modules/products_and_services/product_models/routes.py:32-199 |
product_version.read, .create, .update, .delete, .bulk_delete |
versiyon uçları | src/cluster_erp/modules/products_and_services/product_versions/routes.py:29-101 |
category.read, .create, .update, .delete, .bulk_delete |
kategori uçları | src/cluster_erp/modules/products_and_services/categories/routes.py:28-97 |
product_vendor.read, .create, .update, .delete, .bulk_delete |
tedarikçi uçları | src/cluster_erp/modules/products_and_services/vendors/routes.py:34-127 |
unit_category.*, unit.* |
birim uçları | src/cluster_erp/modules/products_and_services/settings/routes.py:59-265 |
Gizlilik, saklama ve geçmiş¶
Modül kendine ait kişisel veri saklamaz ve privacy_handlers.py dosyası yoktur. Bir tedarikçi kaynağı, tedarikçi tarafının görünen adını vendor_name_cache içinde tutar (src/cluster_erp/modules/products_and_services/vendors/models.py:51, src/cluster_erp/modules/products_and_services/vendors/services.py:145-148). Değişiklikler değişiklik geçmişi tarafından kaydedilir.
Analitik olguları¶
analytics_facts.py, products_products üzerinde tek bir olgu kümesi, product, bildirir; boyutları malzeme türü, durum, stok biçimi, temin tercihi, ABC göstergesi, aktif ve oluşturulma tarihi, ölçüleri product_count ve average_lead_time_days olur (src/cluster_erp/modules/products_and_services/analytics_facts.py:21-87).
Ayarlar ve başvuru verileri¶
Birim kategorileri ve birimler veritabanındaki başvuru verileridir. Modül her başlangıçta varsayılan kümeyi UNIT_SEED_DATA içinden tohumlar (src/cluster_erp/modules/products_and_services/module.py:37-50, src/cluster_erp/modules/products_and_services/settings/services.py:86-150). Varsayılanları Yükle aksiyonu aynı tohumlamayı istek üzerine çalıştırır.
Testler¶
tests/ içinde modules.products_and_services için grep ile ve web-client/ içinde dosya adıyla bulundu.
| Tür | Dosya | Kapsam |
|---|---|---|
| pytest | tests/test_bom_bugfix_batch_2026_10_08.py |
ürün ağacı formlarının kullandığı ürün metadata'sı, birim tohum verisi ve birim seçicileri (10 test) |
| e2e | web-client/_e2e_products.mjs |
ürünler uygulaması: liste, kategori ağacı, ayrıntı, ayarlar |
| e2e | web-client/_e2e_products_service.mjs |
hizmet bölümü, çoklu kategori ve türe duyarlı form |
| e2e | web-client/_e2e_product_model_versions.mjs |
web uygulamasında ürün, model ve versiyon zinciri |
| e2e | web-client/_e2e_make_or_buy_stock.mjs |
stok ebadı, üret-ya-da-satın-al ve stok malzemesi kırılımı |
Tutarsızlıklar¶
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| product | Product |
Malzeme ana verisindeki bir kalem veya hizmet. | Ürün | src/cluster_erp/modules/products_and_services/products/models.py:20 |
| product model | ProductModel |
Bir ürünün bir varyantı; her ürünün varsayılan bir modeli vardır. | Ürün modeli | src/cluster_erp/modules/products_and_services/product_models/models.py:17 |
| product version | ProductVersion |
Bir modelin bir versiyonu; stok ürün, model ve versiyon başına tutulur. | Ürün versiyonu | src/cluster_erp/modules/products_and_services/product_versions/models.py:16 |
| material type | material_type |
Varsayılan yetenek bayraklarını belirleyen ürün çeşidi. | Malzeme türü | src/cluster_erp/modules/products_and_services/products/schemas.py:12-21 |
| vendor source | ProductVendor |
Bir ürün kırılımını fiyat ve teslim süresiyle tedarik eden bir tedarikçi tarafı. | Tedarikçi kaynağı | src/cluster_erp/modules/products_and_services/vendors/models.py:14 |
| unit of measure | UnitOfMeasure |
Birim kategorisi içinde dönüşüm katsayısı olan bir birim. | Ölçü birimi | src/cluster_erp/modules/products_and_services/settings/models.py:42 |
İlgili sayfalar¶
- Modüller dizini
- Ürün kırılımı ve stok dönüşümü
- Ürün, model ve versiyon kırılımı karar kaydı
- BOM modülü
- Inventory modülü
- Bu modülün API başvurusu
- İlgili malzeme, tarihsel, doğrulanmadı: ağaç içi not
src/cluster_erp/modules/products_and_services/docs/how-to.md. Ürün versiyonlarından söz etmez ve ürün modelinde bulunmayandefault_unit_idadlı bir alan kullanır (src/cluster_erp/modules/products_and_services/products/models.py:103-116).
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.