Skip to content

Inventory Schema

Schema inventory chứa 12 model quản lý mức tồn kho, theo dõi kho, đơn mua hàng, quan hệ nhà cung cấp, và công thức bill-of-materials với theo dõi nguyên vật liệu thô. Nó hỗ trợ kho hàng đa vị trí với nhật ký kiểm toán chi tiết.

Nguồn: packages/core/src/models/schemas/inventory/

Tổng quan Model

ModelTên BảngMô tả
InventoryLocationinventory.InventoryLocationVị trí lưu trữ vật lý hoặc logic
InventoryIteminventory.InventoryItemHàng hóa có thể theo dõi liên kết với biến thể sản phẩm hoặc nguyên vật liệu
InventoryStockinventory.InventoryStockSố lượng tồn kho cho một hàng hóa
InventoryTrackinginventory.InventoryTrackingNhật ký kiểm toán tất cả biến động kho
InventoryTrackingTypeinventory.InventoryTrackingTypePhân loại biến động theo dõi
PurchaseOrderinventory.PurchaseOrderĐơn mua hàng từ nhà cung cấp
PurchaseOrderIteminventory.PurchaseOrderItemMục hàng trong đơn mua hàng
Vendorinventory.VendorThông tin nhà cung cấp
Materialinventory.MaterialNguyên vật liệu thô và bán thành phẩm dùng trong công thức bill-of-materials
MaterialIdentifierinventory.MaterialIdentifierĐịnh danh theo scheme (SKU, BARCODE, QRCODE, ...) gắn với một Material
MaterialRecipeinventory.MaterialRecipeCông thức bill-of-materials được đánh phiên bản, gắn với một principal (thường là ProductVariant)
MaterialRecipeIteminventory.MaterialRecipeItemMột dòng trong MaterialRecipe: một Material được tiêu thụ với số lượng cho trước

InventoryLocation

Vị trí lưu trữ vật lý hoặc logic với hỗ trợ phân cấp.

CộtKiểuRàng buộcMô tả
identifiertextNOT NULL, UNIQUETự động tạo (ví dụ: LOC_20260216_...)
namejsonb (i18n)NOT NULLTên đa ngôn ngữ
statustextNOT NULL, DEFAULT NEWTrạng thái vị trí (NEW, ACTIVATED, DEACTIVATED, ARCHIVED)
locationjsonb (ILocation)Địa chỉ vật lý và tọa độ
is_defaultbooleanNOT NULL, DEFAULT falseCó phải vị trí mặc định hay không
merchant_idtextNOT NULLFK đến Merchant
parent_idtextFK đến InventoryLocation cha
+ các cột chungid, createdAt, modifiedAt, deletedAt, metadata

InventoryItem

Hàng hóa có thể theo dõi liên kết với principal thông qua tham chiếu đa hình. Principal có thể là Product, ProductVariant, hoặc Material; mặc định là ProductVariant.

CộtKiểuRàng buộcMô tả
item_typetextLoại thực thể đa hình: Product, ProductVariant, hoặc Material (mặc định: ProductVariant)
item_idtextID thực thể đa hình
identifiertextNOT NULL, UNIQUETự động tạo (ví dụ: SKU_20260216_...)
statustextNOT NULL, DEFAULT ACTIVATEDTrạng thái hàng hóa (ACTIVATED, DEACTIVATED, ARCHIVED)
min_stock_leveldecimal(15,4)Ngưỡng tồn kho tối thiểu
max_stock_leveldecimal(15,4)Ngưỡng tồn kho tối đa
base_unittextNOT NULLĐơn vị đo lường cơ bản
inventory_location_idtextNOT NULLFK đến InventoryLocation
+ các cột chung

InventoryStock

Số lượng tồn kho cho một hàng hóa. Theo dõi tồn kho thực tế, đã đặt trước, và khả dụng.

CộtKiểuRàng buộcMô tả
quantity_on_handdecimal(15,4)NOT NULL, DEFAULT '0'Tổng tồn kho vật lý
quantity_reserveddecimal(15,4)NOT NULL, DEFAULT '0'Đã phân bổ cho đơn hàng
quantity_availabledecimal(15,4)NOT NULL, DEFAULT '0'Khả dụng để bán (thực tế - đặt trước)
last_counted_atisoTimestampThời gian kiểm kê vật lý lần cuối
last_stocked_atisoTimestampThời gian nhập kho lần cuối
inventory_item_idtextNOT NULLFK đến InventoryItem
+ các cột chung

InventoryTracking

Bản ghi nhật ký kiểm toán ghi lại mọi biến động kho với số lượng trước/sau.

