Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions csfunctions/events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from pydantic import Field

from .bom_item_field_calculation import BOMItemFieldCalculationData, BOMItemFieldCalculationEvent
from .custom_operations import (
CustomOperationDocumentData,
CustomOperationDocumentEvent,
Expand Down Expand Up @@ -37,6 +38,7 @@
| PartReleasedEvent
| PartReleaseCheckEvent
| PartFieldCalculationEvent
| BOMItemFieldCalculationEvent
| FieldValueCalculationEvent
| DummyEvent
| EngineeringChangeReleasedEvent
Expand All @@ -59,6 +61,7 @@
| PartReleasedData
| PartReleaseCheckData
| PartFieldCalculationData
| BOMItemFieldCalculationData
| FieldValueCalculationData
| DummyEventData
| EngineeringChangeReleasedData
Expand All @@ -81,6 +84,7 @@
"PartReleasedEvent",
"PartReleaseCheckEvent",
"PartFieldCalculationEvent",
"BOMItemFieldCalculationEvent",
"FieldValueCalculationEvent",
"DummyEvent",
"EngineeringChangeReleasedEvent",
Expand All @@ -91,6 +95,7 @@
"DocumentFieldCalculationData",
"PartReleasedData",
"PartReleaseCheckData",
"BOMItemFieldCalculationData",
"FieldValueCalculationData",
"DummyEventData",
"EngineeringChangeReleasedData",
Expand Down
1 change: 1 addition & 0 deletions csfunctions/events/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class EventNames(str, Enum):
PART_RELEASED = "part_released"
PART_RELEASE_CHECK = "part_release_check"
PART_FIELD_CALCULATION = "part_field_calculation"
BOM_ITEM_FIELD_CALCULATION = "bom_item_field_calculation"
ENGINEERING_CHANGE_RELEASED = "engineering_change_released"
ENGINEERING_CHANGE_RELEASE_CHECK = "engineering_change_release_check"
FIELD_VALUE_CALCULATION = "field_value_calculation"
Expand Down
20 changes: 20 additions & 0 deletions csfunctions/events/bom_item_field_calculation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Literal

from pydantic import BaseModel, Field

from csfunctions.objects import BOMItem, Part
from csfunctions.objects.document import Document

from .base import BaseEvent, EventNames


class BOMItemFieldCalculationData(BaseModel):
bom_item: BOMItem = Field(..., description="Current state of the BOM item")
action: Literal["create", "modify", "copy", "index"] = Field(..., description="Action being performed")
part: Part = Field(..., description="Part of the BOM item")
documents: list[Document] = Field(..., description="List of documents that are referenced by the part.")


class BOMItemFieldCalculationEvent(BaseEvent):
name: Literal[EventNames.BOM_ITEM_FIELD_CALCULATION] = EventNames.BOM_ITEM_FIELD_CALCULATION
data: BOMItemFieldCalculationData
138 changes: 138 additions & 0 deletions csfunctions/objects/part.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ class Material(BaseObject):
class BOMItem(BaseObject):
object_type: Literal[ObjectType.BOM_ITEM] = ObjectType.BOM_ITEM

cdb_object_id: str | None = Field(None, description="Object ID")

baugruppe: str | None = Field(None, description="Assembly")
b_index: str | None = Field(None, description="Assembly Index")
component_materialnr_erp: str | None = Field(None, description="Material Number ERP Component")
Expand All @@ -247,3 +249,139 @@ class BOMItem(BaseObject):
mengeneinheit: str | None = Field(None, description="Unit of Measure")
teilenummer: str = Field(..., description="part number")
t_index: str = Field(..., description="part index")

# Custom Char Fields
cca_char_bom_item_1: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_2: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_3: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_4: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_5: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_6: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_7: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_8: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_9: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_10: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_11: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_12: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_13: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_14: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_15: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_16: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_17: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_18: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_19: str | None = Field(None, description="Custom Char Field")
cca_char_bom_item_20: str | None = Field(None, description="Custom Char Field")
# Custom BigChar Fields
cca_bigchar_bom_item_1: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_2: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_3: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_4: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_5: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_6: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_7: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_8: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_9: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_10: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_11: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_12: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_13: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_14: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_15: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_16: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_17: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_18: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_19: str | None = Field(None, description="Custom BigChar Field")
cca_bigchar_bom_item_20: str | None = Field(None, description="Custom BigChar Field")
# Custom Integer Fields
cca_integer_bom_item_1: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_2: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_3: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_4: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_5: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_6: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_7: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_8: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_9: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_10: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_11: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_12: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_13: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_14: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_15: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_16: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_17: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_18: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_19: int | None = Field(None, description="Custom Integer Field")
cca_integer_bom_item_20: int | None = Field(None, description="Custom Integer Field")
# Custom Float Fields
cca_float_bom_item_1: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_2: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_3: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_4: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_5: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_6: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_7: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_8: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_9: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_10: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_11: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_12: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_13: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_14: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_15: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_16: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_17: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_18: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_19: float | None = Field(None, description="Custom Float Field")
cca_float_bom_item_20: float | None = Field(None, description="Custom Float Field")
# Custom Boolean Fields
cca_bool_bom_item_1: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_2: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_3: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_4: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_5: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_6: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_7: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_8: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_9: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_10: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_11: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_12: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_13: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_14: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_15: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_16: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_17: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_18: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_19: bool | None = Field(None, description="Custom Boolean Field")
cca_bool_bom_item_20: bool | None = Field(None, description="Custom Boolean Field")
# Custom Date Fields
cca_date_bom_item_1: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_2: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_3: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_4: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_5: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_6: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_7: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_8: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_9: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_10: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_11: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_12: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_13: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_14: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_15: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_16: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_17: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_18: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_19: datetime | None = Field(None, description="Custom Date Field")
cca_date_bom_item_20: datetime | None = Field(None, description="Custom Date Field")

part: Part | None = Field(None, description="Part of the BOM item", exclude=True)

def link_objects(self, data: "EventData"):
parts = get_items_of_type(data, Part)
for part in parts:
if part.teilenummer == self.teilenummer and part.t_index == self.t_index:
self.part = part
break
2 changes: 2 additions & 0 deletions csfunctions/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@ def get_items_of_type(model: BaseModel, target_type: type[T]) -> list[T]:
for item in attr:
if isinstance(item, target_type):
items.append(item)
elif isinstance(attr, target_type):
items.append(attr)
return items
19 changes: 19 additions & 0 deletions docs/reference/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,25 @@ The event expects a DataResponse containing a dictionary of field names and thei
| documents | list[[Document](objects.md#document)] | List of documents that belong to the part |


## BOMItemFieldCalculationEvent
`csfunctions.events.BOMItemFieldCalculationEvent`

This event is fired when a BOM item is created, modified, copied or indexed. It is triggered after the field calculations defined in the datasheet editor are performed.

The event expects a DataResponse containing a dictionary of field names and their new values. Fields that are not mentioned in the response are not updated.

**BOMItemFieldCalculationEvent.name:** bom_item_field_calculation

**BOMItemFieldCalculationEvent.data:**

| Attribute | Type | Description |
| --------- | -------------------------------------------- | -------------------------------------------------- |
| bom_item | [BOMItem](objects.md#bomitem) | Current state of the BOM item |
| action | Literal["create", "modify", "copy", "index"] | Action being performed |
| part | [Part](objects.md#part) | Part of the BOM item |
| documents | list[[Document](objects.md#document)] | List of documents that are referenced by the part. |


## WorkflowTaskTriggerEvent
`csfunctions.events.WorkflowTaskTriggerEvent`

Expand Down
Loading
Loading