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ảng | ID | Chứa gì |
|---|---|---|
| LSC Transaction Header | 99001472 | Đầu giao dịch POS, có Total Discount |
| LSC Trans. Sales Entry | 99001473 | Dòng hàng của giao dịch |
| LSC Trans. Discount Entry | 99001642 | Mỗi lần giảm giá một record, có Offer Type và Offer No. |
| LSC Periodic Discount | 99001453 | Danh mục CTKM, Description là Text[30] |
| LSC Coupon Header | 99001621 | Danh mục coupon |
| LSC Arch Periodic Discount | 99008800 | CTKM hết hạn đã archive, cùng cấu trúc No., Description |
| LSC Arch Trans. Discount Entry | 99001600 | Chi 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 theoOffer No.. Dựa vôOffer No., lấyDescriptiontheo 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ấyOffer Typelà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 Amountrồ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ấyDescription, 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 Type | Offer No. |
|---|---|---|
| 10000 | Disc. Offer | PD0012 |
| 20000 | Disc. Offer | PD0012 |
| 20000 | Multibuy | PD0045 |
| 30000 | Line 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òng | Lấy từ | Giá trị trong ví dụ |
|---|---|---|
| 1 | Description của PD0012 trên LSC Periodic Discount | GIẢM 20% ĐỒ UỐNG |
| 2 | Description của PD0045 trên LSC Periodic Discount | MUA 2 TẶNG 1 |
| 3 | Offer Type, vì Offer No. rỗng | Line 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#
- 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ấyDescription. Giao dịch đã archive thì đọc LSC Arch Trans. Discount Entry (99001600) thay cho 99001642. - 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 Typecó 15 giá trị, khách muốn tiếng Việt thì cần một bảng ánh xạ từOffer Typesang diễn giải. - 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.
- Tên dài hơn 30 ký tự.
Descriptioncủ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ản | Số dòng diễn giải mong đợi |
|---|---|---|
| 1 | 1 CTKM, 1 mặt hàng | 1 |
| 2 | 1 CTKM áp nhiều mặt hàng | 1 |
| 3 | 2 CTKM, mỗi CTKM 1 mặt hàng | 2 |
| 4 | 2 CTKM chồng trên 1 mặt hàng | 2 |
| 5 | Multibuy | 1 |
| 6 | Mix & Match | 1 |
| 7 | Total Discount | 1 |
| 8 | Coupon | 1 |
| 9 | Thu ngân giảm tay | 1, tên loại ưu đãi |
| 10 | Giảm theo nhóm khách hoặc thẻ thành viên | 1, tên loại ưu đãi |
| 11 | Không có CTKM | 0 |
| 12 | Disc. Offer, Multibuy, coupon và giảm tay trên cùng hóa đơn | 4 |
| 13 | Tên CTKM đúng 30 ký tự, có dấu tiếng Việt | 1, 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.