src/cluster_erp/modules/bom/ içindeki bom modülü, üretilen her ürün kırılımının ürün ağacını (BOM) tutar. Bir ürün ağacı kartı inşa ettiği ürünü, modeli ve versiyonu belirtir; taslaktan etkine, etkinden yerini almışa geçen numaralı versiyonları vardır ve her versiyonun bir kalem ağacı bulunur. Modül bir versiyonu maliyetlendirme, üretim ve planlama için etkin miktarlara patlatır ve production modülünün rota iskeletinin operasyon ürün ağacını (eBOM) türetmek için okuduğu ürün ağacını sunar.
Bir bakışta¶
| Öğe | Değer | Kaynak |
|---|---|---|
| Paket | src/cluster_erp/modules/bom/ |
klasör |
| Modül sınıfı | Module |
src/cluster_erp/modules/bom/module.py:19 |
name / version |
bom / 0.1.0 |
src/cluster_erp/modules/bom/module.py:20-26 |
| API öneki | /api/v1/bom (ModuleBase.api_prefix) |
src/cluster_erp/core/module_base.py:37-38 |
| Alt modüller | 4: boms, bom_versions, bom_items, bom_templates |
klasör listesi |
| Tablolar | 5: bom_boms, bom_bom_versions, bom_bom_items, bom_bom_templates, bom_bom_template_items |
dört models.py dosyasındaki __tablename__ |
| Metadata'daki varlıklar | 5: bom, bom_version, bom_item, bom_template, bom_template_item |
src/cluster_erp/modules/bom/module.py:898-904 |
| Uçlar | Pakette 39 uç dekoratörü | @router. için grep |
| Web uygulamasında yeri | Kapılı bir paketten gelen bom_explorer özel bileşeniyle katalog uygulaması bom |
src/cluster_erp/modules/app_store/catalog.json (bom girdisi), gated_apps/bom/app.js |
| Masaüstünde yeri | src/cluster_erp/desktop/modules/bom/ (bom_explorer.py, bom_builder.py) |
klasör |
Modül ne yapar¶
- Her ürün kırılımı için temel miktar, kullanım türü ve durumla tek bir ürün ağacı kartı tutar (
src/cluster_erp/modules/bom/boms/models.py:17-79). - Yapıyı sürümler: yalnızca taslaklar düzenlenebilir ve bir ürün ağacının en çok bir versiyonu etkindir (
src/cluster_erp/modules/bom/bom_versions/models.py:19-42). - Kalemleri bir versiyon içinde ağaç olarak saklar; kalem numarası, miktar, birim, fire katsayısı, kesim ölçüleri, üret-ya-da-satın-al seçimi, stok malzemesi, geçerlilik tarihleri ve birim başına işçilik ve maliyet değerleriyle (
src/cluster_erp/modules/bom/bom_items/models.py:18-142). - Yeniden kullanılabilir şablonları bir taslak versiyona kopyalar (
src/cluster_erp/modules/bom/bom_versions/services.py:544-651). - Bir versiyonu etkin miktarlara ve kırılım başına bir toplama patlatır (
src/cluster_erp/modules/bom/bom_versions/services.py:722-820). - Gezgin ağacını, nerede kullanıldığı verisini ve bir satın alma kapsama özetini sunar (
src/cluster_erp/modules/bom/bom_versions/services.py:822-836,src/cluster_erp/modules/bom/bom_versions/services.py:1141-1151,src/cluster_erp/modules/bom/bom_versions/services.py:1519-1520). - Parçası olan bir tasarım onaylandığında ilk taslak versiyonuyla bir ürün ağacı kartı oluşturur (
src/cluster_erp/modules/bom/module.py:667-775).
Alt modüller¶
| Alt modül | Amaç | Ana varlıklar | Yönlendirici | Kaynak |
|---|---|---|---|---|
boms |
Ürün ağacı kartları | Bom |
/api/v1/bom/boms |
src/cluster_erp/modules/bom/boms/routes.py:31 |
bom_versions |
Versiyonlar, yaşam döngüsü, patlatma, ağaç, kapsama, nerede kullanıldığı | BomVersion |
/api/v1/bom/bom-versions |
src/cluster_erp/modules/bom/bom_versions/routes.py:26 |
bom_items |
Bir versiyonun kalemleri | BomItem |
/api/v1/bom/bom-items |
src/cluster_erp/modules/bom/bom_items/routes.py:31 |
bom_templates |
Şablonlar ve kalemleri | BomTemplate, BomTemplateItem |
/api/v1/bom/bom-templates |
src/cluster_erp/modules/bom/bom_templates/routes.py:29 |
Veri modeli¶
| Varlık | Tablo | Anahtar alanlar | Notlar | Kaynak |
|---|---|---|---|---|
Bom |
bom_boms |
bom_code, name, product_id, product_model_id, product_version_id, owner_design_id, base_quantity, usage_type, status, extra |
üç kırılım kimliği zorunlu | src/cluster_erp/modules/bom/boms/models.py:17-79 |
BomVersion |
bom_bom_versions |
bom_id, version_no, status, created_from_template_id, total_weight_kg, total_labor_min, total_material_cost, total_labor_cost, approved_by, approved_at, valid_from |
ürün ağacı başına bir canlı etkin versiyon; version_no ürün ağacı başına benzersiz |
src/cluster_erp/modules/bom/bom_versions/models.py:19-98 |
BomItem |
bom_bom_items |
bom_version_id, parent_item_id, part_id, part_model_id, part_version_id, find_number, qty, uom, level, effective_from, effective_to, cut_length_mm, cut_width_mm, sourcing, stock_material_id üçlüsü, scrap_factor, is_phantom, birim başına maliyet ve işçilik, source |
part_id bir ürün kimliğidir |
src/cluster_erp/modules/bom/bom_items/models.py:18-142 |
BomTemplate |
bom_bom_templates |
template_code, name, family, description |
src/cluster_erp/modules/bom/bom_templates/models.py:13-31 |
|
BomTemplateItem |
bom_bom_template_items |
template_id, parent_item_id, part_id, find_number, qty, uom, cut_length_mm, is_phantom |
model veya versiyon sütunu yok | src/cluster_erp/modules/bom/bom_templates/models.py:34-81 |
Miktarlar ve para Numeric türündedir: kalem miktarı Numeric(18, 4), maliyetler Numeric(18, 4), fire katsayısı Numeric(6, 4) (src/cluster_erp/modules/bom/bom_items/models.py:62-128). Ürün kimlikleri düz UUID sütunlarıdır; bom modülü bunları veritabanı yabancı anahtarlarıyla değil EventBus üzerinden denetler (src/cluster_erp/modules/bom/boms/services.py:203-213).
Ekranlar ve metadata¶
get_metadata dört bölümlü bir Ürün Ağacı Yönetimi (İngilizce BOM Management) kenar çubuğu grubu bildirir: Ürün Ağacı Gezgini (bom_explorer özel bileşeni), Ürün Ağaçları, Ürün Ağacı Versiyonları ve Ürün Ağacı Şablonları (src/cluster_erp/modules/bom/module.py:838-905). Gezgin sekmelerinin etiketleri Ürün Ağacı · BOM (webapp/i18n/tr.json anahtarı bom_explorer.tab.cs03) ve Operasyon Ürün Ağacı · eBOM (webapp/i18n/tr.json anahtarı bom_explorer.tab.ca03) olur. Ürün kartı üretilebilir ürünler için salt okunur bir Ürün Ağaçları sekmesi gösterir (src/cluster_erp/modules/products_and_services/products/metadata.py:276-285). Kapılı paketler kapılı uygulama paketleri, masaüstü gezgini masaüstü modül ekranları sayfasında anlatılır.
Durumlar ve aksiyonlar¶
Bir ürün ağacı kartı active veya archived olur; kullanım türü manufacturing, engineering veya costing olur (src/cluster_erp/modules/bom/boms/schemas.py:10-11). Bir versiyon draft durumundan active durumuna, oradan superseded durumuna geçer (src/cluster_erp/modules/bom/bom_versions/models.py:20-24).
| Aksiyon | Etiket | Koşul | Uç | İzin | Kaynak |
|---|---|---|---|---|---|
activate |
Aktifleştir | status değeri draft |
POST /bom-versions/{id}/activate |
bom.activate |
src/cluster_erp/modules/bom/bom_versions/metadata.py:48-58, src/cluster_erp/modules/bom/bom_versions/routes.py:145-154 |
copy_from_template |
Şablondan Kopyala | status değeri draft |
POST /bom-versions/{id}/copy-from-template |
bom.create |
src/cluster_erp/modules/bom/bom_versions/metadata.py:59-85, src/cluster_erp/modules/bom/bom_versions/routes.py:187-201 |
supersede |
Değiştir | status değeri active |
POST /bom-versions/{id}/supersede |
bom.activate |
src/cluster_erp/modules/bom/bom_versions/metadata.py:86-116, src/cluster_erp/modules/bom/bom_versions/routes.py:170-184 |
Şema bir versiyonun yaşam döngüsünü gösterir.
stateDiagram-v2 [*] --> draft: oluşturma, klonlama veya otomatik BOM draft --> active: activate active --> superseded: taslak bir ardılla supersede draft --> [*]: silme superseded --> [*]
Düz anlatımla: bir versiyon draft olarak oluşturulur (src/cluster_erp/modules/bom/bom_versions/services.py:231-274). activate, en az bir canlı kalemi olan ve ürün ağacında başka etkin versiyon bulunmayan bir taslak ister (src/cluster_erp/modules/bom/bom_versions/services.py:417-474). supersede tek çağrıda etkin versiyonu superseded yapar ve aynı ürün ağacının bir taslağını active yapar (src/cluster_erp/modules/bom/bom_versions/services.py:476-542). Yalnızca bir taslak silinebilir ve kalemleri de onunla gider (src/cluster_erp/modules/bom/bom_versions/services.py:305-333).
İş kuralları¶
- Bir ürün ağacı kartını oluşturmak veya değiştirmek, ürünün var olduğunu ve modelin ve versiyonun ona ait olduğunu denetler (
src/cluster_erp/modules/bom/boms/services.py:80-108,src/cluster_erp/modules/bom/boms/services.py:130-139). - Arşivlenmiş bir ürün ağacı yalnızca yeniden etkin yapılabilir (
src/cluster_erp/modules/bom/boms/services.py:120-124). - Etkin veya yerini almış versiyonu olan bir ürün ağacı silinemez; bir ürün ağacını silmek versiyonlarını ve kalemlerini geçici olarak siler (
src/cluster_erp/modules/bom/boms/services.py:159-176,src/cluster_erp/modules/bom/boms/services.py:215-267). - Kalemler yalnızca taslak bir versiyonda eklenebilir veya değiştirilebilir (
src/cluster_erp/modules/bom/bom_items/services.py:135-137). - Sıfır miktar reddedilir; negatif miktar bir ko-üründür (
src/cluster_erp/modules/bom/bom_items/services.py:139-146). - Her kalemin kırılımı doğrulanır; model ve versiyon olmadan verilen bir stok malzemesi ürünün varsayılanlarını alır (
src/cluster_erp/modules/bom/bom_items/services.py:91-128,src/cluster_erp/modules/bom/bom_items/services.py:158-169). - Kalem seviyesi üst kalem zincirinden gelir; zincir döngü yapamaz ve 10 olan
MAX_BOM_DEPTHdeğerinden derine inemez (src/cluster_erp/modules/bom/bom_items/services.py:32,src/cluster_erp/modules/bom/bom_items/services.py:430-470). - Eksik bir fire katsayısı 0.0300 olan
DEFAULT_SCRAP_FACTORdeğerini alır (src/cluster_erp/modules/bom/bom_items/services.py:33,src/cluster_erp/modules/bom/bom_items/services.py:180-181). cloneherhangi bir versiyonu sonraki versiyon numarasıyla ve tüm kalemleriyle yeni bir taslağa kopyalar (src/cluster_erp/modules/bom/bom_versions/services.py:335-415).- Versiyon toplamları: işçilik dakikaları ve işçilik maliyeti birim başına değerler çarpı miktardır; malzeme maliyeti birim maliyet çarpı miktar bölü bir eksi fire katsayısıdır; ağırlık, ürün ana verisinden yaprak kalemlerin net ağırlığını toplar (
src/cluster_erp/modules/bom/bom_versions/services.py:671-718). bom_codedeğeribomyıllık dizisinden,template_codedeğeribom_templatedizisinden gelir (src/cluster_erp/modules/bom/boms/services.py:89,src/cluster_erp/modules/bom/bom_templates/services.py:101).
Patlatma ve operasyon ürün ağacı¶
Şema bir ürün ağacı versiyonunun diğer modüllerin okuduğu patlatmaya nasıl dönüştüğünü ve rota iskeletinin ağacı nasıl okuduğunu gösterir.
flowchart TD V["BomVersion ve BomItem satırları"] --> F["_filter_effective(as_of)"] F --> Q["effective_qty = qty / (1 - fire), her üst kalemin qty / (1 - üst fire) değeriyle çarpılır"] Q --> A["production atamalarından operation_type ve work_center_id"] A --> R["parça, model, versiyon başına toplam"] R --> X["GetBomExplosion yanıtı"] X --> C["costing"] X --> P["production ve MRP"] V --> S["GetBomScaffoldTree yanıtı"] S --> W["production rota iskeleti"] W --> I["products_and_services modülüne CreateScaffoldIntermediate"]
Düz anlatımla: explosion bir versiyonun canlı kalemlerini yükler ve geçerlilik penceresi verilen tarihi içermeyen kalemleri tüm alt ağaçlarıyla düşürür (src/cluster_erp/modules/bom/bom_versions/services.py:136-159, src/cluster_erp/modules/bom/bom_versions/services.py:734-741). Her kalem için etkin miktar, miktarın bir eksi kendi fire katsayısına bölümüdür; sonra her üst kalemin miktarının bir eksi o üstün fire katsayısına bölümüyle çarpılır ve ROUND_HALF_EVEN ile dört basamağa yuvarlanır; negatif bir ko-ürün miktarı fire almaz (src/cluster_erp/modules/bom/bom_versions/services.py:128-133, src/cluster_erp/modules/bom/bom_versions/services.py:748-767). Operasyon türü ve iş merkezi production modülünün bileşen atamalarından gelir (src/cluster_erp/modules/bom/bom_versions/services.py:790-796). Toplam, etkin miktarları parça, model ve versiyon başına toplar (src/cluster_erp/modules/bom/bom_versions/services.py:798-820). Diğer modüller bunu GetBomExplosion ile ister (src/cluster_erp/modules/bom/module.py:217-228). Patlatma tek bir versiyon içindeki üst kalem bağlarını izler; gezgin tree ayrıca kendi etkin ürün ağacı olan kalemleri açar (src/cluster_erp/modules/bom/bom_versions/services.py:1141-1151).
Operasyon ürün ağacı için production modülünün rota iskeleti tam bir ürün kırılımıyla GetBomScaffoldTree sorar. bom modülü tam olarak o kırılımın etkin versiyonuyla veya adı verilen bir versiyonla ve çözülmüş üret-ya-da-satın-al bilgisiyle tüm canlı kalemleriyle yanıt verir; varsayılan bir kırılıma geri dönmez (src/cluster_erp/modules/bom/module.py:363-420, src/cluster_erp/modules/production/routings/scaffold.py:185-192). İskelet hayalet olmayan kalemleri son bir birleştirme operasyonunun girdilerine dönüştürür ve hayalet kalemlerin alt kalemlerini yukarı taşır; bu modül docstring'inde anlatılır (src/cluster_erp/modules/production/routings/scaffold.py:1-43). Bir rotanın bir operasyonunun çıktısı olduğunda iskelet, products_and_services modülünden CreateScaffoldIntermediate ile bir ara ürün oluşturmasını veya yeniden kullanmasını ister (src/cluster_erp/modules/production/routings/scaffold.py:2221-2239). Rota tarafı rotalar ve operasyon türleri sayfasında belgelenir.
Olaylar ve sorgular¶
Modül 15 sözleşme tüketir ve 14 sözleşme üretir; sayım parties modülü sayfasındaki gibi yapıldı. Tam liste sözleşmeler başvurusu sayfasındadır.
| Yön | Sözleşme sınıfı | İşleyici veya yayan | Kaynak |
|---|---|---|---|
| yayar | BomDraftCreated |
versiyon oluşturma, klonlama, otomatik BOM | src/cluster_erp/modules/bom/bom_versions/services.py:256-264, src/cluster_erp/modules/bom/bom_versions/services.py:406-414, src/cluster_erp/modules/bom/module.py:760-768 |
| yayar | BomActivated, BomVersionActivated |
activate, supersede |
src/cluster_erp/modules/bom/bom_versions/services.py:455-473, src/cluster_erp/modules/bom/bom_versions/services.py:523-541 |
| yayar | BomSuperseded |
supersede |
src/cluster_erp/modules/bom/bom_versions/services.py:515-522 |
| yayar | BomItemChanged |
kalem oluşturma, güncelleme ve taşıma | src/cluster_erp/modules/bom/bom_items/services.py:227, src/cluster_erp/modules/bom/bom_items/services.py:324, src/cluster_erp/modules/bom/bom_items/services.py:516 |
| sorgular | GetProductById, GetProductDefaultBreakdown, GetBulkProductDefaultBreakdowns, GetDesignById ve planlama okumaları |
servisler ve işleyiciler | src/cluster_erp/modules/bom/boms/services.py:204-206, src/cluster_erp/modules/bom/bom_versions/services.py:598-608, src/cluster_erp/modules/bom/module.py:686-688 |
| sorguyu yanıtlar | GetBomById, CreateBomForProduct, GetPartUsageCounts, IsBomActive, GetBomExplosion, GetActiveBomVersionForProduct, GetBomVersionsUpdatedAt, GetActiveBomItemsForProduct, GetBomScaffoldTree, GetBomItemDisplay, GetBomMaterials, GetBomVersionDisplay |
module.py içindeki işleyiciler |
src/cluster_erp/modules/bom/module.py:85-123 |
| abone olur | DesignApproved |
_handle_design_approved |
src/cluster_erp/modules/bom/module.py:124, src/cluster_erp/modules/bom/module.py:667-775 |
| abone olur | ProductDeleted |
_handle_product_deleted |
src/cluster_erp/modules/bom/module.py:125, src/cluster_erp/modules/bom/module.py:777-816 |
| abone olur | DescribeFieldConsumers |
_describe_field_consumers |
src/cluster_erp/modules/bom/module.py:65, src/cluster_erp/modules/bom/module.py:907-937 |
Aboneliklerin taşıdığı kurallar:
DesignApprovedolayında modül tasarımın parçasını okur, o ürünün varsayılan modelini ve versiyonunu alır ve tasarımın adını taşıyan, taslak versiyon 1'i olanactivebir ürün ağacı kartı oluşturur. Parçası olmayan bir tasarımı, zaten bir ürün ağacına sahip bir tasarımı ve varsayılan kırılımı olmayan bir ürünü atlar (src/cluster_erp/modules/bom/module.py:667-775).ProductDeletedolayında modül silinen ürünün yalnızca taslak versiyonlardaki kalemlerini geçici olarak siler; etkin ve yerini almış versiyonlar satırlarını korur (src/cluster_erp/modules/bom/module.py:777-816).
Yetkiler¶
| İzin anahtarı | Kullanan | Kaynak |
|---|---|---|
bom.read |
her okuma ucu | src/cluster_erp/modules/bom/boms/routes.py:51-99, src/cluster_erp/modules/bom/bom_versions/routes.py:35-295, src/cluster_erp/modules/bom/bom_items/routes.py:61-219, src/cluster_erp/modules/bom/bom_templates/routes.py:38-146 |
bom.create |
oluşturma, güncelleme, silme, toplu silme, klonlama, şablondan kopyalama, yeniden hesaplama, kalem taşıma | src/cluster_erp/modules/bom/boms/routes.py:131-170, src/cluster_erp/modules/bom/bom_versions/routes.py:109-207, src/cluster_erp/modules/bom/bom_items/routes.py:233-293, src/cluster_erp/modules/bom/bom_templates/routes.py:107-199 |
bom.activate |
etkinleştirme ve yerine geçirme | src/cluster_erp/modules/bom/bom_versions/routes.py:148, src/cluster_erp/modules/bom/bom_versions/routes.py:174 |
Gizlilik, saklama ve geçmiş¶
Modül kişisel veri saklamaz ve privacy_handlers.py dosyası yoktur. Silme baştan sona geçicidir ve versiyon ile kalem silmeleri aynı aktörle zincirlenir (src/cluster_erp/modules/bom/boms/services.py:215-249). Değişiklikler değişiklik geçmişi tarafından kaydedilir.
Analitik olguları¶
Bu modülün analytics_facts.py dosyası yoktur.
Ayarlar ve başvuru verileri¶
Modülün ayarlar bölümü yoktur. Stoktan işlenen kalemler için stok birimi hesabı, kesim payı, levha aralığı ve kenar payı ayarlarını core/stock_conversion.py üzerinden okur (src/cluster_erp/modules/bom/bom_versions/services.py:95-125); bkz. ürün kırılımı ve stok dönüşümü.
Testler¶
tests/ içinde modules.bom 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 |
birim seçicileri, kalem birimi, versiyon toplamları formülü, metadata biçimi (10 test) |
| pytest | tests/test_record_links.py |
ürün ağacı metadata'sındaki kayıt bağlantıları (3 test) |
| e2e | web-client/_e2e_bom_app.mjs |
ürün ağacı uygulaması: gezgin ve kayıt listeleri |
| e2e | web-client/_e2e_bom_me2m.mjs, web-client/_e2e_bom_me2m_matrix.mjs |
satın alma kapsama sekmesi ve hesabı |
| e2e | web-client/_e2e_bom_open_in_explorer.mjs |
bir ürün ağacını ürün kartından gezginde açma |
| e2e | web-client/_e2e_ebom_scaffold.mjs, web-client/_e2e_ebom_wizard.mjs, web-client/_e2e_ebom_operation_staging.mjs |
ürün ağacını okuyan rota iskeleti |
| e2e | web-client/_e2e_bom_bugfix_batch.mjs |
tarayıcıda ürün ağacı formları |
Tutarsızlıklar¶
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| bill of materials | Bom |
Bir yapının inşa ettiği ürün kırılımını belirten kart. | Ürün ağacı | src/cluster_erp/modules/bom/boms/models.py:17 |
| BOM version | BomVersion |
Bir ürün ağacı yapısının yaşam döngüsü olan numaralı anlık görüntüsü. | Ürün ağacı versiyonu | src/cluster_erp/modules/bom/bom_versions/models.py:19 |
| BOM item | BomItem |
Bir ürün ağacı versiyonunun tek bir pozisyonu. | Ürün ağacı kalemi | src/cluster_erp/modules/bom/bom_items/models.py:18 |
| explosion | explosion |
Etkin miktarları ve kırılım başına toplamı olan düz kalem listesi. | Patlatma | src/cluster_erp/modules/bom/bom_versions/services.py:722 |
| effective quantity | effective_qty |
Fire ve üst kalem çarpımından sonra bitmiş birim başına miktar. | Etkin miktar | src/cluster_erp/modules/bom/bom_versions/services.py:748-767 |
| co-product | negatif qty |
Negatif miktarlı, beklenen bir çıktı olan ürün ağacı kalemi. | Ko-ürün | src/cluster_erp/modules/bom/bom_items/services.py:139-146 |
| phantom item | is_phantom |
Alt kalemleri çarpılmış talebi taşıdığı için kapsamanın atladığı kalem. | Hayalet kalem | src/cluster_erp/modules/bom/bom_versions/services.py:830-831 |
İlgili sayfalar¶
- Modüller dizini
- Products and services modülü
- Design engineering modülü
- Costing modülü
- Production modülü
- Ürün kırılımı ve stok dönüşümü
- Bu modülün API başvurusu
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.