Initial import of AbelBirdNest Stock
This commit is contained in:
441
docs/project-spec/walet-erd-dbml.dbml
Normal file
441
docs/project-spec/walet-erd-dbml.dbml
Normal file
@ -0,0 +1,441 @@
|
||||
Project walet_inventory {
|
||||
database_type: "PostgreSQL"
|
||||
Note: 'ERD importable schema for lot-based traceable walet inventory system'
|
||||
}
|
||||
|
||||
Table suppliers {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
phone varchar
|
||||
email varchar
|
||||
bank_name varchar
|
||||
bank_account_number varchar
|
||||
address text
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table customers {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
phone varchar
|
||||
email varchar
|
||||
bank_name varchar
|
||||
bank_account_number varchar
|
||||
address text
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table roles {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table users {
|
||||
id bigint [pk, increment]
|
||||
role_id bigint [not null]
|
||||
name varchar [not null]
|
||||
email varchar
|
||||
phone varchar
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table units {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table item_types {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
description text
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table item_grades {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
rank_order int
|
||||
description text
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table warehouses {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
address text
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table warehouse_locations {
|
||||
id bigint [pk, increment]
|
||||
warehouse_id bigint [not null]
|
||||
code varchar [not null]
|
||||
name varchar [not null]
|
||||
location_type varchar
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
|
||||
indexes {
|
||||
(warehouse_id, code) [unique]
|
||||
}
|
||||
}
|
||||
|
||||
Table adjustment_reasons {
|
||||
id bigint [pk, increment]
|
||||
code varchar [not null, unique]
|
||||
name varchar [not null]
|
||||
category varchar [not null]
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table purchases {
|
||||
id bigint [pk, increment]
|
||||
purchase_no varchar [not null, unique]
|
||||
supplier_id bigint [not null]
|
||||
purchase_date date [not null]
|
||||
supplier_invoice_no varchar
|
||||
status varchar [not null, default: 'DRAFT']
|
||||
notes text
|
||||
created_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table purchase_lines {
|
||||
id bigint [pk, increment]
|
||||
purchase_id bigint [not null]
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint
|
||||
qty_ordered decimal(18,3) [not null]
|
||||
unit_id bigint [not null]
|
||||
unit_price decimal(18,2) [not null]
|
||||
subtotal decimal(18,2) [not null]
|
||||
classification_status varchar [not null, default: 'FINAL']
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table receipts {
|
||||
id bigint [pk, increment]
|
||||
receipt_no varchar [not null, unique]
|
||||
purchase_id bigint [not null]
|
||||
supplier_id bigint [not null]
|
||||
receipt_date date [not null]
|
||||
status varchar [not null, default: 'DRAFT']
|
||||
notes text
|
||||
received_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table receipt_lines {
|
||||
id bigint [pk, increment]
|
||||
receipt_id bigint [not null]
|
||||
purchase_line_id bigint [not null]
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint
|
||||
qty_received decimal(18,3) [not null]
|
||||
qty_accepted decimal(18,3) [not null]
|
||||
qty_rejected decimal(18,3) [not null, default: 0]
|
||||
unit_id bigint [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table inventory_lots {
|
||||
id bigint [pk, increment]
|
||||
lot_code varchar [not null, unique]
|
||||
parent_lot_id bigint
|
||||
source_type varchar [not null]
|
||||
source_ref_id bigint
|
||||
supplier_id bigint
|
||||
purchase_id bigint
|
||||
purchase_line_id bigint
|
||||
receipt_id bigint
|
||||
receipt_line_id bigint
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint [not null]
|
||||
warehouse_id bigint [not null]
|
||||
warehouse_location_id bigint
|
||||
original_qty decimal(18,3) [not null]
|
||||
available_qty decimal(18,3) [not null]
|
||||
reserved_qty decimal(18,3) [not null, default: 0]
|
||||
damaged_qty decimal(18,3) [not null, default: 0]
|
||||
shrinkage_qty decimal(18,3) [not null, default: 0]
|
||||
unit_id bigint [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
received_at timestamp [not null]
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
qr_code_value varchar
|
||||
barcode_value varchar
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
|
||||
indexes {
|
||||
(item_type_id, item_grade_id, warehouse_id)
|
||||
(supplier_id, item_type_id, item_grade_id)
|
||||
}
|
||||
}
|
||||
|
||||
Table sorting_sessions {
|
||||
id bigint [pk, increment]
|
||||
sorting_no varchar [not null, unique]
|
||||
source_lot_id bigint [not null]
|
||||
sorting_date timestamp [not null]
|
||||
input_qty decimal(18,3) [not null]
|
||||
output_qty decimal(18,3) [not null]
|
||||
shrinkage_qty decimal(18,3) [not null, default: 0]
|
||||
notes text
|
||||
sorted_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sorting_results {
|
||||
id bigint [pk, increment]
|
||||
sorting_session_id bigint [not null]
|
||||
result_lot_id bigint [not null]
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint [not null]
|
||||
qty_result decimal(18,3) [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sales {
|
||||
id bigint [pk, increment]
|
||||
sales_no varchar [not null, unique]
|
||||
customer_id bigint [not null]
|
||||
sales_date date [not null]
|
||||
status varchar [not null, default: 'DRAFT']
|
||||
notes text
|
||||
created_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sales_lines {
|
||||
id bigint [pk, increment]
|
||||
sales_id bigint [not null]
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint [not null]
|
||||
qty_sold decimal(18,3) [not null]
|
||||
unit_id bigint [not null]
|
||||
selling_price decimal(18,2) [not null]
|
||||
subtotal decimal(18,2) [not null]
|
||||
costing_total decimal(18,2) [not null, default: 0]
|
||||
gross_margin decimal(18,2) [not null, default: 0]
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sales_allocations {
|
||||
id bigint [pk, increment]
|
||||
sales_line_id bigint [not null]
|
||||
inventory_lot_id bigint [not null]
|
||||
qty_allocated decimal(18,3) [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
total_cost decimal(18,2) [not null]
|
||||
allocated_at timestamp [not null]
|
||||
allocated_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table inventory_movements {
|
||||
id bigint [pk, increment]
|
||||
movement_no varchar [not null, unique]
|
||||
movement_type varchar [not null]
|
||||
inventory_lot_id bigint [not null]
|
||||
related_lot_id bigint
|
||||
warehouse_id bigint [not null]
|
||||
warehouse_location_id bigint
|
||||
qty_in decimal(18,3) [not null, default: 0]
|
||||
qty_out decimal(18,3) [not null, default: 0]
|
||||
balance_after decimal(18,3) [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
reference_type varchar [not null]
|
||||
reference_id bigint [not null]
|
||||
reason_id bigint
|
||||
movement_date timestamp [not null]
|
||||
created_by bigint [not null]
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sales_returns {
|
||||
id bigint [pk, increment]
|
||||
sales_id bigint [not null]
|
||||
customer_id bigint [not null]
|
||||
return_date date [not null]
|
||||
status varchar [not null, default: 'DRAFT']
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table sales_return_lines {
|
||||
id bigint [pk, increment]
|
||||
sales_return_id bigint [not null]
|
||||
sales_line_id bigint [not null]
|
||||
inventory_lot_id bigint
|
||||
item_type_id bigint [not null]
|
||||
item_grade_id bigint [not null]
|
||||
qty_returned decimal(18,3) [not null]
|
||||
return_condition varchar
|
||||
resolution varchar
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table purchase_returns {
|
||||
id bigint [pk, increment]
|
||||
purchase_id bigint [not null]
|
||||
supplier_id bigint [not null]
|
||||
return_date date [not null]
|
||||
status varchar [not null, default: 'DRAFT']
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table purchase_return_lines {
|
||||
id bigint [pk, increment]
|
||||
purchase_return_id bigint [not null]
|
||||
inventory_lot_id bigint [not null]
|
||||
qty_returned decimal(18,3) [not null]
|
||||
unit_cost decimal(18,2) [not null]
|
||||
notes text
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table stock_adjustments {
|
||||
id bigint [pk, increment]
|
||||
adjustment_no varchar [not null, unique]
|
||||
inventory_lot_id bigint [not null]
|
||||
adjustment_type varchar [not null]
|
||||
reason_id bigint [not null]
|
||||
qty_before decimal(18,3) [not null]
|
||||
qty_change decimal(18,3) [not null]
|
||||
qty_after decimal(18,3) [not null]
|
||||
cost_impact decimal(18,2) [not null, default: 0]
|
||||
adjustment_date timestamp [not null]
|
||||
notes text
|
||||
created_by bigint [not null]
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Table lot_labels {
|
||||
id bigint [pk, increment]
|
||||
inventory_lot_id bigint [not null]
|
||||
label_type varchar [not null]
|
||||
label_value varchar [not null]
|
||||
printed_at timestamp
|
||||
printed_by bigint
|
||||
print_count int [not null, default: 0]
|
||||
status varchar [not null, default: 'ACTIVE']
|
||||
created_at timestamp [not null]
|
||||
updated_at timestamp [not null]
|
||||
}
|
||||
|
||||
Ref: users.role_id > roles.id
|
||||
Ref: warehouse_locations.warehouse_id > warehouses.id
|
||||
Ref: purchases.supplier_id > suppliers.id
|
||||
Ref: purchases.created_by > users.id
|
||||
Ref: purchase_lines.purchase_id > purchases.id
|
||||
Ref: purchase_lines.item_type_id > item_types.id
|
||||
Ref: purchase_lines.item_grade_id > item_grades.id
|
||||
Ref: purchase_lines.unit_id > units.id
|
||||
Ref: receipts.purchase_id > purchases.id
|
||||
Ref: receipts.supplier_id > suppliers.id
|
||||
Ref: receipts.received_by > users.id
|
||||
Ref: receipt_lines.receipt_id > receipts.id
|
||||
Ref: receipt_lines.purchase_line_id > purchase_lines.id
|
||||
Ref: receipt_lines.item_type_id > item_types.id
|
||||
Ref: receipt_lines.item_grade_id > item_grades.id
|
||||
Ref: receipt_lines.unit_id > units.id
|
||||
Ref: inventory_lots.parent_lot_id > inventory_lots.id
|
||||
Ref: inventory_lots.supplier_id > suppliers.id
|
||||
Ref: inventory_lots.purchase_id > purchases.id
|
||||
Ref: inventory_lots.purchase_line_id > purchase_lines.id
|
||||
Ref: inventory_lots.receipt_id > receipts.id
|
||||
Ref: inventory_lots.receipt_line_id > receipt_lines.id
|
||||
Ref: inventory_lots.item_type_id > item_types.id
|
||||
Ref: inventory_lots.item_grade_id > item_grades.id
|
||||
Ref: inventory_lots.warehouse_id > warehouses.id
|
||||
Ref: inventory_lots.warehouse_location_id > warehouse_locations.id
|
||||
Ref: inventory_lots.unit_id > units.id
|
||||
Ref: sorting_sessions.source_lot_id > inventory_lots.id
|
||||
Ref: sorting_sessions.sorted_by > users.id
|
||||
Ref: sorting_results.sorting_session_id > sorting_sessions.id
|
||||
Ref: sorting_results.result_lot_id > inventory_lots.id
|
||||
Ref: sorting_results.item_type_id > item_types.id
|
||||
Ref: sorting_results.item_grade_id > item_grades.id
|
||||
Ref: sales.customer_id > customers.id
|
||||
Ref: sales.created_by > users.id
|
||||
Ref: sales_lines.sales_id > sales.id
|
||||
Ref: sales_lines.item_type_id > item_types.id
|
||||
Ref: sales_lines.item_grade_id > item_grades.id
|
||||
Ref: sales_lines.unit_id > units.id
|
||||
Ref: sales_allocations.sales_line_id > sales_lines.id
|
||||
Ref: sales_allocations.inventory_lot_id > inventory_lots.id
|
||||
Ref: sales_allocations.allocated_by > users.id
|
||||
Ref: inventory_movements.inventory_lot_id > inventory_lots.id
|
||||
Ref: inventory_movements.related_lot_id > inventory_lots.id
|
||||
Ref: inventory_movements.warehouse_id > warehouses.id
|
||||
Ref: inventory_movements.warehouse_location_id > warehouse_locations.id
|
||||
Ref: inventory_movements.reason_id > adjustment_reasons.id
|
||||
Ref: inventory_movements.created_by > users.id
|
||||
Ref: sales_returns.sales_id > sales.id
|
||||
Ref: sales_returns.customer_id > customers.id
|
||||
Ref: sales_return_lines.sales_return_id > sales_returns.id
|
||||
Ref: sales_return_lines.sales_line_id > sales_lines.id
|
||||
Ref: sales_return_lines.inventory_lot_id > inventory_lots.id
|
||||
Ref: sales_return_lines.item_type_id > item_types.id
|
||||
Ref: sales_return_lines.item_grade_id > item_grades.id
|
||||
Ref: purchase_returns.purchase_id > purchases.id
|
||||
Ref: purchase_returns.supplier_id > suppliers.id
|
||||
Ref: purchase_return_lines.purchase_return_id > purchase_returns.id
|
||||
Ref: purchase_return_lines.inventory_lot_id > inventory_lots.id
|
||||
Ref: stock_adjustments.inventory_lot_id > inventory_lots.id
|
||||
Ref: stock_adjustments.reason_id > adjustment_reasons.id
|
||||
Ref: stock_adjustments.created_by > users.id
|
||||
Ref: lot_labels.inventory_lot_id > inventory_lots.id
|
||||
Ref: lot_labels.printed_by > users.id
|
||||
Reference in New Issue
Block a user