Đến nội dung chính
ERP Thực Chiến
Thư viện
Menu

Diễn giải khuyến mãi trên hóa đơn điện tử LS Central lấy từ bảng nào

Lấy diễn giải khuyến mãi trên hóa đơn điện tử LS Central từ LSC Trans. Discount Entry, xử lý nhiều CTKM, bốn trường hợp tên ra sai và 13 kịch bản test.

Diễn giải khuyến mãi trên hóa đơn điện tử LS Central không nằm sẵn trong giao dịch POS. Giao dịch lưu loại ưu đãi và mã chương trình khuyến mãi (CTKM) trong LSC Trans. Discount Entry (99001642), còn tên CTKM phải tra sang danh mục CTKM hoặc danh mục coupon. Có bao nhiêu CTKM thì hóa đơn điện tử có bấy nhiêu dòng diễn giải.

Tôi làm yêu cầu này cho một chuỗi F&B tháng 09/2026. Receipt in tại quầy có dòng tên CTKM, ví dụ một dòng giảm 100% làm tổng hóa đơn về 0 đồng, và kế toán cần đúng tên đó trên hóa đơn điện tử. Logic dưới đây tôi đọc từ source LS Central 27.1.19.3413, report LSC Detailed Receipt (99001470), khối Discount Summary, tức chỗ đang in dòng đó lên receipt.

Tên chương trình khuyến mãi nằm ở bảng nào#

BảngIDChứa gì
LSC Transaction Header99001472Đầu giao dịch POS, có Total Discount
LSC Trans. Sales Entry99001473Dòng hàng của giao dịch
LSC Trans. Discount Entry99001642Mỗi lần giảm giá một record, có Offer Type và Offer No.
LSC Periodic Discount99001453Danh mục CTKM, Description là Text[30]
LSC Coupon Header99001621Danh mục coupon
LSC Arch Periodic Discount99008800CTKM hết hạn đã archive, cùng cấu trúc No., Description
LSC Arch Trans. Discount Entry99001600Chi tiết giảm giá của giao dịch đã archive, field giống 99001642

Khóa của 99001642 gồm Store No., POS Terminal No., Transaction No., Line No., Offer Type, Offer No.. Xem dữ liệu trên page LSC Trans. Discount Entries (99009056). Theo trang Periodic Discounts của LS Retail, Periodic Discount là tên chung cho Discount Offer, Multibuy và Mix & Match.

Logic lấy diễn giải khuyến mãi, viết cho dev#

Câu spec tôi chốt gửi dev:

Dựa vô Store No. + POS Terminal No. + Transaction No. trên LSC Trans. Discount Entry (99001642), lấy 2 field: Offer Type, Offer No.. Rồi remove duplicate theo Offer No.. Dựa vô Offer No., lấy Description theo từng trường hợp:

  • Offer Type = Coupon: lấy trên LSC Coupon Header (99001621)
  • Các loại khác: lấy trên LSC Periodic Discount (99001453)
  • Offer No. rỗng: lấy Offer Type làm diễn giải

Mỗi bước là một câu đủ ba vế: dựa vô field nào, trên bảng nào, lấy field nào. Người đọc không phải quay lên câu trước để ghép lại.

Câu này qua bốn lượt sửa mới gọn được như vậy. Các bản nháp trước do AI viết, tôi trả về vì ba lỗi:

  • Lấy thêm Discount Amount rồi cộng tiền giảm theo từng CTKM. Hóa đơn chỉ cần diễn giải, field đó không phục vụ câu hỏi.
  • Ghi tên CTKM trong ảnh khách gửi vào câu logic, kiểu "lấy Description = tên trong ảnh". Tên đó chỉ là giá trị của một giao dịch. Logic là lấy Description, hết.
  • Tự giả định ghép mọi CTKM thành một chuỗi để nhét vào một ô của hóa đơn. Đầu ra trông thế nào là thứ phải hỏi kế toán, không suy ra được.

Những dấu hiệu khác của tài liệu do AI viết và cách rà, tôi để ở bài FDD do AI viết bị khách trả về.

Một chi tiết nên nói thêm với dev: với các record Offer No. rỗng, report chuẩn lấy Offer Type thay cho Offer No. làm khóa remove duplicate. Nhờ vậy giảm tay (Line Discount) và giảm theo khách (Customer) trong cùng giao dịch vẫn ra hai dòng riêng.

Ví dụ một giao dịch có ba chương trình khuyến mãi#

Ví dụ dựng lại, mã và tên CTKM là giả định. LSC Trans. Discount Entry của giao dịch có 4 record:

Line No.Offer TypeOffer No.
10000Disc. OfferPD0012
20000Disc. OfferPD0012
20000MultibuyPD0045
30000Line Discount(rỗng)

Remove duplicate theo Offer No. còn 3, hóa đơn điện tử ra 3 dòng diễn giải:

DòngLấy từGiá trị trong ví dụ
1Description của PD0012 trên LSC Periodic DiscountGIẢM 20% ĐỒ UỐNG
2Description của PD0045 trên LSC Periodic DiscountMUA 2 TẶNG 1
3Offer Type, vì Offer No. rỗngLine Discount

Nhiều chương trình khuyến mãi trên một hóa đơn có lấy được không#

