diff --git a/backend/api/v1/modules/a76/items/line_items/models.py b/backend/api/v1/modules/a76/items/line_items/models.py
index 6ac7bee0..a7603d11 100644
--- a/backend/api/v1/modules/a76/items/line_items/models.py
+++ b/backend/api/v1/modules/a76/items/line_items/models.py
@@ -40,11 +40,11 @@ class LineItem(Base, TenantScopedMixin, TimestampMixin):
line_number: Mapped[int] = mapped_column(Integer) # LINEAIMPO/LINEAEXPO/LINEA
# Part identification
- part_number: Mapped[Optional[str]] = mapped_column(
- ForeignKey("a76.parts.id")
+ part_number: Mapped[Optional[int]] = mapped_column(
+ Integer, ForeignKey("a76.parts.id")
) # NUMPARTE
- component_part_number: Mapped[Optional[str]] = mapped_column(
- ForeignKey("a76.parts.id")
+ component_part_number: Mapped[Optional[int]] = mapped_column(
+ Integer, ForeignKey("a76.parts.id")
) # NUMPARTECOM
class_id: Mapped[Optional[int]] = mapped_column(
ForeignKey("a76.classes.id")
diff --git a/backend/api/v1/modules/a76/items/line_items/schemas.py b/backend/api/v1/modules/a76/items/line_items/schemas.py
index 0bea3647..725ff80f 100644
--- a/backend/api/v1/modules/a76/items/line_items/schemas.py
+++ b/backend/api/v1/modules/a76/items/line_items/schemas.py
@@ -44,12 +44,16 @@ from api.v1.modules.a24.fa.fa_item_lines.dto import (
class LineItemBase(BaseModel):
"""Base schema for line items"""
+ model_config = ConfigDict(populate_by_name=True)
+
line_number: int = Field(..., description="Line number")
# Part identification
- part_number_id: Optional[int] = Field(None, description="Part number")
+ part_number_id: Optional[int] = Field(
+ None, description="Part number", alias="part_number", serialization_alias="part_number_id"
+ )
component_part_number_id: Optional[int] = Field(
- None, description="Component part number"
+ None, description="Component part number", alias="component_part_number", serialization_alias="component_part_number_id"
)
class_id: Optional[int] = Field(None, description="Class code")
@@ -257,6 +261,12 @@ class LineItemResponse(LineItemBase):
if hasattr(data, key):
result[key] = getattr(data, key)
+ # Map model field names to schema field names for aliased fields
+ if hasattr(data, "part_number"):
+ result["part_number_id"] = data.part_number
+ if hasattr(data, "component_part_number"):
+ result["component_part_number_id"] = data.component_part_number
+
# Extract class info
if hasattr(data, "class_info") and data.class_info is not None:
result["class_code"] = data.class_info.class_code
diff --git a/backend/api/v1/modules/a76/items/service.py b/backend/api/v1/modules/a76/items/service.py
index 2866fb3d..db983fd5 100644
--- a/backend/api/v1/modules/a76/items/service.py
+++ b/backend/api/v1/modules/a76/items/service.py
@@ -269,6 +269,12 @@ class ItemService:
line_dict["tenant_id"] = tenant_id
line_dict["company_id"] = company_id
+ # Map schema field names to model field names
+ if "part_number_id" in line_dict:
+ line_dict["part_number"] = line_dict.pop("part_number_id")
+ if "component_part_number_id" in line_dict:
+ line_dict["component_part_number"] = line_dict.pop("component_part_number_id")
+
# Create line item
db_line = LineItem(**line_dict)
db.add(db_line)
@@ -485,6 +491,12 @@ class ItemService:
line_dict["tenant_id"] = tenant_id
line_dict["company_id"] = company_id
+ # Map schema field names to model field names
+ if "part_number_id" in line_dict:
+ line_dict["part_number"] = line_dict.pop("part_number_id")
+ if "component_part_number_id" in line_dict:
+ line_dict["component_part_number"] = line_dict.pop("component_part_number_id")
+
db_line = LineItem(**line_dict)
db.add(db_line)
db.flush()
diff --git a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/item-configuration.svelte b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/item-configuration.svelte
index 34333daa..831d2739 100644
--- a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/item-configuration.svelte
+++ b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/item-configuration.svelte
@@ -2,6 +2,9 @@
import * as RadioGroup from '$lib/components/ui/radio-group';
import { Input } from '$lib/components/ui/input';
import { Label } from '$lib/components/ui/label';
+ import { Button } from '$lib/components/ui/button';
+ import { Folder } from 'lucide-svelte';
+ import PartNumberDialog from './part-number-dialog.svelte';
import type { LineItem, LineDescriptions } from '$lib/api/dashboard/a76/items';
let {
@@ -12,6 +15,8 @@
descriptions: LineDescriptions;
} = $props();
+ let showPartDialog = $state(false);
+
// Initialize fa_data for fixed asset system
if (!lineItem.fa_data) {
lineItem.fa_data = {};
@@ -29,8 +34,18 @@
if (!lineItem.fa_data) lineItem.fa_data = {};
lineItem.fa_data.contains_subitems = val === 'si';
}
+
+ function handlePartSelect(part: any) {
+ lineItem.part_number_id = part.id;
+ // Store part number for display
+ (lineItem as any).part_number = part.part_number;
+ (lineItem as any).part_description_es = part.description_spanish;
+ (lineItem as any).part_description_en = part.description_english;
+ }
+
+
@@ -72,11 +87,32 @@