CộtKiểuRàng buộcMô tả
reference_idtextID thực thể tham chiếu (ví dụ: ID SaleOrder, ID PurchaseOrder)
reference_typetextLoại thực thể tham chiếu
uomtextNOT NULLĐơn vị đo lường cho biến động này
multiplierdecimal(15,4)NOT NULL, DEFAULT '1'Hệ số nhân đơn vị đo
quantity_beforedecimal(15,4)NOT NULLSố lượng tồn kho trước biến động
quantity_changedecimal(15,4)NOT NULLSố lượng thay đổi (dương hoặc âm)
quantity_afterdecimal(15,4)NOT NULLSố lượng tồn kho sau biến động
effective_pricedecimal(15,4)Giá mỗi đơn vị cho biến động này
inventory_stock_idtextNOT NULLFK đến InventoryStock
inventory_tracking_type_idtextNOT NULLFK đến InventoryTrackingType
notetextGhi chú biến động
created_bytextID người dùng tạo
modified_bytextID người dùng sửa đổi cuối
+ các cột chung

InventoryTrackingType

Phân loại biến động theo dõi theo hướng (nhập, xuất, trung lập).

CộtKiểuRàng buộcMô tả
typetextNOT NULLMã loại theo dõi
namejsonb (i18n)NOT NULLTên đa ngôn ngữ
descriptionjsonb (i18n)Mô tả đa ngôn ngữ
directiontextNOT NULLHướng: 000_IN, 100_OUT, 200_NEUTRAL
statustextDEFAULT ACTIVATEDTrạng thái (ACTIVATED, DEACTIVATED, ARCHIVED)
merchant_idtextFK đến Merchant (null cho loại toàn cục)
+ các cột chung

Ràng buộc duy nhất: (type, merchantId)

Các Loại Theo dõi Tồn kho Cố định

Nhập kho (IN):

Giá trịMô tả
STOCK_IN000_STOCK_INNhập kho chung
PURCHASE001_PURCHASENhận từ đơn mua hàng
TRANSFER_IN002_TRANSFER_INChuyển từ vị trí khác
RETURN_FROM_CUSTOMER003_RETURN_FROM_CUSTOMERKhách hàng trả lại
ADJUSTMENT_IN004_ADJUSTMENT_INĐiều chỉnh tăng thủ công
PRODUCTION_COMPLETE005_PRODUCTION_COMPLETESản xuất hoàn thành

Xuất kho (OUT):

Giá trịMô tả
STOCK_OUT100_STOCK_OUTXuất kho chung
SALE101_SALEBán cho khách hàng
TRANSFER_OUT102_TRANSFER_OUTChuyển đến vị trí khác
RETURN_TO_VENDOR103_RETURN_TO_VENDORTrả lại nhà cung cấp
ADJUSTMENT_OUT104_ADJUSTMENT_OUTĐiều chỉnh giảm thủ công
EXPIRED105_EXPIREDHàng hết hạn
LOST106_LOSTHàng thất lạc
DAMAGED106_DAMAGEDHàng hư hỏng
USED_INTERNAL107_USED_INTERNALSử dụng nội bộ
USED_AS_MATERIAL107_USED_AS_MATERIALĐược tiêu thụ như nguyên vật liệu trong luồng BOM/sản xuất

Trung lập (NEUTRAL):

Giá trịMô tả
INVENTORY_COUNT200_INVENTORY_COUNTKiểm kê vật lý
ADJUSTMENT_NEUTRAL201_ADJUSTMENT_NEUTRALĐiều chỉnh trung lập (không thay đổi số lượng)

PurchaseOrder

Đơn mua hàng từ nhà cung cấp với vòng đời trạng thái giống SaleOrder.

Vòng đời Trạng thái

Giá trị Trạng thái: DRAFT (001_DRAFT), PROCESSING (203_PROCESSING), RECEIVED (205_RECEIVED), COMPLETED (303_COMPLETED), CLOSED (404_CLOSED), CANCELLED (505_CANCELLED)

Active set (có thể sửa hoặc hủy): DRAFT, PROCESSING, RECEIVED, COMPLETED. Receivable set (có thể nhận hàng): PROCESSING, RECEIVED, COMPLETED. Terminal set (chỉ đọc): CLOSED, CANCELLED.

Các Cột

