Skip to content

Instantly share code, notes, and snippets.

@hiendinhngoc
Created November 29, 2022 08:24

Revisions

  1. hiendinhngoc created this gist Nov 29, 2022.
    40 changes: 40 additions & 0 deletions gift_campaign_progress.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,40 @@
    ## Overview
    - Thành tích cộng dồn của các chương trình quà tặng type B được lưu vào table `gift_campaign_progresses`. Mỗi record sẽ tương ứng với 1 chương trình và 1 khách hàng và bao gồm các data field liên quan tới số lượng, doanh số của các mã hàng liên quan đến chương trình (các mã hàng trong `gift_condition_items` của `variant_gift`) và số giải thưởng ở các trạng thái khác nhau.

    - Thành tích về doanh số (revenue) sẽ được tính dựa trên giá sau chiết khấu bao gồm thuế của mã hàng mua.

    - Mỗi `gift_campaign_progress` sẽ có nhiều `gift_campaign_progress_items`, tương ứng với từng `gift_condition_item` của chương trình mà KH đã chọn mua. Ví dụ chương trình yeu cầu mua 100c A, B, C để đạt quà. Khách đã mua 200A và 50B, thì sẽ có 2 `gift_campaign_progress_items` cho A và B, ghi nhận SL và DS đã mua cho 2 mã này. Vì mã C chưa đặt mua, nên sẽ ko có record tương ứng ==> chỉ tạo progress items khi khách đặt mua (hoặc đặt mã hàng vào giỏ hàng) để tránh tình trạng hàng loạt progress items được tạo nhưng ko dc sử dụng (đặc biệt là cho các chương trình với số condition items lên tới hàng trăm)

    ## Quantity and revenue data fields

    - `quantity``revenue`: doanh số và số lượng đã đặt mua của các mã hàng liên quan. Đã đặt mua ở đây có nghĩa là nằm trong các đơn hàng đã đươc checkout (đã trải qua trạng thái `checked_out` và có timestamp `checked_out_at`) và KHÔNG ở trạng thái hủy (`canceled`) hay yêu cầu hủy (`pending_cancellation`). Giá trị field này tương đương với tổng giá trị field `quantity``revenue` của các `gift_campaign_progress_items` liên quan. Khi các progress items bị thay đổi SL/DS, sẽ có callback để cập nhật `quantity``revenue` của progress tương ứng. Ví dụ, chương trình mua 100A tặng 5B. Khách đã đặt mua 50A trong đơn hàng 1, và đơn hàng này đã được checkout, thì `quantity` của `gift_campaign_progress` tương ứng sẽ là 50. Revenue tương ứng cũng sẽ được cập nhật.

    - `confirmed_quantity``confirmed_revenue`: doanh số và số lượng đã xác nhận của các mã hàng mua liên quan. Đã xác nhận đây có nghĩa là các đơn hàng liên quan đã được xác nhận (đã trải qua trạng thái `confirmed` và có timestamp `confirmed_at`) và KHÔNG ở trạng thái hủy hay yêu cầu hủy. Giá trị field này tương đương với tổng giá trị field `confirmed_quantity``confirmd_revenue` của các `gift_campaign_progress_items` liên quan. Khi các progress items bị thay đổi SL/DS, sẽ có callback để cập nhật `confirmed_quantity``confirmed_revenue` của progress tương ứng. Tiếp tục ví dụ trên, khách hàng mua tiếp 100A trong đơn hàng 2, thì `quantity` sẽ là 150, nhưng `confirmed_quantity` là 0 vì chưa đơn nào được xác nhận. Nếu đơn 1 được xác nhận, thì `quantity` sẽ là 150, và `confirmed_quantity` là 50.

    ## Rewards data fields
    - `reward_times`: Số giải thưởng đã đạt được dựa trên `quantity``revenue`. Tiếp tục ví dụ trên, `reward_times` đây sẽ là 1, vì đã mua 150c, và chương trình yêu cầu mua 100c chô mỗi giải thưởng. Field này sẽ được tính toán dựa trên `quantity` hay `revenue` tùy vào chương trình yêu cầu về SL hay DS.

    - `confirmed_rewards`: Số giải thưởng đã xác nhận dựa trên `confirmed_quantity``confirmed_revenue`. Tiếp tục ví dụ trên, `confirmed_rewards` sẽ là 0, vì chỉ mới có 50c đã được xác nhận, nên chưa đủ yêu cầu 100c của chương trinh. Field này dùng để xuất quà tăng riêng, nếu field này > 0 và số lần quà tặng đã chọn chưa đủ, thì chương trình sẽ được hiển thị ở tab `Quản lý quà tặng` -> `Đã đạt chưa xuất` cho khách xuất quà.

    - `checked_out_rewards`: Số giải thưởng đã được xuất, tương đương với tổng field `checked_out_rewards` của các `selected_gifts` nằm ở trạng thái `finalized`. Nghĩa là các gói quà được chọn, sau khi được xuất thành công, sẽ được phản ánh ở field này trong `gift_campaign_progress`. Nếu field này bằng với `confirmed_rewards`, nghĩa là KH đã xuất hết các gói quà đã đạt được.

    ## Noncombinable data
    - Các field `unconfirmed_noncombinable_data``confirmed_noncombinable_data` dùng để ghi nhận thành tích đã được sử dụng để xuất quà của các chương trình trong nhóm loại trừ (noncombinable). Khi tính toán `reward_times``confirmed_rewards`, sẽ trừ `unconfirmed_noncombinable_data``confirmed_noncombinable_data` ra khỏi tổng SL/DS tương ứng.

    #### Noncombinable campaigns overview
    - Nhóm các chương trình noncombinable là các chương trình có chung 1 `internal order` (hay gọi tắt là `IO`, và trong table `variant_gift` sẽ là field `sap_internal_order`), nhưng khác nhau về yêu cầu SL, doanh số, và quà tặng. Chẳng hạn
    + Chương trình với ID là 1, IO 1234, yêu cầu mua 100c A, B, C được tăng 10D
    + Chương trình với ID là 2, IO 1234, yêu cầu mua 200c A, B, C được tặng 30D
    + Chương trình với ID là 3, IO 1234, yêu cầu mua 500c A, B, C được tặng 100D

    - 3 chương trình này sẽ thuộc nhóm noncombinable với nhau, với field `noncombinable``true`. Trong đó, ctr ID 1 sẽ là parent, vì có yêu cầu nhỏ nhất, và `noncombinable_parent_id` của ctr này sẽ là `nil`. Chương trình với ID 2 và 3 sẽ có `noncombinable_parent_id` là 1.

    - Đối với các chương trình loại trừ, thành tích dùng để xuất quà của 1 chương trình sẽ không được tính vào các ctr còn lại. Ví dụ, theo như nhớm noncombinable trên, nếu KH mua dc 1000c, KH sẽ đạt dc 10 gói quà ID 1, 5 gói quà ID 2, và 2 gói quà ID 3. Nhưng nếu khách xuất 1 gói quà của chương trình thứ 3, tương ứng với sử dụng 500c hàng mua để đổi quà, thì các chương trình còn lại sẽ chỉ có thể lấy 500c còn lại chưa dùng đến để đổi quà. Như vậy, KH dc 5 gói quà ID 1, và 2 lần gói quà ID 2, và 1 gói quà ID 3 sau khi xuất 1 gói quà 500c.

    #### Gift campaign progress for noncombinable campaigns
    - Thành tích của các chương trình chung 1 nhóm noncombinable sẽ gióng nhau về mặt SL và DS, nhưng để đảm bảo tính loại trừ nói trên, thì phần thành tích đã được sử dụng để xuất quà sẽ được tính vào các field `noncombinable_data` như sau:

    + `confirmed_noncombinable_data`: Thành tích chòn quà đã xác nhận. Đây được dùng để tính toán thành tích trong modal chọn quà trên web. Tiếp tục ví dụ nhóm noncombinable ở trên, với trường hợp là khách đã mua 1000c, khi trong tab quà tặng `đã đạt chưa xuât` trên AMPO, khi mở modal chọn quà lên và chọn gói quà 500c (ID 3), thì progress của chương trình ID 1 và 2 sẽ cập nhật field `confirmed_noncombinable_data` là 500. Như vậy, `reward_times``confirmed_reward_times` của ctr 1 và 2, khi tính toán số giải thưởng đạt được, sẽ trừ giá trị ở field `confirmed_noncombinable_data` này (tức 500) ra khỏi tổng SL/DS đã mua/ đã xác nhận.

    + `unconfirmed_noncombinable_data`: Thành tích chọn quà chưa xác nhận, dùng để ghi nhận SL/DS được dùng để chọn quà tặng kèm đơn mua cho các đơn mua chưa được xác nhận. Nếu field này có giá trị, thì `reward_times` sẽ trừ giá trị này ra khi tính toán số gói quà đạt dc (nhưng chưa xác nhận).