Skip to content

Sale Schema

Schema sale chứa 2 model quản lý vòng đời đơn hàng bán. Đơn hàng tiến triển qua một máy trạng thái xác định từ bản nháp đến hoàn thành hoặc hủy bỏ.

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

Tổng quan Model

ModelTên BảngMô tả
SaleOrdersale.SaleOrderĐơn hàng bán với vòng đời trạng thái và tổng giá
SaleOrderItemsale.SaleOrderItemMục hàng trong đơn hàng bán

SaleOrder

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

Giá trị Trạng thái (từ SaleOrderStatuses):

Trạng tháiGiá trịKết thúcSửa đổi MụcThanh toánHủy
DRAFT001_DRAFTKhông
PROCESSING203_PROCESSINGKhôngKhôngKhông
PARTIAL300_PARTIALKhôngKhôngKhông
COMPLETED303_COMPLETEDKhôngKhôngKhông
CANCELLED505_CANCELLEDKhôngKhôngKhông

Các phương thức helper trên SaleOrderStatuses:

  • isValid(status) -- kiểm tra trạng thái có trong tập hợp hợp lệ
  • isTerminal(status) -- trả về true cho COMPLETED hoặc CANCELLED
  • canModifyItems(status) -- trả về true chỉ cho DRAFT
  • canCheckout(status) -- trả về true chỉ cho DRAFT
  • canRevertToCart(status) -- trả về true chỉ cho PROCESSING
  • canCancel(status) -- trả về true cho bất kỳ trạng thái đang hoạt động (DRAFT, PROCESSING, PARTIAL)

Các Cột

CộtKiểuRàng buộcMô tả
order_numbertextNOT NULL, UNIQUESố đơn hàng duy nhất tự động tạo
nametextTên đơn hàng
slugtextUNIQUEĐịnh danh thân thiện URL
validityjsonb{ from: string, to: string } thời hạn hiệu lực
statustextNOT NULL, DEFAULT 001_DRAFT, indexedTrạng thái đơn hàng
draft_attimestamptzThời gian đơn hàng vào trạng thái DRAFT
processing_attimestamptzThời gian đơn hàng vào trạng thái PROCESSING
partial_attimestamptzThời gian đơn hàng vào trạng thái PARTIAL
completed_attimestamptzThời gian đơn hàng COMPLETED
cancelled_attimestamptzThời gian đơn hàng CANCELLED
cancellation_reasontextLý do hủy
merchant_idtextNOT NULL, indexedFK đến Merchant
sale_channel_idtextNOT NULL, indexedFK đến SaleChannel
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ụ trước thuế/giảm giá
taxdecimal(15,4)NOT NULL, DEFAULT '0'Tổng số tiền thuế
discountdecimal(15,4)NOT NULL, DEFAULT '0'Tổng số tiền giảm giá
totaldecimal(15,4)NOT NULL, DEFAULT '0'Tổng cuối cùng
counterjsonbBộ đếm thanh toán { paid: number, paidItemIds: string[], total: number }
metadatajsonbKiểu TSaleOrderMetadata
created_bytextID người dùng tạo
modified_bytextID người dùng sửa đổi cuối
+ các cột chungid, createdAt, modifiedAt, deletedAt

TSaleOrderMetadata

typescript
type TSaleOrderMetadata = {
  note?: string;
  merchantId: string;
  finance:
    | { use: false }
    | {
        use: true;
        walletId: string;
        categoryId: string;
      };
};

Trường finance kiểm soát việc giao dịch tài chính có được tự động tạo khi đơn hàng hoàn thành hay không:

  • { use: false } -- không tích hợp tài chính
  • { use: true, walletId, categoryId } -- tự động tạo giao dịch thu nhập trong ví và danh mục được chỉ định

Quan hệ

Quan hệKiểuĐíchMô tả
creatorMộtUserNgười dùng tạo
modifierMộtUserNgười dùng sửa đổi cuối
saleChannelMộtSaleChannelKênh bán hàng liên kết
itemsNhiềuSaleOrderItemCác mục hàng trong đơn hàng

SaleOrderItem

Chế độ Mục

Chế độGiá trịMô tả
PRODUCT000_PRODUCTMục sản phẩm tiêu chuẩn liên kết với ProductVariant
CUSTOM100_CUSTOMMục tùy chỉnh/thủ công không liên kết sản phẩm

Các Cột

CộtKiểuRàng buộcMô tả
sale_order_idtextNOT NULL, indexed, FKFK đến SaleOrder
modetextNOT NULL, DEFAULT 000_PRODUCTChế độ mục (PRODUCT hoặc CUSTOM)
lead_item_idtextMục dẫn đầu cho mục nhóm/addon
item_typetextLoại thực thể đa hình (mặc định: ProductVariant)
item_idtextID thực thể đa hình
currencytextNOT NULL, DEFAULT 'VND'Mã tiền tệ
base_pricedecimal(15,4)NOT NULL, DEFAULT '0'Giá gốc cơ bản
unit_pricedecimal(15,4)NOT NULL, DEFAULT '0'Giá mỗi đơn vị (sau điều chỉnh)
discountdecimal(15,4)NOT NULL, DEFAULT '0'Số tiền giảm giá
quantitydecimal(15,4)NOT NULL, DEFAULT '1'Số lượng
taxdecimal(15,4)NOT NULL, DEFAULT '0'Số tiền thuế
totaldecimal(15,4)NOT NULL, GENERATEDTính toán: (unit_price * quantity + tax)
fare_idtextTham chiếu đến Fare sử dụng cho định giá
fare_providertextNhà cung cấp cung cấp giá vé
price_metadatajsonbTPriceMetadata với chi tiết nguồn giá vé
metadatajsonbTProductMetadata với snapshot sản phẩm
created_bytextID người dùng tạo
modified_bytextID người dùng sửa đổi cuối
+ các cột chungid, createdAt, modifiedAt, deletedAt

Chỉ mục: (saleOrderId), (itemType, itemId)

Khóa ngoại: saleOrderId tham chiếu SaleOrder.id

TProductMetadata

Snapshot sản phẩm được lưu tại thời điểm bán:

typescript
type TProductMetadata = {
  name: { default: string; vi?: string; en?: string };
  description?: string;
  sku?: string;
  barcode?: string;
  imageUrl?: string;
  category?: string;
  subcategory?: string;
  brand?: string;
  attributes?: Record<string, string | number | boolean>;
  taxRate?: number;
  externalId?: string;
  externalSource?: string;
  customData?: Record<string, unknown>;
};

TFareSource (Union Phân biệt)

Theo dõi cách xác định giá:

typescript
// Manual pricing (operator-entered)
type TFareSourceManual = {
  type: 'MANUAL';
  unitPrice: number;
  basePrice: number;
  tax: { mode: 'AMOUNT'; value: number } | { mode: 'PERCENTAGE'; value: number };
};

// System pricing (from fare engine)
type TFareSourceSystem = {
  type: 'SYSTEM';
  fareId: string;
  unitPrice: number;
  basePrice: number;
  originalPrice?: number;
  provider?: string;
  appliedRules?: Array<{ fareRuleId: string; code: string }>;
  validUntil?: string;
  metadata?: Record<string, unknown>;
};

type TFareSource = TFareSourceManual | TFareSourceSystem;

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.