CộtKiểuRàng buộcMô tả
purchase_order_numbertextNOT NULL, UNIQUETự động tạo (ví dụ: 20260216120000-...)
nametextTên đơn hàng (tự động tạo)
slugtextUNIQUEĐịnh danh thân thiện URL (tự động tạo)
order_dateisoTimestampNOT NULLNgày đặt hàng (mặc định hiện tại)
expected_delivery_dateisoTimestampNgày giao hàng dự kiến
actual_delivery_dateisoTimestampNgày giao hàng thực tế
statustextNOT NULL, DEFAULT 001_DRAFTTrạng thái đơn hàng
draft_atisoTimestampThời gian vào trạng thái DRAFT
processing_atisoTimestampThời gian vào trạng thái PROCESSING
confirmed_atisoTimestampThời gian xác nhận
received_atisoTimestampThời gian vào trạng thái RECEIVED
completed_atisoTimestampThời gian vào trạng thái COMPLETED
closed_atisoTimestampThời gian vào trạng thái CLOSED
cancelled_atisoTimestampThời gian vào trạng thái CANCELLED
merchant_idtextNOT NULLFK đến Merchant
vendor_idtextNOT NULLFK đến Vendor
inventory_location_idtextNOT NULLFK đến InventoryLocation
currencytextNOT NULL, DEFAULT 'VND'Mã tiền tệ
exchange_ratedecimal(12,6)DEFAULT '1'Tỷ giá hối đoái
subtotaldecimal(15,4)NOT NULL, DEFAULT '0'Tổng phụ
taxdecimal(15,4)NOT NULL, DEFAULT '0'Tổng thuế
discountdecimal(15,4)NOT NULL, DEFAULT '0'Tổng giảm giá
totaldecimal(15,4)NOT NULL, DEFAULT '0'Tổng cuối cùng
metadatajsonbTPurchaseOrderMetadata
created_bytextID người dùng tạo
modified_bytextID người dùng sửa đổi cuối
+ các cột chung

TPurchaseOrderMetadata

typescript
type TPurchaseOrderMetadata = {
  note?: string;
  merchantId?: string;
  isDiscountManual?: boolean; // true = use PO.discount, ignore item discounts
  isTaxManual?: boolean;      // true = use PO.tax, ignore item taxes
  [key: string]: any;
};

PurchaseOrderItem

Mục hàng trong đơn mua hàng với tham chiếu sản phẩm/nguyên vật liệu đa hình và tổng được tính toán.

CộtKiểuRàng buộcMô tả
purchase_order_idtextNOT NULLFK đến PurchaseOrder
item_typetextLoại thực thể đa hình: Product, ProductVariant, hoặc Material (mặc định: ProductVariant)
item_idtextID thực thể đa hình
currencytextNOT NULL, DEFAULT 'VND'Mã tiền tệ
uomtextNOT NULLĐơn vị đo lường
multiplierdecimal(15,4)NOT NULL, DEFAULT '1'Hệ số nhân đơn vị đo
quantitydecimal(15,4)NOT NULLSố lượng đặt hàng
received_quantitydecimal(15,4)NOT NULL, DEFAULT '0'Số lượng đã nhận
unit_pricedecimal(15,4)NOT NULL, DEFAULT '0'Giá mỗi đơn vị
taxdecimal(15,4)NOT NULL, DEFAULT '0'Số tiền thuế
discountdecimal(15,4)NOT NULL, DEFAULT '0'Số tiền giảm giá
totaldecimal(15,4)NOT NULL, GENERATEDTính toán: (unit_price * quantity * multiplier + tax - discount)
created_bytextID người dùng tạo
modified_bytextID người dùng sửa đổi cuối
+ các cột chung

Chế độ Mục: PRODUCT (000_PRODUCT), MATERIAL (001_MATERIAL), CUSTOM (100_CUSTOM)

  • PRODUCT mode: dòng hàng tham chiếu đến một ProductVariant (mặc định).
  • MATERIAL mode: dòng hàng tham chiếu đến một Material (nguyên liệu thô hoặc bán thành phẩm được mua để tiêu thụ trong BOM).
  • CUSTOM mode: dòng hàng tự do, không có tham chiếu SKU — các trường metadata (name, description, sku, barcode, imageUrl) được dùng thay thế.

Vendor

Thông tin nhà cung cấp.

CộtKiểuRàng buộcMô tả
nametextNOT NULLTên nhà cung cấp
identifiertextNOT NULL, UNIQUETự động tạo (ví dụ: VEN_20260216_...)
emailstext[]DEFAULT '{}'Địa chỉ email
phonestext[]DEFAULT '{}'Số điện thoại
locationjsonb (ILocation)Địa chỉ vật lý
tax_numbertextMã số thuế
notetextGhi chú
merchant_idtextNOT NULLFK đến Merchant
+ các cột chung

Material

Nguyên vật liệu thô và bán thành phẩm được sử dụng như các thành phần trong MaterialRecipe (bill-of-materials). Material không phải là hàng bán trực tiếp — chúng tồn tại để được tiêu thụ bởi một recipe sinh ra một ProductVariant có thể bán.