Được, không giới hạn số CTKM. Trong ví dụ trên, dòng hàng 20000 dính hai CTKM nên có hai record cùng Line No.. PD0012 áp cho hai dòng hàng nhưng chỉ ra một dòng diễn giải. Một CTKM áp cho năm dòng hàng cũng vậy.

Bao nhiêu CTKM thì bấy nhiêu dòng diễn giải trên hóa đơn, không ghép thành một chuỗi. Đây là quyết định nghiệp vụ đã chốt ở dự án này.

Muốn gắn diễn giải theo từng dòng hàng thay vì cả hóa đơn thì lọc thêm Line No. trên 99001642 khớp Line No. của LSC Trans. Sales Entry (99001473), phần còn lại giữ nguyên.

Hỏi trước: hóa đơn điện tử phát hành từ giao dịch POS hay từ Posted Sales Invoice#

Câu này quyết định dev lấy dữ liệu ở đâu. Phát hành từ giao dịch POS thì có sẵn Store No., POS Terminal No., Transaction No. để đọc 99001642. Phát hành từ Posted Sales Invoice sau khi post statement thì không. Sales Invoice Header, kể cả phần field LS Central thêm vào, không lưu Transaction No., chỉ có Store No., POS ID, Batch No., nên phải bổ sung liên kết ngược về giao dịch trước.

Phát hành ngay lúc kết thúc giao dịch còn một hệ quả: lời gọi sang nhà cung cấp hóa đơn điện tử nằm trong lúc thu ngân chờ. Ở bài máy POS LS Central đứng 2 phút vì HttpClient.Timeout, lời gọi hóa đơn điện tử đo được khoảng 3,8 giây, cộng thẳng vào thời gian thu ngân chờ.

Bốn trường hợp tên CTKM ra sai, báo khách trước khi dev làm#

  1. CTKM hết hạn. LS Central archive phiếu CTKM sang LSC Arch Periodic Discount (99008800) và xóa khỏi 99001453, nên tra theo Offer No. không thấy, hóa đơn in ra tên loại, ví dụ "Disc. Offer". Receipt in tại quầy hiếm gặp vì in ngay lúc bán. Hóa đơn điện tử phát hành trễ hoặc in lại hóa đơn cũ thì gặp thường. Cách xử lý: không thấy trên 99001453 thì dựa vô Offer No. trên LSC Arch Periodic Discount (99008800), lấy Description. Giao dịch đã archive thì đọc LSC Arch Trans. Discount Entry (99001600) thay cho 99001642.
  2. Giảm giá không có phiếu CTKM: thu ngân giảm tay, giảm theo nhóm khách hàng, giảm theo hình thức thanh toán. Offer No. rỗng nên diễn giải là tên loại bằng tiếng Anh như Line Discount, Customer. Offer Type có 15 giá trị, khách muốn tiếng Việt thì cần một bảng ánh xạ từ Offer Type sang diễn giải.
  3. Coupon. Ở khối Discount Summary của report chuẩn, nhánh coupon đọc được tên coupon nhưng gán vào nhầm biến, nên dòng tóm tắt in chữ "Coupon" thay vì tên coupon. Dev chép nguyên logic từ report thì lỗi đi theo.
  4. Tên dài hơn 30 ký tự. Description của LSC Periodic Discount là Text[30]. Cần dài hơn thì dùng 3 dòng Pop-up Line có sẵn trên phiếu CTKM, hoặc thêm field.

Thêm một điểm về dữ liệu cũ: tên CTKM lấy lúc in, không phải lúc bán. Sau này ai sửa tên CTKM thì hóa đơn in lại ra tên khác hóa đơn gốc. Muốn chắc thì lưu Description vào một field custom trên 99001642 ngay lúc POS ghi giao dịch. Việc này đụng vào bảng giao dịch nên cần khách đồng ý trước.

13 kịch bản test diễn giải khuyến mãi#

Mỗi kịch bản là một giao dịch POS. Dựng CTKM và dữ liệu test theo bảng dưới:

#Kịch bảnSố dòng diễn giải mong đợi
11 CTKM, 1 mặt hàng1
21 CTKM áp nhiều mặt hàng1
32 CTKM, mỗi CTKM 1 mặt hàng2
42 CTKM chồng trên 1 mặt hàng2
5Multibuy1
6Mix & Match1
7Total Discount1
8Coupon1
9Thu ngân giảm tay1, tên loại ưu đãi
10Giảm theo nhóm khách hoặc thẻ thành viên1, tên loại ưu đãi
11Không có CTKM0
12Disc. Offer, Multibuy, coupon và giảm tay trên cùng hóa đơn4
13Tên CTKM đúng 30 ký tự, có dấu tiếng Việt1, tên không bị cắt, không mất dấu

Kịch bản 12 quan trọng nhất, vì một hóa đơn đi qua cả ba nhánh lấy diễn giải. Khách không dùng coupon hay thẻ thành viên thì bỏ kịch bản 8 và 10.

Mỗi giao dịch ghi lại Store No., POS Terminal No., Transaction No. và Receipt No., in kèm Detailed Receipt với Show Discount Information = Summary information below Sub-total để đối chiếu. Theo code report tôi đọc, dòng coupon trên Detailed Receipt sẽ in chữ "Coupon" vì lỗi ở trường hợp 3, còn hóa đơn điện tử phải ra tên coupon.

Đọc tiếp