CộtKiểuRàng buộcMô tả
slugtextNOT NULLĐịnh danh thân thiện trong phạm vi Merchant
statustextNOT NULL, DEFAULT 201_ACTIVATEDTrạng thái (ACTIVATED, DEACTIVATED, ARCHIVED)
identifiertextNOT NULL, UNIQUETự động tạo (ví dụ: MAT_20260414_...)
namejsonb (i18n)NOT NULLTên đa ngôn ngữ
descriptionjsonb (i18n)Mô tả đa ngôn ngữ
merchant_idtextNOT NULLFK đến Merchant
+ các cột chungid, createdAt, modifiedAt, deletedAt, metadata

Giá trị Trạng thái: ACTIVATED (201_ACTIVATED), DEACTIVATED (202_DEACTIVATED), ARCHIVED (203_ARCHIVED)

MaterialIdentifier

Định danh theo scheme cho một Material. Cho phép tra cứu Material theo SKU, mã vạch, mã QR, hoặc các hệ thống mã khác. Một Material có thể có nhiều identifier thuộc các scheme khác nhau; cặp (scheme, identifier) là duy nhất toàn cục, nên cùng một mã vạch hoặc SKU không thể đăng ký cho hai Material khác nhau.

CộtKiểuRàng buộcMô tả
schemetextNOT NULL, DEFAULT SYSTEMScheme định danh (SYSTEM, SLUG, SKU, BARCODE, QRCODE)
identifiertextNOT NULLGiá trị định danh
material_idtextNOT NULLFK đến Material
+ các cột chung

Unique index: UQ_MaterialIdentifier_scheme_identifier trên (scheme, identifier).

Schemes: SYSTEM (ID nội bộ, mặc định), SLUG (thân thiện URL), SKU (mã SKU), BARCODE (mã vạch), QRCODE (mã QR).

MaterialRecipe

Công thức bill-of-materials được đánh phiên bản, định nghĩa các Material nào được tiêu thụ để sản xuất một thực thể principal. Principal là đa hình (hiện tại là Product hoặc ProductVariant). Recipe được quản lý phiên bản — một principal có thể có nhiều phiên bản recipe, nhưng chỉ phiên bản được kích hoạt mới được runtime tra cứu.

CộtKiểuRàng buộcMô tả
principal_typetextLoại principal đa hình: Product hoặc ProductVariant
principal_idtextNOT NULLID principal đa hình
statustextNOT NULL, DEFAULT 201_ACTIVATEDTrạng thái recipe (DRAFT, ACTIVATED, DEACTIVATED)
merchantIdtextNOT NULLFK đến Merchant (chú ý: tên cột camelCase)
namejsonb (i18n)Tên hiển thị tuỳ chọn
descriptionjsonb (i18n)Mô tả tuỳ chọn
versionnumeric(10,1)NOT NULL, DEFAULT '1.0'Phiên bản recipe
+ các cột chung

Unique index: UQ_MaterialRecipe_product_variant_id_version trên (principal_type, principal_id, version). Ngăn recipe trùng phiên bản cho cùng principal.

Giá trị Trạng thái: DRAFT (001_DRAFT), ACTIVATED (201_ACTIVATED), DEACTIVATED (202_DEACTIVATED).

Loại Principal: Product, ProductVariant — được phân giải qua cặp đa hình (principal_type, principal_id).

INFO

Cột merchantId được viết theo camelCase trong cơ sở dữ liệu (khác với các bảng inventory khác dùng snake_case). Đây là di sản lịch sử từ migration 0004_abnormal_photon.sql khi cột này được thêm sau. Khi dùng raw SQL, hãy dùng "merchantId" kèm dấu ngoặc kép.

MaterialRecipeItem

Một dòng trong MaterialRecipe: "tiêu thụ X đơn vị của Material Y". Một recipe có nhiều item; mỗi item tham chiếu đến đúng một Material.

CộtKiểuRàng buộcMô tả
quantitydecimal(15,4)NOT NULLSố lượng material tiêu thụ cho mỗi đơn vị sản xuất
unittextNOT NULLĐơn vị đo lường cho quantity
material_idtextNOT NULLFK đến Material
material_recipe_idtextNOT NULLFK đến MaterialRecipe
+ các cột chung

Unique index: UQ_MaterialRecipeItem_material_id_material_recipe_id trên (material_id, material_recipe_id). Một Material chỉ xuất hiện tối đa một lần trong cùng một recipe.

Quan hệ Thực thể

Tài liệu Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.