From 911d5be3b27da059bd8e6066e240f1544afb737f Mon Sep 17 00:00:00 2001 From: Son Phung Date: Mon, 27 Jul 2026 18:28:46 +0700 Subject: [PATCH] chore: remove legacy specification documents and internal rules file --- .cursor/rules/codegraph.mdc | 38 - docs/Formula validation.docx | Bin 0 -> 192686 bytes docs/Formula.docx | Bin 0 -> 247390 bytes docs/knowledge-cards/CHANGE_HISTORY.md | 6 + .../campaign/account_type_group.md | 69 + .../knowledge-cards/campaign/campaign_rule.md | 93 + docs/knowledge-cards/campaign/cep_request.md | 76 + .../campaign/counter_definition.md | 62 + .../campaign/item_redemption_rule.md | 71 + .../campaign/pool_conversion_rate.md | 62 + .../campaign/pool_definition.md | 74 + docs/knowledge-cards/campaign/rep_rule.md | 75 + .../campaign/reward_campaign.md | 78 + .../campaign/transaction_codes.md | 65 + .../catalogue/catalogue_category.md | 81 + docs/knowledge-cards/catalogue/item_master.md | 91 + docs/knowledge-cards/catalogue/item_price.md | 96 + .../knowledge-cards/catalogue/voucher_code.md | 91 + docs/knowledge-cards/customer/account.md | 74 + .../customer/attribute_counter.md | 69 + docs/knowledge-cards/customer/card.md | 64 + .../customer/customer_overview.md | 84 + .../customer/no_hit_transaction.md | 74 + .../customer/operations_adjustment.md | 79 + .../customer/operations_transaction.md | 73 + docs/knowledge-cards/customer/pool_balance.md | 70 + docs/knowledge-cards/customer/statement.md | 67 + .../customer/transaction_history.md | 83 + docs/knowledge-cards/marketing/ab_testing.md | 78 + .../marketing/audience_filter.md | 75 + .../marketing/frequency_capping.md | 76 + .../marketing/marketing_campaign.md | 84 + .../marketing/marketing_message.md | 74 + .../system/application_parameter.md | 68 + .../knowledge-cards/targeting/segmentation.md | 56 + .../campaign/batch_rule_processing.md | 46 + .../campaign/criteria_operators.md | 125 + .../campaign/expiry_policies.md | 40 + .../campaign/formula_calculation.md | 45 + .../campaign/velocity_control_detail.md | 51 + .../catalogue/fulfillment_lifecycle.md | 49 + .../catalogue/redemption_pricing_detail.md | 44 + .../customer/adjustment_deduction_logic.md | 53 + .../marketing/omr_execution_flow.md | 48 + docs/specs/00_MIGRATION_REPORT.md | 27 - docs/specs/00_MIGRATION_TRACKER.md | 34 - docs/specs/archive/introduction.md | 45 - docs/specs/archive/oneaccess.md | 243 - docs/specs/archive/oneadmin.md | 186 - docs/specs/archive/reference.md | 55 - docs/specs/customer_management/account.md | 46 - docs/specs/customer_management/adjustment.md | 53 - docs/specs/customer_management/attribute.md | 51 - .../customer_management/award_transaction.md | 52 - docs/specs/customer_management/card.md | 47 - docs/specs/customer_management/counter.md | 51 - .../specs/customer_management/customer_360.md | 56 - .../customer_management/customer_profile.md | 62 - .../customer_management/item_redemption.md | 59 - .../no_hit_cp_transaction.md | 51 - .../pool_balance_detail.md | 54 - .../customer_management/re_instatement.md | 46 - docs/specs/customer_management/statement.md | 52 - .../transaction_history.md | 72 - .../customer_management/transfer_balance.md | 48 - docs/specs/introduction/terminology.md | 42 - docs/specs/oneaccess/permission_management.md | 65 - docs/specs/oneaccess/user_group.md | 47 - docs/specs/oneaccess/user_profile.md | 61 - docs/specs/oneadmin/framework_behavior.md | 50 - docs/specs/onecatalogue/catalogue.md | 44 - docs/specs/onecatalogue/category.md | 40 - docs/specs/onecatalogue/item_master.md | 65 - docs/specs/onecatalogue/item_price.md | 54 - docs/specs/onecatalogue/voucher_code.md | 58 - docs/specs/onemarketing/ab_testing.md | 51 - docs/specs/onemarketing/blacklist.md | 36 - docs/specs/onemarketing/frequency_capping.md | 42 - docs/specs/onemarketing/marketing_campaign.md | 62 - docs/specs/onemarketing/marketing_message.md | 69 - docs/specs/onemarketing/whitelist.md | 36 - docs/specs/onetargeting/audience_upload.md | 32 - docs/specs/onetargeting/customer_audience.md | 14 - docs/specs/onetargeting/segmentation.md | 64 - docs/specs/reference/change_history.md | 46 - docs/specs/reference/document_references.md | 15 - .../reward_campaign/account_type_group.md | 42 - .../specs/reward_campaign/campaign_insight.md | 38 - .../campaign_rule_contributor.md | 35 - .../reward_campaign/campaign_rule_criteria.md | 40 - .../reward_campaign/campaign_rule_formula.md | 27 - .../reward_campaign/campaign_structure.md | 40 - docs/specs/reward_campaign/cep_rule.md | 41 - .../reward_campaign/counter_definition.md | 45 - .../external_transaction_code.md | 33 - .../reward_campaign/item_redemption_rule.md | 36 - .../reward_campaign/ols_transaction_code.md | 34 - docs/specs/reward_campaign/pool_definition.md | 68 - docs/specs/reward_campaign/rep_rule.md | 39 - docs/specs/reward_campaign/reward_campaign.md | 37 - .../reward_campaign/reward_campaign_rule.md | 64 - .../reward_campaign/transaction_category.md | 37 - .../application_parameter.md | 64 - docs/staging/MANIFEST.md | 49 + docs/staging/clean/formula.md | 123 + docs/staging/clean/formula_validation.md | 50 + docs/staging/clean/fsd_p1_finnal_version.md | 5269 ++++++++++++++ docs/staging/clean/outline.md | 86 + docs/staging/raw/FSD P1_Finnal Version.md | 6179 +++++++++++++++++ docs/staging/raw/formula.md | 131 + docs/staging/raw/formula_validation.md | 50 + .../specs/campaign/account_type_group.md | 65 + docs/staging/specs/campaign/campaign_rule.md | 577 ++ .../specs/campaign/counter_definition.md | 125 + .../specs/campaign/pool_conversion_rate.md | 87 + .../staging/specs/campaign/pool_definition.md | 139 + .../staging/specs/campaign/reward_campaign.md | 437 ++ .../specs/campaign/special_rule_types.md | 264 + .../specs/campaign/transaction_codes.md | 208 + .../specs/catalogue/catalogue_category.md | 105 + docs/staging/specs/catalogue/item_master.md | 78 + docs/staging/specs/catalogue/item_price.md | 85 + docs/staging/specs/catalogue/voucher_code.md | 90 + docs/staging/specs/customer/account.md | 112 + .../specs/customer/attribute_counter.md | 159 + docs/staging/specs/customer/card.md | 100 + .../specs/customer/customer_overview.md | 321 + .../specs/customer/no_hit_transaction.md | 90 + .../specs/customer/operations_adjustment.md | 290 + .../specs/customer/operations_transaction.md | 206 + docs/staging/specs/customer/pool_balance.md | 76 + docs/staging/specs/customer/statement.md | 70 + .../specs/customer/transaction_history.md | 138 + docs/staging/specs/marketing/ab_testing.md | 172 + .../specs/marketing/audience_filter.md | 171 + .../specs/marketing/frequency_capping.md | 68 + .../specs/marketing/marketing_campaign.md | 138 + .../specs/marketing/marketing_message.md | 184 + .../specs/system}/application_parameter.md | 151 +- .../specs/targeting/segmentation.md} | 285 +- .../structured/campaign/campaign.md} | 3479 +++++----- docs/staging/structured/campaign/formula.md | 123 + .../structured/campaign/formula_validation.md | 50 + .../structured/campaign/fsd_campaign.md | 1737 +++++ .../structured/catalogue/catalogue.md} | 749 +- .../structured/customer/customer.md} | 3369 +++++---- .../structured/marketing/marketing.md} | 1497 ++-- .../system/application_parameter.md | 73 + docs/staging/structured/system/system.md | 72 + .../staging/structured/targeting/targeting.md | 139 + docs/staging/validation_report.json | 293 + 151 files changed, 26567 insertions(+), 7922 deletions(-) delete mode 100644 .cursor/rules/codegraph.mdc create mode 100644 docs/Formula validation.docx create mode 100644 docs/Formula.docx create mode 100644 docs/knowledge-cards/CHANGE_HISTORY.md create mode 100644 docs/knowledge-cards/campaign/account_type_group.md create mode 100644 docs/knowledge-cards/campaign/campaign_rule.md create mode 100644 docs/knowledge-cards/campaign/cep_request.md create mode 100644 docs/knowledge-cards/campaign/counter_definition.md create mode 100644 docs/knowledge-cards/campaign/item_redemption_rule.md create mode 100644 docs/knowledge-cards/campaign/pool_conversion_rate.md create mode 100644 docs/knowledge-cards/campaign/pool_definition.md create mode 100644 docs/knowledge-cards/campaign/rep_rule.md create mode 100644 docs/knowledge-cards/campaign/reward_campaign.md create mode 100644 docs/knowledge-cards/campaign/transaction_codes.md create mode 100644 docs/knowledge-cards/catalogue/catalogue_category.md create mode 100644 docs/knowledge-cards/catalogue/item_master.md create mode 100644 docs/knowledge-cards/catalogue/item_price.md create mode 100644 docs/knowledge-cards/catalogue/voucher_code.md create mode 100644 docs/knowledge-cards/customer/account.md create mode 100644 docs/knowledge-cards/customer/attribute_counter.md create mode 100644 docs/knowledge-cards/customer/card.md create mode 100644 docs/knowledge-cards/customer/customer_overview.md create mode 100644 docs/knowledge-cards/customer/no_hit_transaction.md create mode 100644 docs/knowledge-cards/customer/operations_adjustment.md create mode 100644 docs/knowledge-cards/customer/operations_transaction.md create mode 100644 docs/knowledge-cards/customer/pool_balance.md create mode 100644 docs/knowledge-cards/customer/statement.md create mode 100644 docs/knowledge-cards/customer/transaction_history.md create mode 100644 docs/knowledge-cards/marketing/ab_testing.md create mode 100644 docs/knowledge-cards/marketing/audience_filter.md create mode 100644 docs/knowledge-cards/marketing/frequency_capping.md create mode 100644 docs/knowledge-cards/marketing/marketing_campaign.md create mode 100644 docs/knowledge-cards/marketing/marketing_message.md create mode 100644 docs/knowledge-cards/system/application_parameter.md create mode 100644 docs/knowledge-cards/targeting/segmentation.md create mode 100644 docs/knowledge-refs/campaign/batch_rule_processing.md create mode 100644 docs/knowledge-refs/campaign/criteria_operators.md create mode 100644 docs/knowledge-refs/campaign/expiry_policies.md create mode 100644 docs/knowledge-refs/campaign/formula_calculation.md create mode 100644 docs/knowledge-refs/campaign/velocity_control_detail.md create mode 100644 docs/knowledge-refs/catalogue/fulfillment_lifecycle.md create mode 100644 docs/knowledge-refs/catalogue/redemption_pricing_detail.md create mode 100644 docs/knowledge-refs/customer/adjustment_deduction_logic.md create mode 100644 docs/knowledge-refs/marketing/omr_execution_flow.md delete mode 100644 docs/specs/00_MIGRATION_REPORT.md delete mode 100644 docs/specs/00_MIGRATION_TRACKER.md delete mode 100644 docs/specs/archive/introduction.md delete mode 100644 docs/specs/archive/oneaccess.md delete mode 100644 docs/specs/archive/oneadmin.md delete mode 100644 docs/specs/archive/reference.md delete mode 100644 docs/specs/customer_management/account.md delete mode 100644 docs/specs/customer_management/adjustment.md delete mode 100644 docs/specs/customer_management/attribute.md delete mode 100644 docs/specs/customer_management/award_transaction.md delete mode 100644 docs/specs/customer_management/card.md delete mode 100644 docs/specs/customer_management/counter.md delete mode 100644 docs/specs/customer_management/customer_360.md delete mode 100644 docs/specs/customer_management/customer_profile.md delete mode 100644 docs/specs/customer_management/item_redemption.md delete mode 100644 docs/specs/customer_management/no_hit_cp_transaction.md delete mode 100644 docs/specs/customer_management/pool_balance_detail.md delete mode 100644 docs/specs/customer_management/re_instatement.md delete mode 100644 docs/specs/customer_management/statement.md delete mode 100644 docs/specs/customer_management/transaction_history.md delete mode 100644 docs/specs/customer_management/transfer_balance.md delete mode 100644 docs/specs/introduction/terminology.md delete mode 100644 docs/specs/oneaccess/permission_management.md delete mode 100644 docs/specs/oneaccess/user_group.md delete mode 100644 docs/specs/oneaccess/user_profile.md delete mode 100644 docs/specs/oneadmin/framework_behavior.md delete mode 100644 docs/specs/onecatalogue/catalogue.md delete mode 100644 docs/specs/onecatalogue/category.md delete mode 100644 docs/specs/onecatalogue/item_master.md delete mode 100644 docs/specs/onecatalogue/item_price.md delete mode 100644 docs/specs/onecatalogue/voucher_code.md delete mode 100644 docs/specs/onemarketing/ab_testing.md delete mode 100644 docs/specs/onemarketing/blacklist.md delete mode 100644 docs/specs/onemarketing/frequency_capping.md delete mode 100644 docs/specs/onemarketing/marketing_campaign.md delete mode 100644 docs/specs/onemarketing/marketing_message.md delete mode 100644 docs/specs/onemarketing/whitelist.md delete mode 100644 docs/specs/onetargeting/audience_upload.md delete mode 100644 docs/specs/onetargeting/customer_audience.md delete mode 100644 docs/specs/onetargeting/segmentation.md delete mode 100644 docs/specs/reference/change_history.md delete mode 100644 docs/specs/reference/document_references.md delete mode 100644 docs/specs/reward_campaign/account_type_group.md delete mode 100644 docs/specs/reward_campaign/campaign_insight.md delete mode 100644 docs/specs/reward_campaign/campaign_rule_contributor.md delete mode 100644 docs/specs/reward_campaign/campaign_rule_criteria.md delete mode 100644 docs/specs/reward_campaign/campaign_rule_formula.md delete mode 100644 docs/specs/reward_campaign/campaign_structure.md delete mode 100644 docs/specs/reward_campaign/cep_rule.md delete mode 100644 docs/specs/reward_campaign/counter_definition.md delete mode 100644 docs/specs/reward_campaign/external_transaction_code.md delete mode 100644 docs/specs/reward_campaign/item_redemption_rule.md delete mode 100644 docs/specs/reward_campaign/ols_transaction_code.md delete mode 100644 docs/specs/reward_campaign/pool_definition.md delete mode 100644 docs/specs/reward_campaign/rep_rule.md delete mode 100644 docs/specs/reward_campaign/reward_campaign.md delete mode 100644 docs/specs/reward_campaign/reward_campaign_rule.md delete mode 100644 docs/specs/reward_campaign/transaction_category.md delete mode 100644 docs/specs/system_management/application_parameter.md create mode 100644 docs/staging/MANIFEST.md create mode 100644 docs/staging/clean/formula.md create mode 100644 docs/staging/clean/formula_validation.md create mode 100644 docs/staging/clean/fsd_p1_finnal_version.md create mode 100644 docs/staging/clean/outline.md create mode 100644 docs/staging/raw/FSD P1_Finnal Version.md create mode 100644 docs/staging/raw/formula.md create mode 100644 docs/staging/raw/formula_validation.md create mode 100644 docs/staging/specs/campaign/account_type_group.md create mode 100644 docs/staging/specs/campaign/campaign_rule.md create mode 100644 docs/staging/specs/campaign/counter_definition.md create mode 100644 docs/staging/specs/campaign/pool_conversion_rate.md create mode 100644 docs/staging/specs/campaign/pool_definition.md create mode 100644 docs/staging/specs/campaign/reward_campaign.md create mode 100644 docs/staging/specs/campaign/special_rule_types.md create mode 100644 docs/staging/specs/campaign/transaction_codes.md create mode 100644 docs/staging/specs/catalogue/catalogue_category.md create mode 100644 docs/staging/specs/catalogue/item_master.md create mode 100644 docs/staging/specs/catalogue/item_price.md create mode 100644 docs/staging/specs/catalogue/voucher_code.md create mode 100644 docs/staging/specs/customer/account.md create mode 100644 docs/staging/specs/customer/attribute_counter.md create mode 100644 docs/staging/specs/customer/card.md create mode 100644 docs/staging/specs/customer/customer_overview.md create mode 100644 docs/staging/specs/customer/no_hit_transaction.md create mode 100644 docs/staging/specs/customer/operations_adjustment.md create mode 100644 docs/staging/specs/customer/operations_transaction.md create mode 100644 docs/staging/specs/customer/pool_balance.md create mode 100644 docs/staging/specs/customer/statement.md create mode 100644 docs/staging/specs/customer/transaction_history.md create mode 100644 docs/staging/specs/marketing/ab_testing.md create mode 100644 docs/staging/specs/marketing/audience_filter.md create mode 100644 docs/staging/specs/marketing/frequency_capping.md create mode 100644 docs/staging/specs/marketing/marketing_campaign.md create mode 100644 docs/staging/specs/marketing/marketing_message.md rename docs/{specs/archive => staging/specs/system}/application_parameter.md (94%) rename docs/{specs/archive/onetargeting.md => staging/specs/targeting/segmentation.md} (90%) rename docs/{specs/archive/reward_campaign_management.md => staging/structured/campaign/campaign.md} (78%) create mode 100644 docs/staging/structured/campaign/formula.md create mode 100644 docs/staging/structured/campaign/formula_validation.md create mode 100644 docs/staging/structured/campaign/fsd_campaign.md rename docs/{specs/archive/onecatalogue.md => staging/structured/catalogue/catalogue.md} (89%) rename docs/{specs/archive/customer_management.md => staging/structured/customer/customer.md} (84%) rename docs/{specs/archive/onemarketing.md => staging/structured/marketing/marketing.md} (68%) create mode 100644 docs/staging/structured/system/application_parameter.md create mode 100644 docs/staging/structured/system/system.md create mode 100644 docs/staging/structured/targeting/targeting.md create mode 100644 docs/staging/validation_report.json diff --git a/.cursor/rules/codegraph.mdc b/.cursor/rules/codegraph.mdc deleted file mode 100644 index 3f23cf6..0000000 --- a/.cursor/rules/codegraph.mdc +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: CodeGraph MCP usage guide — when to use which tool -alwaysApply: true ---- - -## CodeGraph - -This project has a CodeGraph MCP server (`codegraph_*` tools) configured. CodeGraph is a tree-sitter-parsed knowledge graph of every symbol, edge, and file. Reads are sub-millisecond and return structural information grep cannot. - -### When to prefer codegraph over native search - -Use codegraph for **structural** questions — what calls what, what would break, where is X defined, what is X's signature. Use native grep/read only for **literal text** queries (string contents, comments, log messages) or after you already have a specific file open. - -| Question | Tool | -|---|---| -| "Where is X defined?" / "Find symbol named X" | `codegraph_search` | -| "What calls function Y?" | `codegraph_callers` | -| "What does Y call?" | `codegraph_callees` | -| "What would break if I changed Z?" | `codegraph_impact` | -| "Show me Y's signature / source / docstring" | `codegraph_node` | -| "Give me focused context for a task/area" | `codegraph_context` | -| "See several related symbols' source at once" | `codegraph_explore` | -| "What files exist under path/" | `codegraph_files` | -| "Is the index healthy?" | `codegraph_status` | - -### Rules of thumb - -- **Answer directly — don't delegate exploration.** For "how does X work" / architecture / trace questions, answer with 2-3 codegraph calls: `codegraph_context` first, then ONE `codegraph_explore` for the source of the symbols it surfaces. Codegraph IS the pre-built index, so spawning a separate file-reading sub-task/agent — or running a grep + read loop — repeats work codegraph already did and costs more for the same answer. -- **Trust codegraph results.** They come from a full AST parse. Do NOT re-verify them with grep — that's slower, less accurate, and wastes context. -- **Don't grep first** when looking up a symbol by name. `codegraph_search` is faster and returns kind + location + signature in one call. -- **Don't chain `codegraph_search` + `codegraph_node`** when you just want context — `codegraph_context` is one call. -- **Don't loop `codegraph_node` over many symbols** — one `codegraph_explore` call returns several symbols' source grouped in a single capped call, while each separate node/Read call re-reads the whole context and costs far more. -- **Index lag**: the file watcher debounces ~500ms behind writes; don't re-query immediately after editing a file in the same turn. - -### If `.codegraph/` doesn't exist - -The MCP server returns "not initialized." Ask the user: *"I notice this project doesn't have CodeGraph initialized. Want me to run `codegraph init -i` to build the index?"* - diff --git a/docs/Formula validation.docx b/docs/Formula validation.docx new file mode 100644 index 0000000000000000000000000000000000000000..bd735feafcde4090cb2337beae28b4330ec69806 GIT binary patch literal 192686 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

W3B@H%1_dTK%BB?g@w+s$uUwzys4 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 0). Số nhỏ hơn có ưu tiên cao hơn. | 9(04) | + +### Danh sách Pool liên kết (Linked Pool) +Phần này hiển thị danh sách các Pool đang sử dụng ATG này: +| Field | Description | Type | +|---|---|---| +| Pool | Tên và mã của Pool Definition được liên kết với ATG. | Display | +| Campaign Rule | Tên và mã của Campaign Rule (nếu có) đang cấu hình trả thưởng vào Pool trên. | Display | +| Effective Date | Ngày bắt đầu và kết thúc hiệu lực của Campaign Rule đó. | Display | + +## Cách hoạt động (How It Works) + +ATG đóng vai trò là một bộ lọc và phân giải (resolver) trong 3 trường hợp chính của hệ thống giao dịch: + +- **1. Ưu tiên trừ điểm (Deduction Sequence)**: + Khi khách hàng đổi điểm (Redeem) hoặc bị điều chỉnh giảm từ một Customer-level Pool, hệ thống dựa vào ATG để tìm thứ tự ưu tiên trừ. Các Bucket được ưu tiên trừ theo: (1) Ngày hết hạn sớm nhất -> (2) Ngày bắt đầu sớm nhất -> (3) Sequence No của Account Type nhỏ nhất trong ATG. +- **2. Định tuyến giao dịch chỉ có mã khách hàng (CIF Only Routing)**: + Khi giao dịch chỉ gửi lên mã khách hàng (CIF) mà không chỉ định chính xác tài khoản nào: + Hệ thống sẽ lấy: [Tất cả Account Type của khách hàng] GIAO VỚI [Các Account Type trong ATG của Pool]. + - Nếu kết quả RỖNG: Giao dịch bị từ chối. + - Nếu có nhiều kết quả: Hệ thống tự động đẩy giao dịch vào tài khoản có Sequence No nhỏ nhất (ưu tiên cao nhất). +- **3. Xác thực tính hợp lệ (Validation)**: + Bất kỳ giao dịch nào (Award, Adjust) có chỉ định sẵn số tài khoản/số thẻ, hệ thống đều kiểm tra loại tài khoản đó có nằm trong danh sách ATG của Pool hay không. Nếu không, giao dịch bị từ chối. + +## Mối quan hệ với modules khác + +- **Pool Definition**: Mỗi Pool có thể gắn với một (và chỉ một) ATG để định nghĩa tập hợp các loại tài khoản hợp lệ của Pool đó. +- **Campaign Rule**: Vì Campaign Rule thao tác trực tiếp lên Pool (để trả thưởng hoặc xét điều kiện), ATG gián tiếp giới hạn những tài khoản nào thực sự được hưởng lợi từ Campaign. + +## Ví dụ thực tế + +Pool "Quỹ điểm Thẻ Tín Dụng" có gắn với một ATG gồm 2 loại tài khoản: +1. Thẻ Platinum (Sequence = 10) +2. Thẻ Gold (Sequence = 20) + +Khách hàng Nguyễn Văn A sở hữu cả 2 thẻ này dưới cùng một mã CIF. +- Khi A được thưởng điểm và hệ thống chỉ truyền mã CIF, điểm sẽ tự động được ghi nhận vào thẻ Platinum (do Sequence 10 < 20). +- Khi A đổi điểm (Redemption) nhưng điểm nằm rải rác trên cả 2 thẻ có cùng ngày hết hạn, hệ thống sẽ ưu tiên trừ điểm từ thẻ Platinum trước, nếu thiếu mới trừ tiếp sang thẻ Gold. diff --git a/docs/knowledge-cards/campaign/campaign_rule.md b/docs/knowledge-cards/campaign/campaign_rule.md new file mode 100644 index 0000000..cc30983 --- /dev/null +++ b/docs/knowledge-cards/campaign/campaign_rule.md @@ -0,0 +1,93 @@ +--- +card_id: "campaign/campaign_rule" +title: "Quy tắc Chiến dịch (Campaign Rule)" +domain: "campaign" +related_cards: + - "campaign/reward_campaign" + - "campaign/transaction_codes" + - "customer/pool_balance" +tags: ["rule", "criteria", "award", "redeem", "adjust", "formula"] +detail_refs: + - "campaign/criteria_operators" + - "campaign/formula_calculation" +--- + +# Quy tắc Chiến dịch (Campaign Rule) + +## Mô tả ngắn + +Quy tắc Chiến dịch (Campaign Rule) là thực thể trung tâm chứa toàn bộ logic kinh doanh (Business Logic) để xác định xem một giao dịch có hợp lệ để nhận thưởng hay không, và phần thưởng đó được tính toán như thế nào. Một Campaign Rule hoàn chỉnh bao gồm: Điều kiện hiệu lực, Định tuyến giao dịch, Bộ lọc tiêu chí (Criteria), Công thức tính (Formula) và Phân bổ chi phí (Contributor). + +## Thuật ngữ liên quan + +- **Execution Sequence**: Thứ tự thực thi. Khi một giao dịch (mang một OLS TC) khớp với nhiều Rules, hệ thống sẽ chạy các Rules theo thứ tự này. +- **Stop if criteria met**: Cờ báo hiệu hệ thống dừng xử lý các Rules tiếp theo (cùng TC) nếu Rule hiện tại đã được khớp (hit) thành công. +- **Contributor**: Đơn vị (thường là Merchant / Chain) chịu chi phí tài trợ cho phần thưởng được cấp ra từ Rule này. +- **Absorb Remainder**: Đơn vị chịu trách nhiệm gánh phần số dư lẻ (do làm tròn) sau khi đã chia tỷ lệ % cho các Contributors khác. + +## Cấu trúc dữ liệu (Data Schema) + +Một Rule được cấu thành từ 5 khối dữ liệu logic chính: + +### 1. Thông tin chung & Hiệu lực (General & Effect) +- **Campaign ID**: Chiến dịch chứa Rule này. +- **Rule Type**: Loại quy tắc (Award - Tặng thưởng, Redeem - Đổi điểm, Adjust - Điều chỉnh, v.v.). +- **Effective Period**: Từ ngày - Đến ngày. Có thể đánh giá thời gian này dựa trên *Transaction Date* (Ngày giao dịch gốc) hoặc *System Batch Date* (Ngày hệ thống xử lý). +- **Pool ID**: Đích đến - Ví điểm sẽ được cộng/trừ kết quả tính toán của Rule này. +- **Do not update pool**: Nếu BẬT, Rule này chỉ dùng để tính toán và cập nhật vào Bộ đếm (Counter) chứ không thực sự cộng điểm vào Pool Balance. + +### 2. Liên kết Giao dịch (Transaction Link) +- **OLS Transaction Code**: Xác định loại giao dịch nào (Ví dụ: `PURCHASE`) sẽ kích hoạt Rule này. +- Một Rule có thể link với nhiều TC. +- Không cho phép gán TC đảo chiều (Reversal TC) cho Rule thuộc loại Adjustment hoặc Rule đánh vào Evoucher Pool. + +### 3. Tiêu chí Xét duyệt (Rule Criteria) +Sử dụng cấu trúc truy vấn động (Query Builder) kết hợp bởi nhiều nhóm điều kiện (AND/OR). Hỗ trợ các tiêu chí từ: +- **Transaction**: MCC, Quốc gia, Loại tiền tệ... +- **Customer / Account**: Hạng tài khoản, Tuổi, Phân khúc... +- **Transaction Category**: Tái sử dụng cụm điều kiện vĩ mô (xem thêm card Transaction Codes). +- **Counter**: Xét điều kiện dựa trên tổng giá trị tích lũy trong quá khứ (Ví dụ: Tổng chi tiêu tháng trước > 1000$). +- **Hỗ trợ Exclusion**: Cho phép phủ định một tiêu chí (NOT). + +### 4. Công thức và Giới hạn (Formula & Cap Limits) +- **Amount to Use (A)**: Đầu vào của công thức. Có thể lấy từ Gross Amount, Nett Amount của giao dịch, hoặc lấy từ giá trị của một Bộ đếm (Counter). +- **Cap Limit cho (A)**: Giới hạn trên của đầu vào (Ví dụ: Giao dịch 10 triệu, nhưng chỉ lấy tối đa 5 triệu để tính điểm). +- **Result Award Limit**: Giới hạn tổng kết quả đầu ra. + - *Give No more than*: Giới hạn tổng số điểm thưởng cấp ra không vượt quá X. Có thể giới hạn trên nội bộ 1 Rule, hoặc giới hạn chung dựa trên một Counter (ví dụ: Tổng quỹ thưởng của Campaign không quá 1 tỷ điểm). +- **Rounding**: Phương thức làm tròn kết quả (Up / Down / Nearest). + +### 5. Phân bổ Chi phí (Contributor Details) +- Xác định ai sẽ "trả tiền" cho số điểm thưởng vừa cấp. +- Cho phép cấu hình nhiều đơn vị (Chain) với tỷ lệ phần trăm (Contributor Percentage). +- Tổng tỷ lệ phải bằng 100%. Bắt buộc phải có đúng 1 đơn vị được gán cờ `Absorb Remainder`. +- Nếu không cấu hình, mặc định Merchant nơi phát sinh giao dịch sẽ chịu 100% chi phí. + +## Cách hoạt động (How It Works) + +1. Giao dịch đổ vào Transaction Processing Engine (TP). +2. Engine tìm các Rules đang Active, còn trong thời hạn (Effective Date) và khớp OLS TC. +3. Engine sắp xếp các Rules theo `Execution Sequence`. +4. Engine chạy qua Rule Criteria. Nếu giao dịch thỏa mãn toàn bộ tiêu chí -> Rule Hit. +5. Engine tính toán phần thưởng dựa trên Formula (A), áp dụng các bộ lọc giới hạn (Caps). +6. Nếu `Do not update pool = OFF`, kết quả được cộng vào Pool Balance của khách hàng. Phân bổ chi phí được ghi nhận cho Contributors. +7. Nếu `Stop if criteria met = TRUE`, Engine bỏ qua các Rules còn lại của giao dịch đó. + +## Mối quan hệ với modules khác + +- **Reward Campaign**: Chứa các Rule này. Một chiến dịch không thể hoạt động nếu không có Rule. +- **Transaction Codes**: Liên kết trực tiếp để định tuyến. Giao dịch phải có TC khớp với cấu hình của Rule thì mới kích hoạt Rule. +- **Pool Balance**: Điểm đến cuối cùng của các giao dịch thưởng/trừ do Rule sinh ra. + +## Ví dụ thực tế + +Tạo Rule thưởng nhân 2 điểm (x2) cho Khách hàng hạng Gold vào cuối tuần: +- **Campaign**: "Weekend Double Points" +- **Rule Type**: Award +- **OLS Transaction Code**: `PURCH_NORMAL` +- **Criteria**: + - (Account Level = 'Gold') AND + - (Day of Week IN 'Saturday', 'Sunday') +- **Formula**: `Amount to Use = Gross Amount`. Công thức: `A * 0.02` (Giả sử mặc định là 1%, nhân đôi là 2%). +- **Contributor**: Merchant A chịu 100% chi phí. + +Khi khách hàng Gold mua 1,000,000 VND vào Thứ 7, giao dịch khớp toàn bộ điều kiện. Hệ thống tính: 1,000,000 * 0.02 = 20,000 điểm. 20,000 điểm này được cộng vào Pool của khách hàng và Merchant A chịu ghi nhận nợ 20,000 điểm trên sổ cái. diff --git a/docs/knowledge-cards/campaign/cep_request.md b/docs/knowledge-cards/campaign/cep_request.md new file mode 100644 index 0000000..f34e778 --- /dev/null +++ b/docs/knowledge-cards/campaign/cep_request.md @@ -0,0 +1,76 @@ +--- +card_id: "campaign/cep_request" +title: "Yêu cầu Trích xuất và Xử lý Bộ đếm (CEP Request)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "campaign/counter_definition" + - "campaign/transaction_codes" +tags: ["CEP", "counter", "extract", "batch", "schedule"] +detail_refs: + - "campaign/batch_rule_processing" +--- + +# Yêu cầu Trích xuất và Xử lý Bộ đếm (CEP Request) + +## Mô tả ngắn + +Counter Extract & Process (CEP) Request là một loại Quy tắc Chiến dịch (Campaign Rule) đặc biệt, hoạt động như một công cụ lập lịch (scheduler) tự động. Nhiệm vụ của CEP là định kỳ trích xuất số dư từ các Bộ đếm (Counter), sau đó chuyển hóa giá trị này thành các giao dịch ảo trong hệ thống. Các giao dịch ảo này mang theo Mã giao dịch (Transaction Code) được chỉ định để kích hoạt các Campaign Rule khác (như rule tính toán trả thưởng cuối kỳ). + +## Thuật ngữ liên quan + +- **CEP (Counter Extract & Process)**: Tiến trình trích xuất giá trị từ Counter và xử lý thành giao dịch. +- **Run Schedule**: Lịch trình chạy của tiến trình CEP (Hàng ngày, Hàng tháng, Theo kỳ sao kê...). +- **Counter Bucket**: Nhóm lưu trữ số dư của bộ đếm trong một chu kỳ nhất định (Current, Previous). +- **State (C, A, E)**: Trạng thái của Bucket (C = Created, A = Awarded/Closed, E = Extracted). + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Thông tin chung (General Information) +| Field | Description | Type | +|---|---|---| +| Campaign ID / Rule ID / Name | Mã chiến dịch, mã quy tắc và tên của quy tắc CEP này. | Display / X | +| Rule Type | Loại quy tắc, mặc định là "Counter Extract & Process [CEP]". | Display | +| Effective Date From / To | Khoảng thời gian CEP Rule này có hiệu lực hoạt động. | Date | + +### 2. Cấu hình Trích xuất (Rule Setting) +| Field | Description | Type | +|---|---|---| +| Counter / Bucket to extract | Bộ đếm và Bucket cụ thể sẽ được trích xuất (Current, Previous, Period before Last). Giá trị rút ra sẽ làm "Số tiền giao dịch" (Transaction Amount). | Drop-down | +| Transaction Code | Mã giao dịch ảo sẽ được gắn cho giao dịch sinh ra từ CEP để kích hoạt các Rule nhận thưởng. | Drop-down | +| -ve Bal. Adjust. Transaction Code | Nếu giá trị Counter rút ra bị âm, hệ thống sẽ dùng mã giao dịch này để kích hoạt Rule điều chỉnh giảm (Negative Adjustment). | Drop-down | +| Execution Sequence Number | Thứ tự ưu tiên thực thi nếu có nhiều CEP request cùng chạy. | 9(4) > 0 | + +### 3. Lịch chạy (Run Schedule) +Lịch chạy quyết định thời điểm CEP Batch Job quét và xử lý quy tắc này: +- **Day / Month / Annually**: Chạy lặp lại mỗi N ngày / N tháng (vào ngày cụ thể) / N năm. +- **Statement Cycle**: Chạy vào ngày chốt sao kê của tài khoản. +- **N days after AOD**: Chạy sau N ngày kể từ Ngày mở tài khoản (Account Opened Date). + +## Cách hoạt động (How It Works) + +- **Trích xuất dữ liệu**: Đến thời điểm chạy đã lên lịch (Run Schedule), CEP Batch Job sẽ tìm Counter được chỉ định và bóc tách Bucket mong muốn (Ví dụ: cuối tháng thì bóc "Previous Bucket" của tháng trước). Giá trị tổng lũy kế trong Bucket đó được lấy ra làm `Transaction Amount`. +- **Sinh giao dịch ảo**: Dữ liệu vừa lấy được đóng gói thành một giao dịch (dưới dạng Award hoặc Adjustment tùy thuộc giá trị dương hay âm) với `Transaction Code` đã thiết lập. +- **Kích hoạt Rule đích**: Giao dịch ảo này được đẩy vào hệ thống xử lý giao dịch. Các Campaign Rule khác (đang lắng nghe `Transaction Code` này) sẽ bắt được giao dịch, lấy `Transaction Amount` để đưa vào công thức tính toán và tiến hành trả thưởng. +- **Cập nhật Trạng thái Bucket**: Để tránh trích xuất trùng lặp vào kỳ chạy sau, trạng thái của Bucket sau khi trích xuất sẽ được cập nhật (phụ thuộc vào cấu hình của Counter Definition): + - Đổi từ `C` sang `A` nếu giao dịch sinh ra có thỏa mãn điều kiện nhận thưởng (Hit CP Rule). + - Đổi từ `C` sang `E` nếu chỉ cần trích xuất xong là cập nhật (bất kể có nhận thưởng hay không). + +## Mối quan hệ với modules khác + +- **Counter Definition**: CEP lấy dữ liệu đầu vào trực tiếp từ Counter. Không có Counter thì CEP không có dữ liệu để trích xuất. +- **Transaction Code (TC)**: CEP đóng vai trò là "nguồn phát" giao dịch ảo. Mã TC do CEP gắn vào sẽ quyết định hướng đi của giao dịch. +- **Campaign Rule**: Các quy tắc trả thưởng thông thường đóng vai trò "người nhận", lắng nghe các giao dịch do CEP tạo ra để hoàn tất khâu tính toán và trả điểm. + +## Ví dụ thực tế + +Chiến dịch: "Hoàn tiền 5% tổng chi tiêu tháng trước". +1. Hệ thống có một Counter tích lũy tổng chi tiêu hàng tháng. +2. Thiết lập một CEP Request với cấu hình: + - Counter to extract: Tổng chi tiêu. + - Bucket to extract: Previous Bucket. + - Transaction Code: "CALC_CASHBACK". + - Run Schedule: Monthly, vào ngày 1 hàng tháng. +3. Ngày 1/5, CEP Batch Job chạy. Nó rút "Previous Bucket" (tổng chi tiêu tháng 4) của Khách hàng A, thấy giá trị là 10,000,000 VND. +4. CEP tạo một giao dịch ảo với mã "CALC_CASHBACK" và Amount = 10,000,000. +5. Một Campaign Rule khác nhận giao dịch này, áp dụng công thức 5% * 10,000,000 = 500,000 VND, và cộng thẳng vào Pool hoàn tiền của Khách hàng A. diff --git a/docs/knowledge-cards/campaign/counter_definition.md b/docs/knowledge-cards/campaign/counter_definition.md new file mode 100644 index 0000000..22e5d2c --- /dev/null +++ b/docs/knowledge-cards/campaign/counter_definition.md @@ -0,0 +1,62 @@ +--- +card_id: "campaign/counter_definition" +title: "Định nghĩa Bộ đếm (Counter Definition)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "customer/customer_overview" + - "customer/account" + - "customer/card" +tags: ["counter", "bucket", "tracking", "spend", "frequency", "state counter"] +--- + +# Định nghĩa Bộ đếm (Counter Definition) + +## Mô tả ngắn + +Counter Definition (Định nghĩa Bộ đếm) là công cụ được sử dụng để theo dõi và cộng dồn các chỉ số (tổng chi tiêu, tổng điểm thưởng, số lượng giao dịch...) trong những chu kỳ thời gian nhất định. Các bộ đếm này đóng vai trò quan trọng trong việc thiết lập điều kiện (criteria) cho các Campaign Rule, ví dụ: "tặng thưởng nếu tổng chi tiêu trong tháng lớn hơn $1,000". + +## Thuật ngữ liên quan + +- **Counter (Bộ đếm)**: Cấu hình logic định nghĩa cách thức hệ thống đếm và tích lũy dữ liệu. +- **Bucket (Nhóm lưu trữ)**: Nơi chứa giá trị lũy kế của Counter trong một chu kỳ thời gian cụ thể. +- **State Counter**: Loại bộ đếm đặc biệt, không tự động đóng chu kỳ theo thời gian mà dựa vào một trạng thái (State) do quy trình khác (như Campaign Rule) cập nhật thành "Closed". +- **AOD / COD**: Account Opened Date (Ngày mở tài khoản) / Card Opened Date (Ngày mở thẻ). +- **Late transaction**: Giao dịch bị ghi nhận trễ so với thời gian thực tế phát sinh. + +## Cấu trúc dữ liệu (Data Schema) + +| Field | Description | Type | +|---|---|---| +| Counter Id / Name / Description | Định danh hệ thống, Tên và Mô tả chi tiết của bộ đếm. | X(10) / X(50) / X(200) | +| Effective From / To Date | Khoảng thời gian bộ đếm này có hiệu lực hoạt động. | Date | +| Entity | Cấp độ thực thể mà bộ đếm được theo dõi (Customer, Account, Card). | Drop-down | +| Bucket Period Unit | Chu kỳ của Bucket (Ví dụ: Day, Month, Quarter, Days from AOD/COD, Fixed Date, Non Expiry). | Drop-down | +| Bucket Period Duration(N) | Độ dài của chu kỳ (N). Ví dụ: N=3 và Unit=Month => Bucket 3 tháng. | 9(02) | +| What to count | Chỉ số mà bộ đếm sẽ theo dõi (Ví dụ: Số tiền chi tiêu, Tần suất, Số đơn vị Pool). | Drop-down | +| Reset type / Value | Loại khởi tạo lại (về 0 hoặc về số dư thừa) khi chạm mức Reset Value. Mặc định là 999999999. | Drop-down / 9(14,2) | +| First Start Date (Is Fixed) | Cấu hình cho phép cố định ngày bắt đầu chu kỳ đếm đầu tiên. | Switch / Date | +| Update State When | Thời điểm tự động đóng bucket (chuyển State = 'A'): khi được trích xuất và thỏa Rule (On ward), khi trích xuất (On extract), hoặc không bao giờ (Never). | Radio button | +| Late transaction Posting Option | Cách xử lý giao dịch trễ: Cập nhật vào "Late counter value" hoặc "Current counter bucket". | Radio button | + +## Cách hoạt động (How It Works) + +- **Nguyên lý Bucket hóa**: Khi một giao dịch thỏa mãn điều kiện tích lũy của Counter, hệ thống sẽ xác định thời gian giao dịch để tìm (hoặc tạo mới) một Bucket có chu kỳ tương ứng và cộng dồn giá trị vào đó. +- **Cơ chế đóng Bucket (State)**: + - Mặc định Bucket có trạng thái "C" (Created). + - Nó có thể bị đóng chu kỳ ("Closed" hoặc "A") tự động dựa theo khoảng thời gian (Transaction/Batch Date) hoặc bị đóng ép buộc (đối với State Counter) bởi một quy trình Campaign. + - Sau khi bị đóng, mọi cập nhật mới của Counter sẽ tạo ra và rơi vào một "Bucket hiện tại" (current bucket) mới. +- **Xử lý giao dịch trễ (Late Posting)**: Nếu giao dịch được gửi đến hệ thống khi Bucket tương ứng của nó đã bị đóng (State != C), hệ thống sẽ nhìn vào cấu hình để quyết định: (1) Cộng vào một giá trị "Late Value" riêng biệt của Bucket cũ, hoặc (2) Cộng dồn vào Bucket đang Active ở hiện tại dựa theo ngày ghi nhận (Post date). +- **Ràng buộc cập nhật**: Chỉ cho phép gia hạn (kéo dài End Date) hoặc đổi Tên/Mô tả nếu Counter đã phát sinh dữ liệu (tồn tại trong bảng `counter_stock`). Không cho phép xóa khi đã có dữ liệu. + +## Mối quan hệ với modules khác + +- **Campaign Rule**: Counter được khai báo trong Campaign Rule như một phần của điều kiện xét duyệt (Ví dụ: Counter A > 1000) hoặc dùng làm biến đầu vào để tính toán công thức thưởng. +- **Customer Overview / Account / Card**: Dữ liệu đếm (Bucket) được liên kết và lưu trữ theo từng thực thể khách hàng hoặc tài khoản cụ thể. + +## Ví dụ thực tế + +Thiết lập một "Bộ đếm tần suất thanh toán" (Counter) ở cấp độ **Card**, với **Bucket Period Unit** là `Month Counter` và **Duration(N)** là `1`. +Bộ đếm này theo dõi "Số lượng giao dịch" (Frequency). +Mỗi khi khách hàng cà thẻ, hệ thống cộng 1 vào Bucket của tháng hiện tại. +Một Campaign Rule được tạo với điều kiện: Nếu vào ngày cuối tháng, Bộ đếm này >= 5 (đã thanh toán 5 lần), hệ thống sẽ thưởng cho thẻ đó 50,000 VND. Sau tháng đó, hệ thống tự động tạo Bucket mới có giá trị = 0 cho tháng tiếp theo. diff --git a/docs/knowledge-cards/campaign/item_redemption_rule.md b/docs/knowledge-cards/campaign/item_redemption_rule.md new file mode 100644 index 0000000..cc4948d --- /dev/null +++ b/docs/knowledge-cards/campaign/item_redemption_rule.md @@ -0,0 +1,71 @@ +--- +card_id: "campaign/item_redemption_rule" +title: "Quy tắc Đổi quà (Item Redemption Rule)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "campaign/transaction_codes" + - "catalogue/item_price" +tags: ["ITRD", "redemption", "item", "criteria", "validation"] +--- + +# Quy tắc Đổi quà (Item Redemption Rule) + +## Mô tả ngắn + +Item Redemption Rule (Mã loại quy tắc: ITRD) là một loại Quy tắc Chiến dịch chuyên biệt được sử dụng để kiểm duyệt và đánh giá các giao dịch đổi quà (đổi vật phẩm từ Catalogue). ITRD Rule đóng vai trò như một "người gác cổng", sử dụng bộ lọc tiêu chí (Criteria) để quyết định xem khách hàng hoặc giao dịch có đủ điều kiện đổi quà hay không. + +## Thuật ngữ liên quan + +- **ITRD**: Item Redemption Rule Type. +- **Item Price**: Cấu hình giá trị của món quà, nơi định nghĩa chính xác món quà đó sẽ trừ bao nhiêu điểm và trừ từ Quỹ (Pool) nào. + +## Cấu trúc dữ liệu (Data Schema) + +Vì ITRD là một nhánh của Campaign Rule, cấu trúc của nó vay mượn phần lớn từ quy tắc thưởng (Award Rule), nhưng **bị lược bỏ hoàn toàn 3 thành phần**: Không có Quỹ thưởng (Reward Pool), Không có Công thức tính (Formula), và Không có Phân bổ chi phí (Contributor). + +### 1. Thông tin chung (General Information) +| Field | Description | Type | +|---|---|---| +| Campaign ID / Rule ID / Name | Mã chiến dịch, mã quy tắc và tên của quy tắc. Có thể nằm độc lập hoặc thuộc một Campaign. | Display / X | +| Rule Type | Loại quy tắc, cấu hình cố định là "Item Redemption". | Display | +| Effective Date From / To | Thời gian hiệu lực của quy tắc. | Date | + +### 2. Cấu hình Quy tắc (Rule Setting) +| Field | Description | Type | +|---|---|---| +| Effective Period is Based On | Tiêu chí tính ngày hiệu lực dựa trên Ngày giao dịch thực tế (Transaction Date) hay Ngày hệ thống xử lý (Batch Date). | Radio button | +| Message Template ID | Mẫu tin nhắn (SMS/Email) tự động gửi cho khách hàng nếu giao dịch đổi quà khớp (hit) quy tắc này. | Drop-down | +| Stop if criteria met | Nếu BẬT (Yes), hệ thống sẽ ngừng xét duyệt các quy tắc ITRD tiếp theo nếu quy tắc này đã khớp. | Switch | + +### 3. Liên kết Mã giao dịch (Linked Transaction Code) +| Field | Description | Type | +|---|---|---| +| Transaction Code | Mã giao dịch (OLS TC) dùng để kích hoạt Rule này. Bắt buộc phải có ít nhất 1 TC và duy nhất trong nội bộ Rule. | Drop-down | +| Execution Sequence | Trình tự thực thi của quy tắc. Dùng để xếp hạng ưu tiên khi hệ thống xử lý nhiều quy tắc cùng gắn chung 1 TC. | 9(04) > 0 | + +### 4. Tiêu chí Xét duyệt (Rule Criteria) +- Sử dụng Query Builder giống hệt cấu trúc Criteria của Award Rule để cấu hình các điều kiện hợp lệ. (Ví dụ: Chỉ áp dụng cho hạng thẻ Platinum). + +## Cách hoạt động (How It Works) + +- **Cấu hình độc lập với Cấu trúc giá**: Khác với quy tắc tặng thưởng (phải định nghĩa tặng bao nhiêu, từ quỹ nào), ITRD chỉ trả lời câu hỏi "Được phép hay Không được phép đổi?". Còn việc "Trừ bao nhiêu điểm và trừ quỹ nào?" được hệ thống lấy từ cấu hình giá (Item Price) của chính món quà đó trong Catalogue. +- **Xác thực giao dịch (Validation)**: Khi một yêu cầu đổi quà gửi đến hệ thống kèm theo một Mã giao dịch (Redemption TC), hệ thống quét tìm tất cả các ITRD Rule gắn với TC đó. +- **Duyệt điều kiện**: Hệ thống chạy kiểm tra thông tin khách hàng/giao dịch với bộ lọc Criteria của Rule. Nếu thỏa mãn toàn bộ điều kiện, giao dịch được đánh giá là Hợp lệ và tiến trình trừ điểm bắt đầu. Nếu không có ITRD Rule nào được cấu hình hoặc giao dịch trượt mọi Criteria, yêu cầu đổi quà bị từ chối. + +## Mối quan hệ với modules khác + +- **Campaign Rule**: ITRD là một biến thể của Campaign Rule, kế thừa logic kiểm tra điều kiện (Criteria) nhưng khác biệt về luồng xử lý đầu ra. +- **Transaction Codes**: Đóng vai trò là cầu nối định tuyến giao dịch đổi quà vào đúng bộ quy tắc ITRD để kiểm tra. +- **Item Price**: ITRD phụ trách mảng "Kiểm duyệt điều kiện", trong khi Item Price phụ trách mảng "Thanh toán/Trừ điểm". Hai module này kết hợp với nhau để hoàn tất một luồng đổi quà. + +## Ví dụ thực tế + +Ngân hàng muốn tung ra chương trình: "Chỉ khách hàng hạng Platinum mới được phép đổi Tai nghe Apple AirPods". +1. Trong Catalogue, cấu hình `Item Price` cho AirPods là 500,000 điểm. +2. Quản trị viên thiết lập một `Item Redemption Rule (ITRD)`: + - Gắn với `Transaction Code` = "REDEEM_VIP_GIFT". + - Thiết lập `Criteria`: Hạng tài khoản (Account Level) = 'Platinum'. +3. Khi khách hàng thao tác đổi tai nghe, ứng dụng gửi giao dịch kèm mã "REDEEM_VIP_GIFT". +4. Khách hàng A (Hạng Gold) -> Trượt `Criteria` của ITRD -> Giao dịch bị từ chối. +5. Khách hàng B (Hạng Platinum) -> Khớp `Criteria` của ITRD -> Hệ thống cho qua vòng kiểm duyệt, chuyển sang đọc `Item Price` và tiến hành trừ 500,000 điểm của B. diff --git a/docs/knowledge-cards/campaign/pool_conversion_rate.md b/docs/knowledge-cards/campaign/pool_conversion_rate.md new file mode 100644 index 0000000..e15c4ae --- /dev/null +++ b/docs/knowledge-cards/campaign/pool_conversion_rate.md @@ -0,0 +1,62 @@ +--- +card_id: "campaign/pool_conversion_rate" +title: "Tỷ lệ chuyển đổi Quỹ (Pool Conversion Rate)" +domain: "campaign" +related_cards: + - "campaign/pool_definition" + - "customer/transaction_history" +tags: ["conversion rate", "buy rate", "sell rate", "currency", "GL"] +--- + +# Tỷ lệ chuyển đổi Quỹ (Pool Conversion Rate) + +## Mô tả ngắn + +Pool Conversion Rate (Tỷ lệ chuyển đổi Quỹ) quản lý tỷ giá quy đổi giữa đơn vị của một Pool (ví dụ: Điểm) và đồng tiền cơ sở (Base Currency) của hệ thống (ví dụ: VND). Tỷ lệ này được sử dụng để định giá các giao dịch cấp phát (award), đổi điểm (redeem), và điều chỉnh (adjustment) nhằm ghi nhận vào hệ thống Sổ cái (GL - General Ledger). + +## Thuật ngữ liên quan + +- **Base Currency**: Đồng tiền cơ sở của hệ thống để làm chuẩn quy đổi giá trị tài chính. +- **Buy Rate**: Tỷ giá mua, là lượng Base Currency cần thiết để mua 1 đơn vị Pool. +- **Sell Rate**: Tỷ giá bán, là lượng Base Currency thu lại khi tiêu/đổi 1 đơn vị Pool. +- **Effective Record**: Bản ghi tỷ giá đang trong thời gian có hiệu lực (từ Start Date đến End Date). +- **GL (General Ledger)**: Sổ cái kế toán, nơi ghi nhận các hạch toán tài chính của các giao dịch cấp phát/tiêu điểm. + +## Cấu trúc dữ liệu (Data Schema) + +### Mã tỷ lệ chuyển đổi (Pool Conversion Rate Code) +| Field | Description | Type | +|---|---|---| +| Pool conversion Rate Code | Mã đại diện cho tỷ lệ chuyển đổi, chứa ít nhất một chữ cái. | X(10) | +| Description | Tên mô tả của loại tiền tệ/tỷ giá (hiển thị trên dropdown, báo cáo). | X(30) | + +### Chi tiết Tỷ lệ chuyển đổi (Pool conversion Rate) +| Field | Description | Type | +|---|---|---| +| Buy Rate | Số lượng Base Currency cần để mua 1 đơn vị Pool. Dùng để định giá các giao dịch cộng điểm/cấp phát để hạch toán lên GL. | 9(6,2) > 0 | +| Sell Rate | Số lượng Base Currency nhận được khi đổi 1 đơn vị Pool. Dùng để định giá các giao dịch tiêu điểm/trừ điểm (non-catalogue) để hạch toán lên GL. | 9(6,2) > 0 | +| Effective From Date | Ngày bắt đầu hiệu lực của tỷ giá. | Date | +| Effective End Date | Ngày kết thúc hiệu lực của tỷ giá (phải >= From Date). | Date | + +## Cách hoạt động (How It Works) + +- **Định giá giao dịch cộng điểm (Award/Positive Adjust)**: Khi có giao dịch thưởng điểm hoặc điều chỉnh tăng, hệ thống dùng **Buy Rate** có hiệu lực tại thời điểm đó để tính giá trị tài chính của điểm, sau đó gửi thông tin này để ghi sổ cái (GL). +- **Định giá giao dịch trừ điểm (Redeem/Negative Adjust)**: Khi có giao dịch đổi điểm (cho các phần thưởng không nằm trong catalogue) hoặc điều chỉnh giảm, hệ thống dùng **Sell Rate** có hiệu lực tại thời điểm đó để tính toán chi phí (cost) và ghi sổ cái. +- **Xác định tỷ giá có hiệu lực**: Một Pool Conversion Rate Code có thể có nhiều bản ghi tỷ giá với khoảng thời gian khác nhau (Start Date - End Date). Trong trường hợp có nhiều bản ghi cùng có hiệu lực tại một thời điểm, hệ thống sẽ ưu tiên sử dụng bản ghi có Start Date gần nhất (latest). + +## Mối quan hệ với modules khác + +- **Pool Definition**: Mỗi Pool phải được gắn với một Pool Conversion Rate Code. Khi xử lý giao dịch trên Pool, tỷ lệ quy đổi của Code này sẽ được áp dụng. +- **Transaction History**: Các giao dịch phát sinh sẽ tra cứu tỷ giá từ cấu hình này để lưu giá trị tài chính quy đổi. + +## Ví dụ thực tế + +Tạo mã quy đổi "PNT_VND" cho quỹ điểm Loyalty. +Base Currency là VND. +Cấu hình tỷ giá: +- Buy Rate = 100 (Cần 100 VND để sinh ra 1 điểm). +- Sell Rate = 80 (Khách hàng tiêu 1 điểm tương đương 80 VND). +- Effective: 01/01/2026 đến 31/12/2026. + +Khi khách hàng được thưởng 50 điểm, hệ thống tính toán giá trị: 50 * 100 = 5,000 VND và đẩy bút toán ghi nợ 5,000 VND vào GL. +Khi khách hàng tiêu 20 điểm, chi phí ghi nhận là 20 * 80 = 1,600 VND. diff --git a/docs/knowledge-cards/campaign/pool_definition.md b/docs/knowledge-cards/campaign/pool_definition.md new file mode 100644 index 0000000..aa69697 --- /dev/null +++ b/docs/knowledge-cards/campaign/pool_definition.md @@ -0,0 +1,74 @@ +--- +card_id: "campaign/pool_definition" +title: "Định nghĩa Quỹ Thưởng (Pool Definition)" +domain: "campaign" +related_cards: + - "customer/customer_overview" + - "customer/account" + - "customer/card" + - "campaign/account_type_group" + - "campaign/campaign_rule" +tags: ["pool", "bucket", "balance", "expiry policy", "velocity control"] +detail_refs: + - "campaign/expiry_policies" + - "campaign/velocity_control_detail" +--- + +# Định nghĩa Quỹ Thưởng (Pool Definition) + +## Mô tả ngắn + +Pool Definition là một cấu trúc dữ liệu cốt lõi dùng để theo dõi và quản lý các giá trị được lưu trữ như điểm thưởng (rewards), tiền mặt (cash balances), vé rút thăm trúng thưởng (lucky draw chances), hoặc E-voucher. Mỗi Pool được gắn với một loại phần thưởng cụ thể, sử dụng một đơn vị tiền tệ riêng (Currency Code), và quản lý số dư theo các nhóm (Buckets) dựa trên hạn sử dụng. + +## Thuật ngữ liên quan + +- **Pool (Quỹ)**: Nơi lưu trữ và theo dõi số dư của một loại phần thưởng cụ thể. +- **Bucket (Nhóm số dư)**: Một phần của Pool chứa số dư có cùng ngày hết hạn và loại tài khoản (Account Type). +- **Currency Code**: Đơn vị tính toán số dư trong Pool (VD: VND cho tiền mặt, PNT cho điểm thưởng). +- **Expiry Policy (Chính sách hết hạn)**: Quy tắc xác định ngày hết hạn cho các số dư khi được cộng vào Pool. +- **Velocity Control**: Cơ chế kiểm soát và giới hạn số lượng điểm (thưởng/đổi/điều chỉnh) dựa trên thực thể và thời gian (ví dụ: giới hạn đổi điểm mỗi tháng). + +## Cấu trúc dữ liệu (Data Schema) + +### Thông tin chung (General Information) +| Field | Description | Type | +|---|---|---| +| Pool Id / Name | Định danh hệ thống và tên của quỹ thưởng. | X(10) / X(30) | +| Pool Type | Loại quỹ thưởng (Points, Cash Rebate, Lucky Draw chances, EVoucher). | Drop-down | +| Expiry Policy | Xác định cách hệ thống tính ngày hết hạn cho số dư mới (Inactive cho Evoucher). | Drop-down | +| Ripening Period | Số ngày kể từ ngày giao dịch sau đó phần thưởng mới đủ điều kiện đổi (Redemption). | 9(5) | +| Pool Conversion Rate Code | Mã tiền tệ hoặc tỷ lệ quy đổi đại diện cho một đơn vị thưởng trong Pool. | Drop-down | +| Allow Negative Balance | Cờ cho phép số dư Pool bị âm trong các trường hợp điều chỉnh hoặc hoàn tác (reversal). | Switch | +| Entity level | Cấp độ theo dõi số dư Pool: Customer (Khách hàng), Account (Tài khoản), hoặc Card (Thẻ). | Radio button | +| Grace Period | Số tháng giữ lại các bucket đã hết hạn trước khi xóa hẳn. | 9(2) | + +### Thông số kiểm soát (Velocity Control & Specific Policy) +| Field | Description | Type | +|---|---|---| +| Product Account Level / Type | Cấp độ và loại tài khoản bị giới hạn chỉ được dùng Pool này. | Drop-down | +| Maximum | Số lượng đơn vị Pool tối đa, nếu vượt quá sẽ kích hoạt cảnh báo (Alert). | 9(10,2) | +| Transaction Type | Loại giao dịch bị kiểm soát (Award, Redeem, Adjust). | Drop-down | +| Units | Đơn vị kiểm soát (Trên số đơn vị Pool hoặc Trên mỗi giao dịch). | Drop-down | +| Per period | Chu kỳ kiểm soát (Quarter, Month, Week, Day). | Drop-down | +| Alert Template / Group | Mẫu thông báo và nhóm người nhận sẽ được gửi cảnh báo nếu vượt mức. | Drop-down | + +## Cách hoạt động (How It Works) + +- **Cấu trúc lưu trữ (Buckets)**: Khi số dư trong Pool được tăng lên (earned), hệ thống sử dụng Expiry Policy để xác định ngày hết hạn. Số lượng này sau đó được lưu vào một "Bucket" tương ứng. Mỗi Pool có thể có nhiều Bucket khác nhau, phân tách bằng Ngày hết hạn và Loại tài khoản. +- **Phân cấp thực thể (Entity Level)**: + - Nếu Pool cấu hình ở cấp độ **Card**, mỗi bucket sẽ tương ứng với một thẻ cụ thể (Card number) và khoảng thời gian nhất định. + - Nếu cấu hình ở cấp độ **Account** hoặc **Customer**, bucket sẽ tương ứng với Account đó. +- **Quy tắc hết hạn (Expiry & Grace Period)**: Khi bucket đến hạn, số dư chuyển sang trạng thái "Số dư quá hạn" (Expired balance). Số dư này tiếp tục được giữ lại trong khoảng thời gian ân hạn (Grace Period) trước khi bị xóa bỏ hoàn toàn (forfeited). +- **Kiểm soát vận tốc (Velocity Control)**: Pool có thể thiết lập các mức trần cho các giao dịch (thưởng/đổi) trong một khoảng thời gian (Ngày, Tuần, Tháng, Quý) trên từng thực thể. Nếu vượt qua giới hạn này, cảnh báo (alert) sẽ tự động gửi đi. + +## Mối quan hệ với modules khác + +- **Customer Overview / Account / Card**: Pool phải thuộc về một Loyalty Account cụ thể, được định nghĩa thông qua Entity level (cấp Khách hàng, Tài khoản, hoặc Thẻ). +- **Campaign Rule**: Pool Definition được sử dụng làm đích đến để trả thưởng trong các Campaign Rule. Mỗi Rule thưởng phải chỉ định nạp vào Pool nào. +- **Account Type Group**: Có thể được cấu hình (optional) để giới hạn các giao dịch của các loại tài khoản thuộc nhóm này mới được thao tác vào Pool. + +## Ví dụ thực tế + +Tạo một Pool tên "Quỹ Điểm Thưởng Khách Hàng VIP" (Pool Type: Points) với Entity level là Customer. Tỷ lệ hết hạn (Expiry Policy) là 1 năm kể từ ngày thưởng. +Mỗi khi khách hàng phát sinh giao dịch nhận điểm, điểm này được cho vào một Bucket có ngày hết hạn tương ứng là đúng 1 năm sau. +Pool này cài đặt Velocity Control: Chỉ cho phép đổi điểm (Redeem) tối đa 10,000 điểm mỗi tháng. Nếu khách hàng thực hiện lệnh đổi 12,000 điểm, hệ thống sẽ chặn 2,000 điểm vượt mức và kích hoạt thông báo (Alert Template) gửi về trung tâm vận hành. diff --git a/docs/knowledge-cards/campaign/rep_rule.md b/docs/knowledge-cards/campaign/rep_rule.md new file mode 100644 index 0000000..fa52a4b --- /dev/null +++ b/docs/knowledge-cards/campaign/rep_rule.md @@ -0,0 +1,75 @@ +--- +card_id: "campaign/rep_rule" +title: "Quy tắc Đổi thưởng và Xử lý tự động (REP Rule)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "campaign/pool_definition" + - "campaign/transaction_codes" +tags: ["REP", "redemption", "extract", "cash rebate", "batch"] +detail_refs: + - "campaign/batch_rule_processing" +--- + +# Quy tắc Đổi thưởng và Xử lý tự động (REP Rule) + +## Mô tả ngắn + +Redemption Extract & Process (REP) Rule là một loại Quy tắc Chiến dịch đặc biệt, đóng vai trò như một tác vụ lên lịch tự động (batch job). REP có nhiệm vụ định kỳ quét và trích xuất toàn bộ số dư từ một Quỹ thưởng (Pool) được chỉ định, sau đó tự động thực hiện lệnh đổi thưởng (Redeem) để xuất ra dưới dạng tiền hoàn (Cash Rebate) hoặc điểm đối tác (VD: dặm bay bay) chuyển đến hệ thống bên ngoài. + +## Thuật ngữ liên quan + +- **REP (Redeem Extract & Process)**: Quy trình tự động trích xuất số dư quỹ và sinh giao dịch đổi thưởng. +- **Cash Rebate**: Hoàn tiền mặt, một dạng output phổ biến của REP khi trích xuất điểm để quy đổi thành tiền đẩy về tài khoản thanh toán của khách. +- **Minimum Pool Balance**: Số dư quỹ tối thiểu cần phải có để REP kích hoạt việc rút điểm. +- **Output Redemption As**: Hình thức và kênh xuất dữ liệu sau khi đổi thưởng (Ví dụ: xuất file ghi nhận Cash Rebate gửi hệ thống Core Banking). + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Thông tin chung (General Information) +| Field | Description | Type | +|---|---|---| +| Campaign ID / Rule ID / Name | Mã chiến dịch, mã quy tắc và tên của quy tắc REP. | Display / X | +| Rule Type | Loại quy tắc, cấu hình cố định là "Redeem Extract & Process [REP]". | Display | +| Effective Date From / To | Khoảng thời gian REP Rule này có hiệu lực hoạt động. | Date | + +### 2. Cấu hình Đổi thưởng (Rule Setting) +| Field | Description | Type | +|---|---|---| +| Pool to Extract | Quỹ thưởng (Pool) sẽ bị rút sạch số dư (full amount) để đổi thưởng. Các chiến dịch dùng REP nên cấu hình Pool chuyên biệt để tránh rút nhầm số dư của chiến dịch khác. | Drop-down | +| Minimum Pool Balance | Số điểm tối thiểu mà Pool phải đạt được thì REP Batch mới thực hiện trích xuất. | 9(12,2) | +| Trigger Campaign rule | Nếu bật (ON), REP sẽ kích hoạt thêm một Campaign Rule khác để kiểm tra điều kiện phụ và tính toán lại số điểm được rút (Rút mức nhỏ hơn giữa số dư hiện tại và kết quả công thức). | Switch | +| Redeem TC | Mã giao dịch (Transaction Code) sẽ được hệ thống gán cho giao dịch đổi điểm sinh ra. | Drop-down | +| Redeem Transaction Description | Mô tả ngắn ghi nhận trên giao dịch đổi thưởng. | X(50) | +| Output Redemption As | Kênh xuất file hoặc định dạng đầu ra cho hệ thống bên ngoài (Ví dụ: Cash Rebate to External System). | Drop-down | +| -ve Bal. Adjust. Transaction Code | Mã giao dịch điều chỉnh giảm (Negative Adjustment) sẽ dùng nếu quá trình trích xuất gặp số dư âm. | Drop-down | + +### 3. Lịch chạy (Run Schedule) +Lịch cấu hình thời điểm hệ thống tự động chạy REP Batch: +- **Day / Month / Annually**: Chạy lặp lại mỗi N ngày / tháng / năm tại một thời điểm nhất định. +- **Statement Cycle**: Chạy vào kỳ sao kê. Hệ thống chỉ bóc tách các tài khoản có ngày sao kê trùng với ngày chạy batch. +- **N days/months from AOD**: Chạy vào N ngày hoặc N tháng sau Ngày mở tài khoản (Account Opened Date). + +## Cách hoạt động (How It Works) + +- **Quét theo lịch trình**: Theo đúng lịch cấu hình (Run Schedule), hệ thống REP Batch khởi động và tìm kiếm những khách hàng/tài khoản thỏa mãn điều kiện thời gian. +- **Kiểm tra số dư (Balance Check)**: Hệ thống tra cứu Pool được cấu hình (`Pool to Extract`) của tài khoản đó. Nếu số dư hiện tại lớn hơn hoặc bằng `Minimum Pool Balance`, hệ thống sẽ tiếp tục. +- **Đổi thưởng tự động (Auto-Redemption)**: Hệ thống trích xuất toàn bộ số dư khả dụng trong Pool đó và tạo ra một giao dịch Redeem với mã `Redeem TC` tương ứng. Giao dịch này sẽ trừ sạch điểm trong Pool (hoặc trừ theo mức đã tính toán lại nếu có bật `Trigger Campaign rule`). +- **Gửi hệ thống ngoài (Output)**: Số điểm vừa bị trừ đi sẽ được hệ thống đóng gói theo định dạng cấu hình ở `Output Redemption As` và chuyển đến hệ thống khác (ví dụ: tạo file chuyển tiền cho Core Banking). + +## Mối quan hệ với modules khác + +- **Pool Definition**: Điểm đến của REP. REP trực tiếp thao tác rút sạch số dư của một Pool. +- **Campaign Rule**: REP có thể đóng vai trò kích hoạt (trigger) một Campaign Rule thông thường để vay mượn logic kiểm tra điều kiện phức tạp trước khi đổi thưởng. +- **Transaction Code**: REP tạo ra các giao dịch tự động nên cần mượn cấu hình Transaction Code để ghi nhận đúng vào hệ thống kế toán. + +## Ví dụ thực tế + +Ngân hàng có chương trình "Hoàn tiền thẻ tín dụng hàng tháng". +1. Khi khách quẹt thẻ, một Campaign Rule cấp phát điểm Cash-back vào Pool "Hoàn Tiền Thẻ". +2. Ngân hàng thiết lập một quy tắc REP (REP Rule) chạy vào ngày mùng 5 hàng tháng (Run Schedule: Monthly, Day = 5). +3. Cấu hình REP: + - Pool to Extract = "Hoàn Tiền Thẻ" + - Minimum Pool Balance = 100,000. + - Output Redemption As = "Cash Rebate to External System". +4. Ngày 5/5, Batch chạy. Khách hàng B có 150,000 điểm trong Pool "Hoàn Tiền Thẻ". Do 150,000 > 100,000, REP trích xuất toàn bộ 150,000 điểm, tạo giao dịch Redeem trừ sạch Pool của khách, đồng thời sinh file gửi Core Banking để nạp 150,000 VND vào thẻ tín dụng cho khách hàng B. diff --git a/docs/knowledge-cards/campaign/reward_campaign.md b/docs/knowledge-cards/campaign/reward_campaign.md new file mode 100644 index 0000000..2ef2b1f --- /dev/null +++ b/docs/knowledge-cards/campaign/reward_campaign.md @@ -0,0 +1,78 @@ +--- +card_id: "campaign/reward_campaign" +title: "Chiến dịch Thưởng (Reward Campaign)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "customer/pool_balance" + - "campaign/cep_request" +tags: ["campaign", "award", "accumulate", "counter", "redemption"] +--- + +# Chiến dịch Thưởng (Reward Campaign) + +## Mô tả ngắn + +Chiến dịch Thưởng (Reward Campaign) là thực thể cốt lõi định nghĩa các chương trình ưu đãi, cấp điểm thưởng hoặc hoàn tiền cho khách hàng. Mỗi chiến dịch có thể chứa nhiều Quy tắc (Campaign Rules). Tùy vào cách cấu hình, chiến dịch có thể hoạt động theo cơ chế cấp thưởng ngay lập tức trên từng giao dịch, hoặc tích lũy tổng chi tiêu qua một bộ đếm (Counter) để xét thưởng vào cuối kỳ. + +## Thuật ngữ liên quan + +- **Base / Tactical Campaign**: Base là chiến dịch nền tảng áp dụng rộng rãi và lâu dài; Tactical là chiến dịch ngắn hạn với mục tiêu cụ thể (ví dụ: đẩy mạnh chi tiêu ngoại tệ tháng này). +- **Counter (Bộ đếm)**: Thực thể lưu trữ cộng dồn các chỉ số (tổng chi tiêu, số lượng giao dịch, tổng điểm) của một khách hàng trong một khoảng thời gian (Period). +- **Auto-redemption**: Cơ chế tự động đổi phần thưởng vừa cấp (VD: dặm bay) để chuyển trực tiếp sang hệ thống đối tác bên ngoài mà khách hàng không cần tự thao tác. + +## Cấu trúc dữ liệu (Data Schema) + +Thực thể Chiến dịch (Campaign) chỉ lưu trữ các thông tin định danh và mục tiêu cấp cao, trong khi logic kinh doanh chi tiết được đẩy xuống các Campaign Rules. + +### 1. Định danh và Phân loại +- **Campaign ID / Name**: Mã và tên định danh chiến dịch. +- **Campaign Type**: Loại chiến dịch (Base hoặc Tactical). +- **Campaign Period**: Không được nhập tay ở cấp độ Campaign, mà được hệ thống **tính toán động (derived)**: Start Date bằng ngày bắt đầu sớm nhất của Rule, và End Date bằng ngày kết thúc muộn nhất của Rule trong chiến dịch đó. + +### 2. Mục tiêu (Target Metrics) +- **Target Active Customer Count**: Số lượng khách hàng dự kiến tham gia. +- **Target Average Transaction Value**: Mục tiêu tổng giá trị chi tiêu cần đạt. +*(Các chỉ số này dùng để so sánh với kết quả thực tế trên Dashboard Insight).* + +### 3. Bộ đếm (Counter Definition) +Counter là một phần cấu trúc quan trọng hỗ trợ Campaign, bao gồm: +- **Entity**: Cấp độ đếm (Customer, Account, Card, Store, v.v.). +- **Entity Counted**: Chỉ số cần đếm: GA (Gross Amount), NA (Nett Amount), PT (Points), TX (Transactions), QT (Quantity). +- **Period Unit & Length**: Đơn vị tính chu kỳ (Day, Week, Month, Quarter) và độ dài. (VD: 1 Month). +- **FSD (First Start Date) & BED (Bucket End Date)**: Ngày bắt đầu của chu kỳ đếm đầu tiên, và ngày chốt sổ của chu kỳ. Hệ thống tự động xoay vòng BED cho các chu kỳ tiếp theo. +- **Reset Value / Keep Remainder**: Mức giá trị để reset bộ đếm, và có giữ lại phần dư hay không (modulus). + +## Phân loại Cơ chế Cấp thưởng (Campaign Mechanics) + +### 1. Award on Every Transaction (Cấp thưởng tức thời) +- Áp dụng cho các chiến dịch có rule đơn giản (VD: mua 100K tặng 10 điểm). +- **Luồng xử lý**: Giao dịch (từ Core, POS hoặc qua CEP) chạy vào hệ thống -> Quét Campaign Rule -> Tính toán theo công thức -> Trích điểm từ Reward Pool và cộng trực tiếp vào Pool Balance của khách hàng ngay tại thời điểm xử lý (Real-time hoặc Batch). + +### 2. Accumulate Then Award (Tích lũy rồi cấp thưởng) +- Áp dụng khi phần thưởng phụ thuộc vào tổng mức độ hoàn thành trong một kỳ (VD: chi tiêu tổng > 1,000$ trong tháng mới được thưởng 20%). +- **Luồng xử lý**: + - Giao dịch phát sinh -> Quét Campaign Rule 1 -> Cộng dồn giá trị vào **Counter** tương ứng. + - Đến ngày chốt kỳ (BED) -> Quét Campaign Rule 2 -> Lấy tổng giá trị trong Counter ra làm Input -> Tính toán công thức -> Cấp thưởng. + +## Cơ chế Trừ điểm (Bucket Deduction Sequence) + +Mặc dù quy tắc cấp thưởng được định nghĩa ở Campaign, hệ thống có một quy chuẩn cố định về việc trừ điểm khi khách hàng sử dụng (Redeem) như sau: +1. **Ưu tiên Expiry Date**: Các Buckets có ngày hết hạn sớm nhất (Earliest Expiry Date) sẽ bị trừ trước (FIFO). +2. **Ưu tiên Account Type**: Nếu có nhiều buckets cùng ngày hết hạn, hệ thống sẽ dựa vào mức độ ưu tiên của Account Type được cấu hình để trừ. +3. Không tự động trừ vào các buckets đã hết hạn (Expired), trừ phi có sự can thiệp thủ công từ Supervisor qua màn hình Admin (Operations Adjustment). + +## Mối quan hệ với modules khác + +- **Campaign Rule**: Campaign là "vỏ" chứa nhiều Rule. Rule mới quyết định công thức tính điểm và giới hạn. +- **Pool Balance / LAB**: Kết quả của Campaign là sinh ra các giao dịch (Awards) làm tăng số dư trong Pool của khách. +- **CEP (Complex Event Processing)**: Sinh ra các giao dịch ảo kích hoạt Campaign (VD: Khách hàng sinh nhật). + +## Ví dụ thực tế + +Tạo chiến dịch "Kích cầu chi tiêu Hè" (Tactical): +- Mục tiêu khách hàng (Target): 10,000 khách. +- Cơ chế **Accumulate Then Award**: Khách chi tiêu thẻ Visa > 50,000,000 VND trong 1 tháng sẽ được tặng 5,000 điểm. +- Hệ thống thiết lập 1 **Counter** (Entity Counted = Nett Amount, Period Unit = Month, Length = 1). +- Rule 1: Cộng dồn mọi giao dịch mua sắm thẻ Visa vào Counter. +- Rule 2 (kích hoạt cuối tháng): Nếu Counter.Balance > 50,000,000 -> Award 5,000 điểm. diff --git a/docs/knowledge-cards/campaign/transaction_codes.md b/docs/knowledge-cards/campaign/transaction_codes.md new file mode 100644 index 0000000..dbbe26a --- /dev/null +++ b/docs/knowledge-cards/campaign/transaction_codes.md @@ -0,0 +1,65 @@ +--- +card_id: "campaign/transaction_codes" +title: "Định danh Giao dịch (Transaction Codes & Category)" +domain: "campaign" +related_cards: + - "campaign/campaign_rule" + - "customer/operations_transaction" +tags: ["transaction code", "TC", "mapping", "category", "criteria"] +--- + +# Định danh Giao dịch (Transaction Codes & Category) + +## Mô tả ngắn + +Để hệ thống OLS có thể hiểu và định tuyến các giao dịch (từ bên ngoài hoặc nội bộ) vào đúng các quy tắc chiến dịch (Campaign Rules) phù hợp, hệ thống sử dụng cơ chế ánh xạ thông qua 3 thực thể cấu hình: **External Transaction Code** (Mã giao dịch ngoài), **OLS Transaction Code** (Mã giao dịch nội bộ) và **Transaction Category** (Danh mục giao dịch). + +## Thuật ngữ liên quan + +- **TC (Transaction Code)**: Mã giao dịch, dùng để định danh loại nghiệp vụ (ví dụ: Thanh toán POS, Rút tiền mặt, Hoàn tiền). +- **External TC**: Mã giao dịch nguyên bản được truyền vào từ các hệ thống nguồn (Core Banking, Card System). +- **OLS TC**: Mã giao dịch được chuẩn hóa bên trong hệ thống OLS. Đây là chìa khóa đầu tiên (First key) để hệ thống tra cứu xem giao dịch sẽ kích hoạt Rule nào. + +## Cấu trúc dữ liệu và Ánh xạ (Data Schema & Mapping) + +### 1. External Transaction Code +- **External TC**: Mã định danh (ví dụ: `TC4000`, `ATM_WDL`). +- **Description**: Mô tả loại giao dịch từ hệ thống nguồn để dễ nhận diện. +- **Ràng buộc**: Mỗi External TC khi được nhận vào hệ thống **bắt buộc** phải được ánh xạ (map) tới duy nhất một OLS TC. + +### 2. OLS Transaction Code +- **OLS TC**: Mã chuẩn hóa nội bộ của OLS. +- **Mapping (1-N)**: Một OLS TC có thể nhận ánh xạ từ một hoặc nhiều External TCs (Ví dụ: `TC4000` của hệ thống thẻ Credit và `TC5000` của hệ thống thẻ Debit cùng map về OLS TC `PURCHASE`). +- **Nguồn nội bộ**: OLS TC không bắt buộc phải có External TC đi kèm. Các giao dịch phát sinh hoàn toàn từ nội bộ (như CEP sinh ra, hoặc Award Transaction thủ công) có thể dùng thẳng OLS TC mà không cần qua bước mapping. +- **Reversal Indicator**: Cờ (công tắc) báo hiệu đây là giao dịch hoàn trả/hủy (Reversal) hay giao dịch bình thường (Normal). + +### 3. Transaction Category (Danh mục giao dịch) +- **Định nghĩa**: Là một cấu hình tập hợp nhiều tiêu chí (Criteria) tạo thành một biểu thức logic phức tạp, được lưu lại dưới một cái tên (Code) duy nhất. +- **Cấu trúc**: + - Transaction Category Code & Name. + - Configuration: Sử dụng Query Builder (kéo thả) để tạo các nhóm tiêu chí (AND/OR). Hỗ trợ cả công tắc đảo ngược logic (NOT) để loại trừ (Exclusion). +- **Mục đích (Tái sử dụng)**: Thay vì phải cấu hình một cụm điều kiện dài dòng (Ví dụ: `MCC = Dining AND Currency = Local AND Is_DCC = True`) lặp đi lặp lại trên nhiều Campaign Rules, người quản trị cấu hình thành `TxCat1`. Sau đó, trong Campaign Rule, chỉ cần chọn tiêu chí `Transaction Category = TxCat1`. + +## Cách hoạt động (How It Works) + +1. **Giai đoạn tiếp nhận giao dịch**: + - Giao dịch đổ vào hệ thống mang theo External TC (ví dụ `05`). + - Hệ thống tra bảng ánh xạ, chuyển `05` thành OLS TC `RETAIL_SPEND`. +2. **Giai đoạn định tuyến Rule**: + - Engine tìm kiếm tất cả các Campaign Rules đang Active có khai báo OLS TC là `RETAIL_SPEND`. + - Nếu Rule đó có sử dụng Transaction Category làm tiêu chí (Criteria), engine sẽ "bung" category đó ra để đối chiếu thêm các trường dữ liệu thực tế (MCC, Currency, Amount) của giao dịch có khớp với biểu thức Category hay không. +3. **Giai đoạn xử lý**: Nếu toàn bộ điều kiện khớp, giao dịch được tính hợp lệ để chạy công thức cấp thưởng. + +## Mối quan hệ với modules khác + +- **Campaign Rule**: Sử dụng OLS TC và Transaction Category như một phần cốt lõi trong "Rule Criteria" để lọc giao dịch. +- **Operations Transaction**: Khi nhân viên tạo "Award Transaction" thủ công (để giả lập giao dịch gửi vào Rule Engine), họ sẽ phải chọn trực tiếp OLS TC (không dùng External TC). + +## Ví dụ thực tế + +Ngân hàng chạy chiến dịch: "Tặng 5% khi ăn uống bằng ngoại tệ" và "Tặng 2% khi ăn uống trong nước". +Thay vì cấu hình lại nguyên cụm MCC Ẩm thực nhiều lần: +1. Tạo Transaction Category 1: `CAT_DINING` = (MCC in [5812, 5814]). +2. Tạo Campaign Rule 1: TC = `PURCHASE` AND Transaction Category = `CAT_DINING` AND Currency != `VND`. Rate = 5%. +3. Tạo Campaign Rule 2: TC = `PURCHASE` AND Transaction Category = `CAT_DINING` AND Currency = `VND`. Rate = 2%. +Khi giao dịch đến mang External TC `TC4000` (được map về OLS TC `PURCHASE`), hệ thống sẽ đối chiếu và chia nhánh xử lý mượt mà. diff --git a/docs/knowledge-cards/catalogue/catalogue_category.md b/docs/knowledge-cards/catalogue/catalogue_category.md new file mode 100644 index 0000000..7745921 --- /dev/null +++ b/docs/knowledge-cards/catalogue/catalogue_category.md @@ -0,0 +1,81 @@ +--- +card_id: "catalogue/catalogue_category" +title: "Danh mục và Phân nhóm (Catalogue & Category)" +domain: "catalogue" +related_cards: + - "catalogue/item_master" + - "catalogue/item_price" + - "campaign/item_redemption_rule" +tags: ["catalogue", "category", "hierarchy", "item", "classification"] +--- + +# Danh mục và Phân nhóm (Catalogue & Category) + +## Mô tả ngắn + +Catalogue và Category là các thực thể dùng để tổ chức và phân loại hệ thống quà tặng/vật phẩm (Items) nhằm mục đích hiển thị cho người dùng cuối. **Catalogue** đóng vai trò là thư mục gốc (main folder) quản lý thời hạn hiển thị, trong khi **Category** là các nhóm con hỗ trợ cấu trúc cây phân cấp (hierarchy) để nhóm các vật phẩm liên quan lại với nhau. Mọi vật phẩm (Item) muốn hiển thị đều phải được gắn thẻ (tag) vào Catalogue và Category. + +## Thuật ngữ liên quan + +- **Catalogue**: Danh mục lớn nhất (gốc). Một hệ thống có thể có nhiều Catalogue hoạt động đồng thời (VD: Danh mục quà mùa hè, Danh mục quà đối tác). Mỗi Catalogue có tập hợp Items riêng. +- **Category**: Phân nhóm con bên trong Catalogue. Hỗ trợ liên kết cha-con (Parent-Child) để tạo cây phân cấp. +- **Item Master**: Bản ghi vật phẩm gốc. Sẽ được gắn với một Catalogue Code và một Category Code. +- **MP (Member Portal) / Front-end system**: Hệ thống giao diện người dùng hiển thị danh mục và vật phẩm để khách hàng lựa chọn/đổi quà. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Catalogue (Danh mục gốc) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Catalogue Code | Mã định danh Catalogue | Required. String (10). Trả về cho front-end khi truy vấn vật phẩm. | +| Description | Mô tả mặc định của Catalogue | Required. String (50). | +| Effective From/To Date | Thời gian hiệu lực của Catalogue | Required. Date. Catalogue chỉ hiển thị trong khoảng thời gian này. | +| Icon | Biểu tượng của Catalogue | Optional. Image file. | + +### 2. Category (Phân nhóm con) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Category Code | Mã định danh Category | Required. String (10). Trả về cho front-end khi truy vấn vật phẩm. | +| Description | Mô tả mặc định của Category | Required. String (100). | +| Effective From/To Date | Thời gian hiệu lực của Category | Optional. Date. Nếu để trống, Category không có ngày hết hạn. | +| Parent Category | Danh mục cha để tạo cấu trúc phân cấp | Optional. Lookup từ master data. | +| Display Ordering | Thứ tự hiển thị trên Member Site | Numeric 9(3). | +| Icon / Image | Biểu tượng hoặc hình ảnh đại diện | Image. Lấy từ Image Stock hoặc upload trực tiếp. | + +### 3. Đa ngôn ngữ (Content Configuration - Áp dụng cho cả hai) + +Cả Catalogue và Category đều hỗ trợ cấu hình mô tả theo từng ngôn ngữ. +- **Language**: Chọn ngôn ngữ (ví dụ: EN, VN) từ master data. +- **Description**: Mô tả tương ứng với ngôn ngữ đã chọn. Sẽ hiển thị trên MP (Member Portal). + +## Cách hoạt động (How It Works) + +### Tổ chức dữ liệu vật phẩm + +1. **Khởi tạo cấu trúc**: Quản trị viên định nghĩa các Catalogue (ví dụ: `TET_2024`, `REGULAR_GIFT`). Sau đó, định nghĩa các Category (ví dụ: `E_VOUCHER`, `PHYSICAL_GIFT`) và có thể gán `Parent Category` để tạo cây (ví dụ: `FOOD_VOUCHER` là con của `E_VOUCHER`). +2. **Gắn kết Item**: Khi tạo mới hoặc cập nhật một **Item Master**, vật phẩm đó bắt buộc phải được gắn với một mã Catalogue và một mã Category. Việc này quyết định vật phẩm đó "nằm ở đâu" trong kho quà tặng. +3. **Quản lý đa ngôn ngữ**: Người dùng có thể thiết lập nhiều đoạn mô tả (Description) khác nhau cho Catalogue/Category tương ứng với các ngôn ngữ mà hệ thống hỗ trợ. Nếu front-end yêu cầu một ngôn ngữ không được cấu hình, hệ thống trả về mô tả mặc định (Default Description). + +### Hiển thị trên Front-end (Member Portal) + +1. Khi khách hàng truy cập kho quà (MP), front-end sẽ gọi API lấy danh sách Catalogue. +2. Hệ thống kiểm tra **Effective Date (Thời hạn hiệu lực)**. Chỉ những Catalogue/Category có `Processing Date` nằm trong khoảng Start/End Date mới được trả về. +3. Front-end sử dụng **Category Hierarchy (Cây phân cấp)** và **Display Ordering (Thứ tự hiển thị)** để vẽ giao diện điều hướng (navigation menu). +4. Khách hàng bấm vào Category, front-end dùng Category Code và Catalogue Code để truy vấn danh sách Item Master tương ứng và hiển thị. + +## Mối quan hệ với modules khác + +- **Item Master**: Mọi Item Master bắt buộc phải tham chiếu đến Catalogue Code và Category Code để có thể hiển thị ra front-end. Catalogue/Category giống như thư mục, còn Item Master là file bên trong. +- **Image Stock**: Quản lý tập trung các hình ảnh được dùng làm Icon/Image cho Category. + +## Ví dụ thực tế + +**Tổ chức Kho quà Mùa Hè 2024**: +- Quản trị viên tạo Catalogue: `SUMMER_24` (Từ 01/06/2024 đến 31/08/2024). +- Trong `SUMMER_24`, tạo Category cấp 1: `TRAVEL` (Du lịch). +- Trong `TRAVEL`, tạo Category cấp 2 (Parent = TRAVEL): `FLIGHT_TICKET`, `HOTEL`. +- Thiết lập Content Configuration: Language = EN, Description = "Summer 2024 Travel Deals"; Language = VN, Description = "Ưu đãi du lịch Hè 2024". +- Gắn một eVoucher "Giảm 10% vé máy bay VN Airlines" (Item Master) vào Catalogue `SUMMER_24` và Category `FLIGHT_TICKET`. +- Kết quả: Từ 01/06 đến 31/08, khách hàng vào app sẽ thấy tab "Mùa Hè", trong đó có nhóm "Du lịch" -> "Vé máy bay" -> chứa voucher trên. Qua ngày 31/08, toàn bộ tab "Mùa Hè" tự động ẩn khỏi app. diff --git a/docs/knowledge-cards/catalogue/item_master.md b/docs/knowledge-cards/catalogue/item_master.md new file mode 100644 index 0000000..05736e7 --- /dev/null +++ b/docs/knowledge-cards/catalogue/item_master.md @@ -0,0 +1,91 @@ +--- +card_id: "catalogue/item_master" +title: "Quản lý Vật phẩm (Item Master)" +domain: "catalogue" +related_cards: + - "catalogue/catalogue_category" + - "catalogue/item_price" + - "catalogue/voucher_code" + - "campaign/campaign_rule" +tags: ["Item", "Redemption", "Inventory", "Localization", "eVoucher"] +detail_refs: + - "catalogue/face_value_logic" +--- + +# Quản lý Vật phẩm (Item Master) + +## Mô tả ngắn + +Item Master là mô-đun lõi quản lý thông tin chi tiết của mọi loại vật phẩm (Item) có thể dùng để quy đổi điểm thưởng (Redemption) trên hệ thống OLS. Nó định nghĩa toàn bộ thuộc tính sản phẩm, phân loại tính chất vật lý (Miles, Physical, eVoucher, Cashback,...), kiểm soát tồn kho (Inventory) và thiết lập cơ chế kích hoạt các giao dịch đổi điểm/thưởng điểm đi kèm. + +## Thuật ngữ liên quan + +- **Item Type**: Phân loại tính chất vật lý của vật phẩm: Miles (Dặm bay), Physical (Hàng hiện vật), eVoucher (Mã điện tử), Donation (Quyên góp), Cash rebate (Hoàn tiền), Other. +- **Redemption Transaction Code**: Mã giao dịch (OLS TC) dùng để ghi nhận log nghiệp vụ khi đổi món hàng này. +- **Award Transaction Code**: Mã giao dịch (OLS TC) dùng để kích hoạt (Trigger) một Campaign Rule (tặng thêm điểm thưởng) ngay khi khách hàng đổi món hàng này. +- **Track Quantity on Hand**: Cờ kiểm soát tồn kho (Inventory Control). Nếu kích hoạt, hệ thống sẽ trừ dần số lượng (Quantity) lưu trong Database mỗi khi có khách hàng đổi quà. +- **Face Value**: Giá trị thực tế của vật phẩm (VD: số tiền cash rebate, số dặm miles). Khác với giá điểm đổi (Item Price). + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Thông tin chung (General Information) +| Field | Description | Type | +| --- | --- | --- | +| Item Code / Name | Mã định danh duy nhất và Tên hiển thị mặc định của vật phẩm. | X(10) / X(50) | +| Catalogue / Category | Catalog và Category chứa vật phẩm này. | Drop-down | +| Redemption From / To | Thời hạn áp dụng đổi quà. *Sau khi vật phẩm đã phát sinh giao dịch Redemption đầu tiên, hệ thống sẽ khóa ngày From và chỉ cho phép sửa ngày To.* | Date | +| Item Type | Phân loại vật phẩm (Miles, Physical, eVoucher, Donation, Cash rebate, Other). | Radio | +| Redemption Store | Đối tác (Merchant) cung cấp hoặc tài trợ vật phẩm này. | Drop-down | +| Redemption / Award TC | Mã OLS Transaction Code dùng để ghi log / dùng để thưởng thêm điểm (Tùy chọn). | Drop-down | +| Display on Member Site / Hot item | Cờ bật/tắt hiển thị lên Web/App và cờ đánh dấu là Sản phẩm Nổi bật (Hot). | Switch | + +### 2. Định giá & Kho hàng (Value & Inventory) +| Field | Description | Type | +| --- | --- | --- | +| Face value (Trị giá) | Giá trị thực tế của vật phẩm mà khách hàng nhận được (Ví dụ: Giá trị số tiền Cash rebate, số dặm Miles). *Chỉ áp dụng cho Cash rebate/eVoucher/Miles.* | 9(14,2) | +| Voucher Code | Nếu Item Type = eVoucher, bắt buộc phải chọn tập Mã eVoucher tương ứng lấy từ mô-đun Voucher Code (quản lý kho serial code). | Drop-down | +| Track Quantity on Hand | Bật/tắt việc theo dõi tồn kho. *Mặc định hệ thống tự động ép thành ON (và không cho tắt) nếu Item Type là eVoucher (Voucher Code).* | Switch | +| Initialize Quantity | Số lượng kho ban đầu. *Không áp dụng cho eVoucher vì số lượng eVoucher được quản lý ngầm bởi số lượng mã khả dụng trong pool Voucher Code.* | 9(9) | + +### 3. Nội dung đa ngôn ngữ & Hình ảnh (Detail & Media) +| Field | Description | Type | +| --- | --- | --- | +| Language Specific | Tên vật phẩm, Mô tả ngắn, Chi tiết (Content), Hướng dẫn sử dụng (How to use), Điều khoản (T&C) hỗ trợ cấu hình đa ngôn ngữ. | Text | +| Image Group / Image / Sort | Cấu hình bộ ảnh hiển thị cho Item và thứ tự xuất hiện, chọn từ Image Stock hoặc tải lên trực tiếp (Quick Add). | Image | + +### 4. Thông tin liên hệ (Contact and Address) +| Field | Description | Type | +| --- | --- | --- | +| City / Address / Email / Phone | (Tùy chọn) Địa chỉ và thông tin liên hệ của cửa hàng / địa điểm vật lý có thể sử dụng vật phẩm này. | Text | + +## Cách hoạt động (How It Works) + +- **Ràng buộc hiệu lực (Validation Constraint)**: OLS sẽ báo lỗi (Reject) ngay lập tức nếu quản trị viên nhập thời hạn `Redemption From / To` của Item nằm ra ngoài khoảng thời gian có hiệu lực của Catalogue/Category chứa nó. +- **Tồn kho (Inventory)**: Khi có giao dịch Redemption thành công, hệ thống giảm `Quantity` hiện tại đi tương ứng. Nếu hết số lượng, API báo hết hàng không thể đổi quà. +- **Nội dung Đa ngôn ngữ (T&C Injection)**: Nội dung Terms & Conditions cấu hình tại mô-đun này sẽ được API (Web Service) trả về nguyên vẹn và hệ thống tự động sử dụng đoạn Text này để nội suy (Merge) vào các mẫu email/thư thông báo đổi thưởng gửi cho khách hàng. +- **Hành vi đặc biệt của eVoucher**: Khi Item Type = eVoucher, hệ thống tự động: + - Ép `Track Quantity on Hand` = ON (không cho tắt) + - Số lượng tồn kho = số mã Voucher No còn trạng thái `New` trong Voucher Code pool + - `Face Value` lấy từ cấu hình Voucher Code (không nhập thủ công) +- **Award TC Trigger**: Nếu Item có cấu hình `Award TC`, khi khách hàng đổi quà thành công, hệ thống sẽ tạo thêm 1 giao dịch với Transaction Code đó để kích hoạt Campaign Rule (VD: tặng thêm 100 điểm bonus khi đổi quà ≥ 500 điểm). + +## Mối quan hệ với modules khác + +- **Catalogue / Category**: Item phải thuộc về 1 Catalogue → 1 Category. Thời hạn Redemption của Item bị giới hạn bởi thời hạn Category cha. +- **Item Price**: Item Master chỉ định nghĩa thuộc tính hàng hóa. "Giá bán" (Cần bao nhiêu điểm để đổi) được cấu hình riêng lẻ tại mô-đun Item Price — hỗ trợ định giá theo tier (hạng thẻ). +- **Voucher Code**: Nguồn cung cấp kho serial code để xả hàng nếu Item Type là eVoucher. Số lượng mã còn trạng thái `New` = Tồn kho khả dụng. +- **Campaign Rule (Award TC)**: Nếu Item cấu hình Award TC, giao dịch đổi quà sẽ trigger thêm Campaign Rule để thưởng bổ sung. + +## Ví dụ thực tế + +**Tạo vật phẩm eVoucher "Giảm 500K Lazada":** + +1. Admin tạo Item mới: **Item Code** = `EVCH_LZD500K`, **Item Name** = "eVoucher Lazada giảm 500,000 VND". +2. **Catalogue** = "Quà tặng điện tử", **Category** = "eVoucher Thương mại". +3. **Item Type** = eVoucher → hệ thống tự bật `Track Quantity on Hand` = ON. +4. **Voucher Code** = `LZD500K_2024Q3` (lô 10,000 mã đã upload sẵn từ đối tác Lazada). +5. **Face Value** = 500,000 VND. **Redemption TC** = `RED_EVOUCHER`. +6. **Award TC** = `BONUS_RED_100` (khi đổi quà thành công → tự sinh giao dịch thưởng thêm 100 điểm cho khách). +7. Cấu hình T&C: "Mỗi tài khoản sử dụng tối đa 1 lần. Áp dụng cho đơn hàng từ 1,000,000 VND." +8. **Redemption From** = 01/07/2024, **To** = 30/09/2024. +9. Khi khách hàng đổi 5,000 điểm (cấu hình trong Item Price) → hệ thống trả về 1 mã Voucher ngẫu nhiên từ lô `LZD500K_2024Q3`, đồng thời tặng thêm 100 điểm bonus qua Award TC. diff --git a/docs/knowledge-cards/catalogue/item_price.md b/docs/knowledge-cards/catalogue/item_price.md new file mode 100644 index 0000000..2d2c6ba --- /dev/null +++ b/docs/knowledge-cards/catalogue/item_price.md @@ -0,0 +1,96 @@ +--- +card_id: "catalogue/item_price" +title: "Định giá Vật phẩm (Item Price)" +domain: "catalogue" +related_cards: + - "catalogue/item_master" + - "campaign/pool_definition" + - "campaign/account_type_group" +tags: ["price", "redemption", "points", "cash", "partial redemption"] +detail_refs: + - "catalogue/redemption_pricing_detail" +--- + +# Định giá Vật phẩm (Item Price) + +## Mô tả ngắn + +Item Price là mô-đun định nghĩa "giá bán" cho các vật phẩm (đã được tạo trong Item Master). Một vật phẩm có thể có nhiều mức giá khác nhau tùy thuộc vào các điều kiện (Criteria) như: hạng thẻ khách hàng (Account Level), loại tài khoản (Account Type), kênh đổi thưởng (Redemption Channel) hoặc các tiêu chí tuỳ chỉnh khác. Mô-đun hỗ trợ cả đổi bằng điểm toàn phần (Full Redemption) và đổi kết hợp điểm + tiền mặt (Partial Redemption). + +## Thuật ngữ liên quan + +- **Full Redemption**: Đổi vật phẩm thanh toán 100% bằng điểm. +- **Partial Redemption**: Đổi vật phẩm thanh toán bằng kết hợp điểm (tối thiểu là một số lượng nhất định) và tiền mặt (bù cho phần điểm còn thiếu). +- **Redemption Pool**: Nguồn lưu trữ (ví/tài khoản điểm) mà hệ thống sẽ trừ điểm khi khách hàng đổi vật phẩm này. +- **Cash per point**: Tỉ lệ quy đổi (Ví dụ: 1 điểm thiếu = 100 VND). Dùng để tính toán số tiền mặt khách hàng phải trả bù trong giao dịch Partial Redemption. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Thông tin chung & Hạn mức áp dụng + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Price Code / Name | Mã định danh và Tên của mức giá này | X(10) / X(100). | +| Effective Start/End Date | Thời gian mức giá này có hiệu lực | Bắt buộc. Date. | +| Redemption Channel | Kênh áp dụng mức giá (VD: Call Center, Mobile App, Internet Banking) | Bắt buộc chọn 1. | +| Account Type Group / Level / Type | Giới hạn mức giá này chỉ dành cho một nhóm thẻ hoặc hạng thẻ cụ thể (VD: Chỉ dành cho thẻ Platinum) | Tùy chọn. Nếu Account Type Group được chọn thì Account Level/Type bị khoá và ngược lại. | +| Redemption Pool | Ví điểm sẽ bị trừ khi khách hàng đổi quà với giá này | Bắt buộc chọn 1 Pool. | +| Use Only Points from Selected PA Type | Bật: Chỉ cho phép dùng điểm kiếm được từ các loại tài khoản đã cấu hình ở trên để đổi | Switch. Mặc định OFF. | + +### 2. Định giá (Pricing) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Face Value | Giá trị thực nhận của khách (VD: 500 Miles). Ghi đè lên Face Value cấu hình tại Item Master nếu có | 9(12,2). > 0. | +| Price in point (Full redemption) | Giá của vật phẩm nếu đổi 100% bằng điểm | Bắt buộc. 9(12,2). > 0. | +| Original price | Giá gốc (hiển thị để khách tham khảo giá trị thật của món quà) | 9(12,2). > 0. | + +### 3. Đổi kết hợp điểm & tiền (Partial Redemption) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Partial Redemption Allowed | Bật chế độ cho phép thanh toán mix giữa điểm và tiền mặt | Switch. Mặc định OFF. | +| Minimum Partial Redeem Points | (Chỉ hiện khi Allow = ON). Khách phải dùng TỐI THIỂU bao nhiêu điểm để được phép bù tiền | 9(12,2) >= 0. Nếu = 0 tức là cho phép đổi 100% bằng tiền mặt. | +| Cash per point | (Chỉ hiện khi Allow = ON). Số tiền phải trả cho 1 điểm còn thiếu | 9(12,2) > 0. | +| Applicable Taxes | Thuế áp dụng cho giao dịch tiền mặt | Tham chiếu từ "Tax Rate Maintenance". | + +### 4. Điều kiện áp dụng tuỳ chỉnh (Item Criteria) + +Giống như Campaign Rule, Item Price cho phép ghép thêm các nhóm điều kiện phức tạp (Logic AND/OR/NOT). +- Giao diện kéo thả (Drag/Drop) các thuộc tính khách hàng, giao dịch để tạo thành bộ lọc. +- **Ví dụ**: Giá A chỉ áp dụng nếu khách hàng là Nữ (Gender = Female) VÀ Điểm đổi quà > 10,000. + +## Cách hoạt động (How It Works) + +1. **Khởi tạo mức giá**: Admin chọn một Item Master và thiết lập `Item Price`. Một Item Master có thể thiết lập nhiều mức giá (Ví dụ: Giá cho thẻ hạng Vàng, Giá cho thẻ hạng Kim cương). +2. **Quy trình truy vấn giá hợp lệ (Valid Price)**: + - Khi có request truy vấn món đồ, hệ thống tìm tất cả các mức giá của món đồ đó. + - Loại bỏ các mức giá ngoài khoảng `Effective Date`. + - Kiểm tra `Account Type/Level` của khách hàng xem có khớp không. + - Kiểm tra `Item Criteria` (điều kiện tuỳ chỉnh) xem khách hàng có thỏa mãn không. + - Kết quả: Trả về danh sách các mức giá mà khách hàng ĐƯỢC PHÉP nhìn thấy và áp dụng. +3. **Tính toán Partial Redemption**: + - Nếu vật phẩm giá 5,000 điểm. Khách hàng chỉ có 3,000 điểm và muốn đổi một phần. + - Minimum Partial Redeem = 2,000 điểm, Cash per point = 100 VND. + - Khách muốn dùng 3,000 điểm. Số điểm còn thiếu: 5,000 - 3,000 = 2,000 điểm. + - Vì 3,000 > 2,000 (Min allowed) -> Hợp lệ. + - Số tiền mặt phải bù: 2,000 điểm thiếu * 100 VND/điểm = 200,000 VND (+ Thuế nếu có). + +## Mối quan hệ với modules khác + +- **Item Master**: Item Price không thể tồn tại độc lập mà phải luôn được gắn với một Item Master cụ thể. +- **Pool Definition**: Item Price chỉ định chính xác trừ điểm ở Pool nào (ví dụ: điểm thưởng, điểm hoàn tiền). +- **Account Type Group**: Dùng để phân quyền truy cập giá (chỉ hạng thẻ cao mới thấy giá rẻ hơn). + +## Ví dụ thực tế + +**Item: Mã Voucher vé xem phim (Item Master)** +- **Mức giá 1 (Dành cho thành viên thường)**: + - Account Level: Standard + - Price in point: 1,500 điểm + - Partial Redemption: OFF (Chỉ được đổi 100% bằng 1,500 điểm). +- **Mức giá 2 (Dành cho thành viên VIP - Ưu đãi lớn)**: + - Account Level: Platinum + - Price in point: 1,000 điểm + - Partial Redemption: ON (Tối thiểu 500 điểm, phần thiếu tính 1 điểm = 50 VND). +- **Trải nghiệm**: Khách VIP vào App sẽ thấy món quà giá 1,000 điểm. Khách đang có 800 điểm -> Có thể dùng 800 điểm và trả thêm 200 * 50 = 10,000 VND để lấy Voucher. Khách Standard vào App sẽ thấy món quà giá 1,500 điểm và không có tùy chọn bù tiền mặt. diff --git a/docs/knowledge-cards/catalogue/voucher_code.md b/docs/knowledge-cards/catalogue/voucher_code.md new file mode 100644 index 0000000..9b6f757 --- /dev/null +++ b/docs/knowledge-cards/catalogue/voucher_code.md @@ -0,0 +1,91 @@ +--- +card_id: "catalogue/voucher_code" +title: "Quản lý kho mã điện tử (Voucher Code)" +domain: "catalogue" +related_cards: + - "catalogue/item_master" + - "campaign/item_redemption_rule" +tags: ["voucher", "eVoucher", "stock", "promo code", "fulfillment"] +detail_refs: + - "catalogue/fulfillment_lifecycle" +--- + +# Quản lý kho mã điện tử (Voucher Code) + +## Mô tả ngắn + +Voucher Code là mô-đun quản lý kho chứa các mã serial điện tử (eVoucher/Promo code) được sử dụng để trả thưởng cho khách hàng. Hệ thống hỗ trợ tổ chức mã theo lô (Voucher Code), cấu hình chung về hạn sử dụng, giá trị khuyến mãi, đồng thời quản lý vòng đời sử dụng (Lifecycle) của từng mã chi tiết (Voucher Detail) bên trong lô đó. Kho mã này có thể được tải lên (upload) từ đối tác bên ngoài hoặc do hệ thống OLS tự động sinh ra. + +## Thuật ngữ liên quan + +- **Voucher Code (Lô mã)**: Định danh một chiến dịch mã hoặc một nhóm mã có chung thuộc tính (Ví dụ: lô mã Giảm 50K của Highland Coffee). +- **Voucher Detail / Voucher No (Mã chi tiết)**: Chuỗi ký tự (serial number) duy nhất mà khách hàng thực sự nhận được khi đổi thưởng. +- **Expiry Policy**: Quy tắc tính ngày hết hạn của Voucher Detail (theo ngày cố định, theo ngày đổi, hoặc theo ngày giao dịch ghi sổ). +- **Promo code**: Cờ đánh dấu lô voucher này dùng làm mã giảm giá (Discount/Cashback) kèm theo tỷ lệ hoặc số tiền cụ thể. + +## Cấu trúc dữ liệu (Data Schema) + +Mô-đun được chia thành 2 cấp độ: Thông tin Lô mã (Voucher Code) và Thông tin từng mã (Voucher Detail). + +### 1. Thông tin Lô mã (Voucher Code) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Voucher Code / Description | Mã định danh và mô tả lô mã | X(10) / X(100). | +| Supplier | Đối tác/nhà cung cấp phát hành lô mã này | Bắt buộc. Drop-down. | +| Expiry Policy | Chính sách hạn sử dụng: Fixed Date, N days from Transaction/Post Date, N months from Transaction/Post Date | Bắt buộc chọn 1. Không cho sửa sau khi tạo. | +| Expiry Date / N Param | Tham số tương ứng với Expiry Policy (Chọn Fixed Date -> nhập Ngày cố định; Chọn N days -> nhập số N) | Tuỳ thuộc vào Expiry Policy. | +| Generate Voucher | Bật: OLS tự sinh số lượng mã. Tắt: User phải tải file CSV chứa kho mã từ đối tác | Switch. Mặc định OFF. Không sửa sau khi đã đổi mã. | +| Quantity | (Chỉ hiện khi Generate = ON). Số lượng mã hệ thống cần tự sinh | 9(5). Sau khi duyệt, tự sinh N mã tương ứng. | +| This is a promo code | Bật nếu lô mã này là mã giảm giá/cashback | Switch. Mặc định OFF. | +| Promotion Type & Value | (Nếu Promo = ON). Loại khuyến mãi: % Discount, Fixed Monetary Discount, Cashback, Gift Voucher VÀ Giá trị tương ứng | Bắt buộc nếu là Promo. > 0. | + +### 2. Thông tin Mã chi tiết (Voucher Detail) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Voucher No | Chuỗi ký tự mã serial thực tế gửi cho khách | Hiển thị dạng lưới (Grid). | +| Redemption Date | Ngày khách hàng đổi mã | Tự động cập nhật. | +| Expiry Date | Ngày mã hết hạn (tính toán dựa vào Expiry Policy của lô mã) | Tự động tính toán. | +| Redemption Indicator | Cờ đánh dấu trạng thái sử dụng của mã | `No` (Chưa dùng) / `Yes` (Đã dùng). | +| Fulfillment Status | Vòng đời trạng thái chi tiết của mã (Xem phần Cách hoạt động) | `New`, `Issued`, `Fulfilled`, `Cancelled`, `Rejected`. | + +## Cách hoạt động (How It Works) + +### 1. Khởi tạo kho mã (Stock In) + +- **Cách 1 - Upload file**: Dành cho mã do đối tác cấp (VD: Shopee, Lazada). Người dùng tạo một lô Voucher Code (Generate = OFF) và dùng chức năng Upload để nạp danh sách hàng nghìn Voucher No vào lô này. +- **Cách 2 - Auto Generate**: Dành cho mã do hệ thống nội bộ phát hành. Người dùng tạo lô Voucher Code (Generate = ON, Quantity = 1000). Sau khi duyệt, hệ thống tự sinh 1000 mã ngẫu nhiên đưa vào kho. + +### 2. Vòng đời của Mã chi tiết (Lifecycle) + +Mỗi Voucher No bắt đầu với `Redemption Indicator` = **No** và trải qua các trạng thái `Fulfillment Status` sau: +1. **New**: Mã vừa được tạo/tải lên, sẵn sàng để cấp cho khách. Trạng thái Indicator: `No`. +2. **Issued**: Khách hàng đã đổi điểm lấy mã này thành công trên OLS. Trạng thái Indicator chuyển thành `Yes`. +3. **Fulfilled**: (Thành công tuyệt đối) Khách đã dùng mã tại hệ thống đối tác và đối tác ghi nhận chấp nhận mã. +4. **Cancelled**: Khách hàng tự hủy giao dịch đổi mã, hoặc hệ thống hủy vì lý do lỗi. Trạng thái có thể quay lại để tái sử dụng tùy cấu hình hệ thống. +5. **Rejected**: Đối tác từ chối mã (Ví dụ: vi phạm điều khoản, hết hạn, mã lỗi). + +### 3. Dashboard Thống kê + +Trên màn hình của mỗi lô Voucher Code (chỉ bản ghi Active), hệ thống hiển thị realtime 5 thông số: +- **Total Voucher**: Tổng số mã đã khởi tạo/nạp vào. +- **Available Vouchers**: Số mã chưa đổi và chưa hết hạn. +- **Redeemed Vouchers**: Số mã đổi thành công. +- **Cancelled Vouchers**: Số mã bị huỷ. +- **Expired Vouchers**: Số mã chưa đổi nhưng đã qua Expiry Date. + +## Mối quan hệ với modules khác + +- **Item Master**: Voucher Code cung cấp "Hàng hoá" (Stock) cho các vật phẩm Item Master có thuộc tính `Item Type` = `eVoucher`. Số lượng `Available Vouchers` ở đây chính là `Quantity on Hand` (tồn kho) thực tế của Item Master. + +## Ví dụ thực tế + +Ngân hàng muốn tung ra 1,000 mã "Giảm 50K khi mua sắm tại CGV". +1. Admin vào Voucher Code, tạo lô mã `CGV_50K`. Chọn Supplier là CGV. +2. Expiry Policy chọn `N days from Transaction Date`, `N = 30` (Mã có hạn 30 ngày kể từ ngày khách đổi). +3. Do mã do CGV cấp, chọn `Generate = OFF`. Sau đó lưu lại. +4. Admin nhận file Excel chứa 1,000 serial number từ CGV, vào hệ thống click Upload file vào lô `CGV_50K`. +5. Hệ thống thống kê: Total = 1,000, Available = 1,000, New = 1,000. +6. Admin sang màn hình **Item Master**, tạo một món quà tên "Voucher CGV 50K" và liên kết nó vào Voucher Code `CGV_50K`. +7. Khách hàng vào App đổi điểm lấy Voucher -> Số lượng Available còn 999, Redeemed = 1. Fulfillment Status của mã bị đổi chuyển thành `Issued`. diff --git a/docs/knowledge-cards/customer/account.md b/docs/knowledge-cards/customer/account.md new file mode 100644 index 0000000..dfbd914 --- /dev/null +++ b/docs/knowledge-cards/customer/account.md @@ -0,0 +1,74 @@ +--- +card_id: "customer/account" +title: "Tài khoản Sản phẩm (Account)" +domain: "customer" +related_cards: + - "customer/customer_overview" + - "customer/card" +tags: ["account", "PAL", "PAT", "CIF"] +--- + +# Tài khoản Sản phẩm (Account) + +## Mô tả ngắn + +Account (Tài khoản Sản phẩm) là thực thể đại diện cho các tài khoản tài chính hoặc dịch vụ của khách hàng trong hệ thống. Các tài khoản này có thể được đồng bộ từ hệ thống bên ngoài hoặc được tạo trực tiếp trên hệ thống Loyalty thông qua quyền quản trị. Mỗi tài khoản bắt buộc thuộc về một khách hàng duy nhất. + +## Thuật ngữ liên quan + +- **CIF**: Customer Information File - Mã định danh duy nhất của khách hàng trên hệ thống. +- **PAL**: Product Account Level - Hạng tài khoản sản phẩm. +- **PAT**: Product Account Type - Loại tài khoản sản phẩm, phải thuộc về một PAL tương ứng. +- **ASN**: Account Sequence Number - Số thứ tự tài khoản duy nhất trong hệ thống kết hợp từ Account Type và Account No. +- **OLSACCT**: Tên luồng batch xử lý đồng bộ dữ liệu tài khoản từ hệ thống bên ngoài. + +## Cấu trúc dữ liệu (Data Schema) + +### Thông tin chung (Account Information) + +| Field (EN/VN) | Description | Data type / Rules | +| --- | --- | --- | +| CIF number | Mã khách hàng sở hữu tài khoản. | Hiển thị (Lookup). | +| Product Account Level (PAL) | Hạng tài khoản (VD: Gold, Silver). | Lookup từ danh mục PAL. | +| Product Account Type (PAT) | Loại tài khoản thuộc về PAL. PAL + PAT = Account Type. | Lookup từ danh mục PAT. | +| Account Number | Số tài khoản sản phẩm. | X(20). Kết hợp Account Type + Account Number phải là DUY NHẤT. | +| Account Open Date | Ngày mở tài khoản. | Date. | +| Account Indicator | Chỉ thị tài khoản (VD: P-Personal, C-Corporate). | Lookup (Acct-indicator). | +| Account block code | Mã chặn tài khoản (dùng validate chặn giao dịch). | X(10). | +| Block code reason | Lý do chặn. | X(100). | +| Block code last update date | Ngày cập nhật trạng thái chặn cuối cùng. | Date. | +| Cycle | Ngày sao kê. | 9(02). Phải > 0. | +| Account status | Trạng thái tài khoản (dùng để chặn giao dịch nếu cần). | Lookup từ danh mục trạng thái. | + +### Thông tin thẻ liên kết (Card Information) + +| Field | Description | Rules | +| --- | --- | --- | +| Card number | Số thẻ liên kết. | Lookup qua bảng liên kết. | +| Card status | Trạng thái thẻ. | Lookup mô tả. | +| Card Indicator | Chỉ thị thẻ. | Lookup mô tả. | +| Card Creation / Expiry Date | Ngày tạo và ngày hết hạn. | Date. | +| Card block code | Mã chặn thẻ. | Lookup. | + +## Cách hoạt động (How It Works) + +- **Nguồn dữ liệu**: Tài khoản có thể được thêm từ giao diện quản trị hoặc đồng bộ qua batch OLSACCT từ hệ thống bên ngoài. Các tài khoản được tạo/cập nhật qua batch không được phép sửa từ màn hình quản trị (có thể cấu hình tắt rule này qua App Param). +- **Thêm mới (Add)**: + - Hệ thống kiểm tra sự tồn tại của bộ đôi `Account No` + `Account Type`. Nếu đã có tài khoản đang active (Status = "A"), yêu cầu bị từ chối. + - Nếu hợp lệ, hệ thống tạo bản ghi trong bảng `PRODUCT_ACCOUNT` và bảng liên kết `LOYALTY_ACCOUNT_PRODUCT`. +- **Cập nhật (Update)**: + - Yêu cầu cập nhật bị từ chối nếu không tìm thấy bộ `Account No` + `Account Type` hiện hữu. + - Nếu hợp lệ, hệ thống lưu lại lịch sử thay đổi vào bảng lịch sử và cập nhật dữ liệu mới. + - Việc đổi chủ tài khoản (CIF) không được phép thực hiện thủ công, phải thông qua batch CIF Merge. +- **Xóa (Delete)**: + - Nếu tài khoản có thẻ (Card) đang ở trạng thái Active (Status = "A") liên kết với nó, hành động xóa sẽ bị từ chối. + - Xóa hợp lệ sẽ chuyển trạng thái bản ghi và bản ghi liên kết `LOYALTY_ACCOUNT_PRODUCT` sang bảng lịch sử, không xóa vật lý ngay lập tức. + +## Mối quan hệ với modules khác + +- **Customer Overview**: Mỗi Account thuộc về một Customer duy nhất được định danh qua số CIF. +- **Card**: Một Account có thể liên kết với một hoặc nhiều Card (Thẻ). Trạng thái của Card có thể ngăn chặn việc xóa Account. + +## Ví dụ thực tế + +Khách hàng Nguyễn Văn A (CIF: 123456) mở một tài khoản tín dụng. Hệ thống bên ngoài đồng bộ bản ghi này qua batch OLSACCT. Tài khoản được ghi nhận với PAL là "Credit" và PAT là "Platinum", kết hợp với số tài khoản "987654321" tạo thành định danh duy nhất (ASN). Vài ngày sau, ngân hàng phát hành một thẻ cứng liên kết với tài khoản này. Cả thẻ và tài khoản đều được lưu vết trong hệ thống và có thể dùng để thực hiện giao dịch. diff --git a/docs/knowledge-cards/customer/attribute_counter.md b/docs/knowledge-cards/customer/attribute_counter.md new file mode 100644 index 0000000..4fee5b1 --- /dev/null +++ b/docs/knowledge-cards/customer/attribute_counter.md @@ -0,0 +1,69 @@ +--- +card_id: "customer/attribute_counter" +title: "Thuộc tính và Bộ đếm (Attribute & Counter)" +domain: "customer" +related_cards: + - "customer/customer_overview" + - "customer/account" + - "customer/card" + - "campaign/campaign_rule" +tags: ["attribute", "counter", "bucket", "entity level"] +--- + +# Thuộc tính và Bộ đếm (Attribute & Counter) + +## Mô tả ngắn + +Attribute (Thuộc tính) và Counter (Bộ đếm) là các trường thông tin mở rộng được gắn vào các thực thể cốt lõi (Khách hàng, Tài khoản, Thẻ). +- **Attribute** thường lưu trữ các giá trị tĩnh hoặc bán tĩnh có thời hạn (ví dụ: phân khúc, sở thích) được cập nhật qua batch hoặc cấu hình. +- **Counter** lưu trữ các giá trị tích lũy động (ví dụ: tổng chi tiêu tháng) được cập nhật liên tục thông qua giao dịch, chia thành các khoảng thời gian (Bucket). + +## Thuật ngữ liên quan + +- **Entity Level**: Cấp độ thực thể được gắn dữ liệu (Customer [CU], Account [PA], Card [CA]). +- **Entity ID**: Mã định danh tương ứng với cấp độ (CIF cho CU, Account Number cho PA, Card Number cho CA). +- **Counter Bucket**: Khoảng thời gian cụ thể của một bộ đếm (Ví dụ: Bucket tháng 10, Bucket tháng 11). + +## Cấu trúc dữ liệu (Data Schema) + +Dữ liệu được chia thành 2 phần riêng biệt, đều xoay quanh trục "Entity Level". + +### 1. Thuộc tính thực thể (Attribute Value) +Dữ liệu lưu tại bảng `ATTRIBUTE_VALUE`. +- **Attribute Group / ID / Name**: Nhóm, mã và tên của thuộc tính. +- **Entity & Entity ID**: Cấp độ (Customer/Account/Card) và mã định danh tương ứng (CSN, ASN, PSN). +- **Account Type**: Loại tài khoản (chỉ áp dụng nếu Entity là Account). +- **Attribute Value**: Giá trị của thuộc tính. +- **Effective Date From / To**: Khoảng thời gian giá trị thuộc tính này có hiệu lực. +- **Campaign Information**: Nếu thuộc tính được tham chiếu trong một Campaign Rule (làm tiêu chí hoặc công thức), hệ thống sẽ hiển thị Campaign ID, Campaign Name, Rule Name và thời gian hiệu lực của Rule đó. + +### 2. Bộ đếm thực thể (Counter Value) +Dữ liệu lưu tại bảng `Campaign_Counter`, được cập nhật thông qua quá trình xử lý giao dịch. +- **Counter & What to count**: Mã bộ đếm và tiêu chí được đếm (ví dụ: đếm số tiền, đếm số lần giao dịch). +- **Entity & Entity ID**: Cấp độ và mã định danh thực thể. +- **Counter Value**: Giá trị tích lũy hiện tại của bộ đếm. +- **Bucket Number & Period**: Số thứ tự bucket, kèm theo Ngày bắt đầu (Start Date) và Ngày kết thúc (End Date) của bucket. +- **Counter State**: Trạng thái bộ đếm (A: Awarded, C: New). +- **Transaction Details**: Thông tin giao dịch gần nhất làm thay đổi bộ đếm (Reference No, Post Date, Giá trị cập nhật, Ngày cập nhật, Updated by). + +## Cách hoạt động (How It Works) + +- **Cập nhật dữ liệu**: + - Attribute thường được cập nhật hàng loạt (batch process) hoặc thông qua giao diện bảo trì (Maintenance batch). + - Counter được cập nhật chủ yếu thông qua các giao dịch kích hoạt Campaign Rule. +- **Tính thời điểm (Effective/Bucket)**: + - Cả hai đều có tính "thời điểm". Attribute dùng khái niệm **Effective Date** để xác định giá trị hợp lệ hiện tại. + - Counter dùng **Bucket** để lưu trữ giá trị lũy kế theo từng chu kỳ (ví dụ: đếm theo ngày, tuần, tháng). Hệ thống so sánh ngày xử lý (processing date) với kỳ của bucket/effective date để hiển thị bản ghi "hiện hành" (Active). +- **View-only**: Màn hình này cung cấp góc nhìn tổng hợp ở cấp độ Khách hàng (Customer Profile) để xem toàn bộ Attribute/Counter của CIF đó cũng như các Account/Card trực thuộc. Không cho phép thao tác cập nhật trực tiếp tại đây. + +## Mối quan hệ với modules khác + +- **Customer / Account / Card**: Đóng vai trò là thực thể chủ quản (Entity) để gắn Attribute và Counter. +- **Campaign Rule**: Counter là công cụ cốt lõi để theo dõi điều kiện thưởng của Campaign Rule (ví dụ: "Chi tiêu đạt 10 triệu"). Attribute cũng có thể được dùng làm điều kiện lọc (Criteria) trong Rule. +- **Transaction**: Mỗi giao dịch đều có khả năng cập nhật giá trị của một hoặc nhiều Counter Bucket. + +## Ví dụ thực tế + +Khách hàng A (CIF: 123) có: +- **Attribute**: "Hạng thành viên" = "GOLD" (Entity: Customer, ID: 123, Hiệu lực: 01/01/2026 - 31/12/2026). +- **Counter**: Tham gia chương trình "Tiêu dùng tháng 10". Hệ thống tạo "Counter: Tổng chi tiêu", Bucket: 01/10/2026 - 31/10/2026. Sau 2 lần quẹt thẻ, "Counter Value" cập nhật thành 5,000,000 VNĐ. Record hiển thị rõ giao dịch gần nhất (Reference No: TXN889) đã cộng thêm 1,000,000 VNĐ vào bộ đếm này. diff --git a/docs/knowledge-cards/customer/card.md b/docs/knowledge-cards/customer/card.md new file mode 100644 index 0000000..f7db491 --- /dev/null +++ b/docs/knowledge-cards/customer/card.md @@ -0,0 +1,64 @@ +--- +card_id: "customer/card" +title: "Thẻ Sản phẩm (Card)" +domain: "customer" +related_cards: + - "customer/account" + - "customer/customer_overview" +tags: ["card", "replacement", "supplement card", "OLSCARD"] +--- + +# Thẻ Sản phẩm (Card) + +## Mô tả ngắn + +Card (Thẻ Sản phẩm) đại diện cho các thẻ vật lý hoặc ảo liên kết với một tài khoản của khách hàng (Account). Thông tin thẻ chủ yếu được đồng bộ từ hệ thống bên ngoài (External System) qua luồng batch hoặc có thể được bổ sung thông qua giao diện quản trị. Một thẻ luôn phải liên kết với một tài khoản hợp lệ. + +## Thuật ngữ liên quan + +- **CIF**: Customer Information File - Mã định danh khách hàng sở hữu thẻ. +- **Principal Card**: Thẻ chính. Số CIF của thẻ chính phải trùng với số CIF của Account. +- **Supplement Card**: Thẻ phụ. Có thể có số CIF khác với CIF của Account. +- **PSN**: Plastic Sequence Number - Số thứ tự phát hành thẻ. +- **OLSCARD**: Tên luồng batch xử lý đồng bộ dữ liệu thẻ từ hệ thống bên ngoài. + +## Cấu trúc dữ liệu (Data Schema) + +| Field (EN/VN) | Description | Data type / Rules | +| --- | --- | --- | +| CIF number | Mã khách hàng của thẻ. Có thể đổi nếu là thẻ phụ. | Lookup từ danh sách Client. | +| Account Type | Loại tài khoản (kết hợp PAL và PAT). | Lookup từ tài khoản của CIF. | +| Account number | Số tài khoản liên kết với thẻ. | Lookup từ danh sách tài khoản hợp lệ. | +| Card number | Số thẻ. | X(20). Bắt buộc DUY NHẤT trên toàn hệ thống. | +| Cardholder Name | Tên chủ thẻ được in trên thẻ. | X(50). | +| Card Indicator | Chỉ thị loại thẻ (Thẻ chính - P, Thẻ phụ - S, Thẻ doanh nghiệp - K...). | Lookup. | +| Card status | Trạng thái thẻ (dùng validate khi tính toán). | Lookup. | +| Card block code | Mã chặn thẻ (dùng chặn giao dịch). | X(10). | +| Card activation date | Ngày kích hoạt thẻ. | Date. | +| Card creation date | Ngày mở thẻ. | Date. | +| Card expiry date | Ngày thẻ hết hạn. | Date. | +| Old Card Number | Số thẻ cũ (dùng trong trường hợp thay thế thẻ). | Lookup. Cùng chung Account với thẻ mới. | + +## Cách hoạt động (How It Works) + +- **Đồng bộ và phân quyền**: Dữ liệu thẻ chủ yếu cập nhật từ hệ thống ngoài qua batch OLSCARD nên hệ thống cung cấp chức năng xem (view) là chính. Nếu thẻ được tạo/cập nhật bằng batch, hệ thống không cho phép sửa từ màn hình quản trị (có thể tắt việc chặn này qua App Param). +- **Thêm mới (Add)**: + - Thẻ được thêm vào bảng `CARD` và tạo liên kết với Account qua bảng `CARD_PRODUCT_ACCOUNT_REL`. + - Hệ thống từ chối nếu số thẻ đã tồn tại, hoặc Account/CIF không hợp lệ. + - Không cho phép đổi CIF hoặc Account cho một thẻ từ màn hình quản trị (phải dùng batch CIF Merge nếu cần). +- **Cập nhật và Xóa (Update / Delete)**: + - Cập nhật hợp lệ sẽ ghi đè dữ liệu mới và chuyển bản ghi cũ vào bảng lịch sử. + - Xóa thẻ thực chất là xóa logic (chuyển bản ghi `CARD` và `CARD_PRODUCT_ACCOUNT_REL` sang bảng lịch sử). +- **Quy trình thay thế thẻ (Replace Card)**: + - Khi thẻ bị mất hoặc hỏng, hệ thống phát hành thẻ mới để thay thế thẻ cũ. Bản ghi thẻ mới được sinh ra nhưng giữ nguyên PSN của thẻ cũ. + - Toàn bộ Thuộc tính (Attributes), Bộ đếm (Counters) và Ví điểm (Pool Buckets) của thẻ cũ sẽ tự động liên kết sang thẻ mới. + - Thẻ cũ vẫn tồn tại trong hệ thống cho tới khi Trạng thái thẻ hoặc Block Code được cập nhật thành không hợp lệ. + +## Mối quan hệ với modules khác + +- **Account**: Mọi thẻ bắt buộc phải liên kết với một tài khoản (Account). +- **Customer Overview**: Quản lý thông tin định danh (CIF) cho chủ thẻ chính và thẻ phụ. + +## Ví dụ thực tế + +Khách hàng Trần Thị B (CIF: 111222) làm mất thẻ tín dụng vật lý. Ngân hàng tiến hành phát hành thẻ mới. Trong hệ thống Loyalty, thẻ mới được tạo với trường "Old Card Number" trỏ về số thẻ bị mất. Ngay lập tức, hệ thống tự động kế thừa toàn bộ điểm thưởng, các bộ đếm chi tiêu và dữ liệu ưu đãi từ thẻ cũ sang thẻ mới để đảm bảo trải nghiệm khách hàng không bị gián đoạn. Thẻ cũ sau đó được cập nhật trạng thái "Blocked" từ bên ngoài vào để chặn các giao dịch phát sinh. diff --git a/docs/knowledge-cards/customer/customer_overview.md b/docs/knowledge-cards/customer/customer_overview.md new file mode 100644 index 0000000..f4e0611 --- /dev/null +++ b/docs/knowledge-cards/customer/customer_overview.md @@ -0,0 +1,84 @@ +--- +card_id: "customer/customer_overview" +title: "Hồ sơ & Quản lý khách hàng (Customer Overview & 360)" +domain: "customer" +related_cards: + - "customer/operations" + - "customer/account" + - "customer/card" + - "customer/pool_balance" + - "customer/transaction_history" +tags: ["Customer Profile", "Customer 360", "CIF", "Dashboard", "Batch Sync"] +--- + +# Hồ sơ & Quản lý khách hàng (Customer Overview & 360) + +## Mô tả ngắn + +Mô-đun Quản lý khách hàng (Customer Management) cung cấp góc nhìn toàn diện về khách hàng thông qua hai chức năng chính: **Customer Profile** (Hồ sơ khách hàng cơ bản) và **Customer 360 Dashboard** (Góc nhìn toàn cảnh). Hồ sơ khách hàng trên OLS phần lớn là "chỉ đọc" (view-only) và được đồng bộ dữ liệu từ hệ thống nguồn thông qua batch job. + +## Thuật ngữ liên quan + +- **CIF (Customer Information File)**: Mã định danh duy nhất của khách hàng trên hệ thống. +- **Customer 360**: Màn hình tổng hợp toàn bộ hoạt động (Transactions, Pools, Cards/Accounts, Most Redeemed Items) giúp quản trị viên phân tích hành vi khách hàng một cách trực quan. +- **Record Status (A/H)**: Trạng thái bản ghi (Active/History). Xoá khách hàng thực chất là chuyển bản ghi sang History table (Logically delete/Soft delete). +- **Customer Segmentation**: Phân nhóm khách hàng dựa trên nhân khẩu học (Demographic) và hành vi (Behavior) phục vụ cho chiến lược tặng thưởng (VD: VIP, Tần suất mua sắm). +- **OLSCUST**: Batch job đồng bộ dữ liệu khách hàng từ hệ thống nguồn (Core Banking) vào OLS. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Customer Profile +| Field | Description | Type | +| --- | --- | --- | +| CIF number | Mã số khách hàng duy nhất. | X(30) | +| First Name / Last Name | Tên và Họ của khách hàng. Ghép lại thành Customer Name. | X(50) | +| Customer Status | Trạng thái khách hàng (Active, Inactive, Blocked). | Drop-down | +| Customer Block Code | Mã chặn (Block code) ngăn chặn các giao dịch đổi điểm. | X(10) | +| ID Type / Cardholder ID | Loại giấy tờ tuỳ thân (CMND, Passport) và Số ID tương ứng. | X(30) | +| Country Origin | Quốc tịch của khách hàng. | Drop-down | +| Gender | Giới tính (Male, Female, Others). | Drop-down | +| Date of Birth (DOB) | Ngày sinh — dùng cho Rule Criteria sinh nhật. | Date | + +### 2. Contact Detail (Liên hệ) +| Field | Description | Type | +| --- | --- | --- | +| Address Type | Loại địa chỉ (Home, Business, Shipping). Mỗi loại là duy nhất. | Drop-down | +| Phone number / Email | Số điện thoại và Email liên hệ (theo định dạng chuẩn). | X(30) / X(50) | +| State / City / Zip Code | Mã Tỉnh/Thành phố/Mã bưu điện. Dùng để gửi SMS hoặc giao quà vật lý. | Drop-down | + +### 3. Customer 360 Dashboard Metrics +| Metric | Description | Source | +| --- | --- | --- | +| Total Points & Cash back | Số dư khả dụng tổng cộng của khách hàng theo loại Pool. | LAB table | +| Account / Card List | Danh sách Tài khoản/Thẻ, Trạng thái và Ngày hết hạn. | PRODUCT_ACCOUNT, CARD | +| Transaction Statistic | Biểu đồ (Line/Combo) thể hiện xu hướng Earn/Redeem/Adjust theo thời gian. | TRANSACTIONS | +| Most Redeemed Items | Top 10 sản phẩm khách hàng hay đổi nhất (theo Số lượng). | CAT_CATALOGUE_TRANS_DETAIL | +| Balance information | Thông tin chi tiết các Quỹ điểm (Pool) và số dư sắp hết hạn. | LAB table | + +## Cách hoạt động (How It Works) + +- **Đồng bộ dữ liệu (Sync)**: Dữ liệu khách hàng được đổ vào hệ thống OLS thông qua batch `OLSCUST`. Hệ thống tự động tạo bản ghi trong bảng `CLIENT` và sinh ra một `LOYALTY_ACCOUNT` mặc định (Cấp Customer) tương ứng. +- **Xóa khách hàng**: Khi có yêu cầu xoá, hệ thống thực hiện Soft Delete bằng cách dời bản ghi sang bảng History, bao gồm cả Loyalty Account. Nếu khách hàng vẫn còn Tài khoản (Account) ở trạng thái Active, yêu cầu xóa sẽ bị hệ thống Reject. +- **Giao diện Customer 360**: Cung cấp bộ lọc theo Thời gian (This month, Last 3 months), Pool và Loại tài khoản, giúp cập nhật biểu đồ thống kê thời gian thực (real-time dashboard). +- **Ràng buộc dữ liệu**: CIF number là duy nhất toàn hệ thống. Một CIF có thể sở hữu nhiều Account, mỗi Account liên kết với nhiều Card. + +## Mối quan hệ với modules khác + +- **Account Management**: Một CIF sở hữu nhiều Tài khoản (Account). Xóa CIF yêu cầu tất cả Account phải Inactive trước. +- **Card Management**: Thẻ (Card) liên kết gián tiếp với khách hàng thông qua Account. +- **Pool Balance**: Dashboard 360 hiển thị tổng hợp số dư của tất cả Pool mà khách hàng có. +- **Transaction History**: Dashboard 360 pull dữ liệu giao dịch để vẽ biểu đồ xu hướng Earn/Redeem. +- **Batch System**: Cập nhật thông tin thông qua End-of-Day (EOD) Batch OLSCUST. +- **Catalogue**: Tích hợp hiển thị danh sách quà tặng (Most Redeemed Items) trên dashboard. +- **Targeting / Campaign**: Dữ liệu hồ sơ khách hàng là đầu vào cho engine phân khúc (Segmentation) để đẩy tệp đối tượng (Audience) vào chiến dịch. + +## Ví dụ thực tế + +**Nhân viên CS tra cứu khách hàng khiếu nại "Không nhận được điểm":** + +1. CS nhập CIF `VN20230001` vào Customer Search → mở Customer Profile. +2. Kiểm tra **Customer Status** = `Active`, **Block Code** = trống → khách hàng không bị chặn. +3. Chuyển sang tab **Customer 360** → lọc Pool "Loyalty Points" + Time range "Last 3 months". +4. Dashboard hiển thị: 5 giao dịch Earn trong 3 tháng qua, tổng cộng 2,500 điểm. Giao dịch gần nhất ngày 15/07 có số tiền 800,000 VND nhưng không sinh điểm. +5. CS click vào giao dịch → redirect sang **No-Hit Transaction** → thấy Error: "MCC 7995 (Gambling) — MCC không hợp lệ cho Campaign Rule #CR001". +6. CS giải thích cho khách: giao dịch tại MCC Gambling bị loại trừ khỏi chương trình tặng thưởng. diff --git a/docs/knowledge-cards/customer/no_hit_transaction.md b/docs/knowledge-cards/customer/no_hit_transaction.md new file mode 100644 index 0000000..dec7827 --- /dev/null +++ b/docs/knowledge-cards/customer/no_hit_transaction.md @@ -0,0 +1,74 @@ +--- +card_id: "customer/no_hit_transaction" +title: "Giao dịch không hợp lệ (No-Hit Transaction)" +domain: "customer" +related_cards: + - "customer/account" + - "customer/card" + - "campaign/campaign_rule" + - "campaign/pool_definition" +tags: ["transaction", "no-hit", "orphan", "error", "troubleshooting"] +--- + +# Giao dịch không hợp lệ (No-Hit Transaction) + +## Mô tả ngắn + +No-Hit Transaction là bản ghi lưu vết các giao dịch đầu vào được gửi đến OLS nhằm kích hoạt Campaign Rule nhưng **không được ghi nhận thưởng** (do không thỏa mãn điều kiện hoặc không có rule nào phù hợp). Entity này được sử dụng chủ yếu để tra cứu (troubleshoot) nguyên nhân từ chối trả thưởng cho khách hàng. + +> [!NOTE] +> Theo đặc tả, nếu tính năng "Rule Evaluation" được triển khai hoàn chỉnh, hệ thống tracking này có thể trở nên dư thừa. + +## Thuật ngữ liên quan + +- **CIF Number**: Mã định danh khách hàng cốt lõi. +- **CP Rule**: Campaign Rule, quy tắc chiến dịch định nghĩa điều kiện trả thưởng. +- **OLS_ORPHAN_TXN_NO_HIT**: Bảng dữ liệu vật lý lưu trữ các giao dịch không hợp lệ trên OLS. +- **DCC Indicator**: Chỉ báo giao dịch chuyển đổi tiền tệ động (Dynamic Currency Conversion). + +## Cấu trúc dữ liệu (Data Schema) + +Bản ghi No-Hit được trích xuất từ incoming transaction và chi tiết lỗi: + +### 1. Thông tin tài khoản (Account Information) +- **CIF Number**: Mã khách hàng thực hiện giao dịch (lookup qua Account/Card nếu incoming không có). +- **Product Account No / Type**: Số và loại tài khoản sản phẩm (lookup qua Card nếu cần). +- **Card Number**: Số thẻ (từ incoming transaction). + +### 2. Chi tiết giao dịch (Transaction Detail) +- **Invoice No**: Số hóa đơn duy nhất do OLS sinh ra cho incoming transaction. +- **Transaction Type**: Loại giao dịch của rule (AWD - Award, RED - Redeem, ADJ - Adjust). +- **OLS Transaction Code**: Mã giao dịch dùng để map với CP Rule. +- **Transaction Amount**: Giá trị gộp (Award/Redeem) hoặc điểm điều chỉnh (Adjust). +- **Corporate / Chain / Store / Terminal**: Thông tin điểm chấp nhận giao dịch, tra cứu từ transaction store. +- **Transaction MCC**: Mã danh mục đơn vị chấp nhận thẻ. +- **Date / Currency / Description**: Ngày, loại tiền tệ và mô tả giao dịch. +- **Transaction Mode / POS Entry Mode**: Phương thức giao dịch và nhập liệu. +- **DCC / Tap2Pay / Token Requestor ID**: Các chỉ báo phụ trợ từ incoming transaction. +- **Salary Credit**: Chỉ báo tài khoản nhận lương định kỳ. + +### 3. Danh sách lỗi Campaign Rule (CP Rule Listing) +- **Campaign ID / Campaign Rule**: Chiến dịch và mã Rule mà giao dịch kích hoạt nhưng bị trượt. +- **Pool ID**: Pool thưởng tương ứng của Rule. +- **Error Code / Error Descriptions**: Mã và mô tả chi tiết lỗi từ OLS (VD: do không đạt tiêu chí giá trị, sai MCC, vv). + +## Cách hoạt động (How It Works) + +- **Ghi nhận ngoại lệ**: Khi một incoming transaction chạy qua rule engine, nếu nó kích hoạt Rule A nhưng không thỏa mãn Rule Criteria, hệ thống ghi bản ghi này vào bảng `OLS_ORPHAN_TXN_NO_HIT`. +- **Đa điều kiện trượt**: Nếu một giao dịch kích hoạt Rule A (thành công) nhưng trượt Rule B, nó **vẫn** sinh ra bản ghi No-Hit để ghi nhận lý do trượt Rule B. +- **Cung cấp nguyên nhân**: Quá trình xử lý (TP) bắt buộc trả về mô tả lỗi chi tiết (Error Description) ghi rõ lý do trượt (VD: criteria nào bị fail) để hiển thị/lưu trữ. +- **Tra cứu và khắc phục (View-only)**: Người dùng (VD: Customer Service) dùng thông tin này để giải thích cho khách hàng lý do không được nhận thưởng, hoặc dùng làm cơ sở điều chỉnh (adjust) giao dịch thủ công nếu Campain Rule bị cấu hình sai. + +## Mối quan hệ với modules khác + +- **Account** / **Card**: Định danh chủ thể thực hiện giao dịch bị lỗi. +- **Campaign Rule**: Quy tắc mà giao dịch cố gắng kích hoạt nhưng thất bại. Chi tiết lỗi liên kết trực tiếp với Rule này. +- **Pool Definition**: Pool dự định sẽ nhận điểm nếu giao dịch thành công. + +## Ví dụ thực tế + +Khách hàng quẹt thẻ tín dụng tại siêu thị, hóa đơn 400.000 VNĐ. Hệ thống nhận giao dịch, cố gắng kích hoạt "Campaign Rule: Mua sắm siêu thị > 500K". +Giao dịch thất bại do không đủ định mức. OLS ghi nhận: +- **Transaction Detail**: Amount = 400.000, MCC = 5411. +- **CP Rule Listing**: Campaign Rule = "RULE_SIEU_THI_500K", Error Code = "ERR_MIN_AMOUNT", Error Description = "Transaction amount 400,000 is less than minimum criteria 500,000". +CSD dựa vào record này để giải thích cho khách hàng. diff --git a/docs/knowledge-cards/customer/operations_adjustment.md b/docs/knowledge-cards/customer/operations_adjustment.md new file mode 100644 index 0000000..57ab3a0 --- /dev/null +++ b/docs/knowledge-cards/customer/operations_adjustment.md @@ -0,0 +1,79 @@ +--- +card_id: "customer/operations_adjustment" +title: "Nghiệp vụ Điều chỉnh Điểm (Adjustment Operations)" +domain: "customer" +related_cards: + - "customer/pool_balance" + - "customer/account" + - "customer/card" +tags: ["adjustment", "transfer", "re-instatement", "maker-checker", "manual"] +detail_refs: + - "customer/adjustment_deduction_logic" +--- + +# Nghiệp vụ Điều chỉnh Điểm (Adjustment Operations) + +## Mô tả ngắn + +Nghiệp vụ Điều chỉnh Điểm bao gồm các công cụ quản trị (OA) cho phép nhân viên vận hành can thiệp thủ công vào số dư ví điểm (Pool Balance) của khách hàng. Có 3 loại nghiệp vụ chính: **Adjustment** (Điều chỉnh cộng/trừ), **Transfer Balance** (Điều chuyển điểm) và **Re-instatement** (Gia hạn điểm). Tất cả các giao dịch này đều phải tuân thủ quy trình phê duyệt Maker-Checker. + +## Thuật ngữ liên quan + +- **Maker-Checker**: Cơ chế phê duyệt hai cấp. Người tạo (Maker) sinh ra giao dịch ở trạng thái Pending, người duyệt (Checker) Approve thì giao dịch mới có hiệu lực. +- **Forfeited (Thu hồi)**: Trạng thái điểm đã quá hạn và bị hệ thống xóa bỏ vĩnh viễn. Chỉ có thể Re-instatement khi điểm đã hết hạn nhưng chưa bị Forfeited (nằm trong thời gian ân hạn). +- **Transfer Mode**: Chế độ điều chuyển (Internal - trong cùng 1 khách hàng; External - giữa các khách hàng khác nhau). + +## Cấu trúc dữ liệu (Data Schema) + +Dữ liệu đầu vào cho một giao dịch Điều chỉnh (bất kể loại nào) luôn phải có các thông tin cốt lõi sau: + +### 1. Định danh thực thể (Entity Identification) +- **Posted transaction by**: Cấp độ tạo giao dịch (CIF, Account, hoặc Card). +- **From / To (Chỉ dùng cho Transfer)**: Nguồn đi và đích đến (được xác định bằng CIF, Account, hoặc Card). +- **Pool ID**: Mã Ví điểm chịu ảnh hưởng. (Hệ thống ràng buộc Pool Level phải tương thích với Entity Level được chọn). + +### 2. Thông tin điều chỉnh (Adjustment Info) +- **Transaction Type**: Loại điều chỉnh (Positive - Cộng, Negative - Trừ). +- **Adjustment Quantity / Transfer Amount**: Số lượng điểm điều chỉnh hoặc điều chuyển. +- **Expiry Date**: Ngày hết hạn mới cho số điểm được cộng thêm/gia hạn. +- **Bucket to Re-instate (Chỉ dùng cho Re-instatement)**: Xác định đích danh bucket đã hết hạn cần được gia hạn. + +### 3. Tracking & Phân loại (Audit & Classification) +- **Transaction Date / Code**: Ngày giao dịch và Mã giao dịch OLS. +- **Reason Code**: Mã lý do điều chỉnh (Rất quan trọng để hệ thống định khoản GL). +- **Store / Remarks**: Đơn vị cửa hàng và Ghi chú thêm. + +## Cách hoạt động (How It Works) + +### 1. Adjustment (Điều chỉnh âm/dương) +- **Positive (Cộng điểm)**: Nếu có bucket nào đang bị âm (Negative balance), số điểm cộng thêm sẽ được dùng để bù đắp (offset) cho bucket đó về 0 trước. Phần điểm dư còn lại mới được tạo thành bucket mới với Expiry Date chỉ định. +- **Negative (Trừ điểm)**: Có thể chọn đích danh một Bucket để trừ. Nếu không chọn, hệ thống sẽ trừ theo quy tắc chuẩn (thường là FIFO - hết hạn trước trừ trước). + +### 2. Transfer Balance (Điều chuyển điểm) +- Có thể chuyển số dư của toàn bộ Pool hoặc một lượng điểm nhất định. +- Khi được duyệt, hệ thống sinh ra **2 giao dịch đồng thời**: 1 giao dịch Negative Adjustment cho tài khoản "From" và 1 giao dịch Positive Adjustment cho tài khoản "To". +- Expiry Date của điểm điều chuyển sẽ được giữ nguyên như bucket gốc trừ khi người dùng chỉ định một ngày mới. + +### 3. Re-instatement (Gia hạn điểm) +- Dùng để "cứu" các điểm đã hết hạn nhưng vẫn nằm trong Grace Period (chưa Forfeited). +- Khi thực thi: Số dư của bucket hết hạn sẽ bị set về 0. Hệ thống sinh ra một bucket mới chứa số điểm này, áp dụng Expiry Date mới. +- Nếu điểm đã bị Forfeited, không thể dùng chức năng này mà phải dùng "Positive Adjustment" để đền bù điểm. + +### 4. Quy trình Maker-Checker +- Sau khi lưu, giao dịch nằm ở tab Pending. Lúc này có thể Edit/Delete. +- Người dùng có thẩm quyền (Checker) phải Approve giao dịch. Sau khi Approve, giao dịch chuyển sang trạng thái Active, ghi nhận vào Transaction History và cập nhật Pool Balance. +- Hệ thống sẽ validate kỹ lưỡng tình trạng Block Code của thẻ/tài khoản trước khi Approve. + +## Mối quan hệ với modules khác + +- **Pool Balance**: Đối tượng bị thay đổi trực tiếp bởi các giao dịch này. +- **Account / Card**: Các thực thể làm nguồn (From) hoặc đích (To) cho giao dịch. +- **Transaction History**: Nơi ghi nhận log cuối cùng sau khi giao dịch được Approve. +- **Reason Code**: Định nghĩa nguyên nhân và định tuyến hạch toán kế toán (GL) cho giao dịch. + +## Ví dụ thực tế + +Khách hàng khiếu nại chưa nhận được điểm hoàn tiền 50K. Nhân viên CSKH kiểm tra và xác nhận lỗi hệ thống. +1. CSKH (Maker) tạo một **Positive Adjustment**: Chọn Account của khách, Pool "Hoàn tiền", số lượng 50,000, Reason Code "Lỗi hệ thống", lưu thành Pending. +2. Trưởng ca (Checker) vào xem xét giao dịch Pending, bấm Approve. +3. Hệ thống sinh ra giao dịch cộng 50,000 vào Pool Balance, chèn log vào Transaction History. Khách hàng thấy điểm tăng ngay lập tức. diff --git a/docs/knowledge-cards/customer/operations_transaction.md b/docs/knowledge-cards/customer/operations_transaction.md new file mode 100644 index 0000000..b51be08 --- /dev/null +++ b/docs/knowledge-cards/customer/operations_transaction.md @@ -0,0 +1,73 @@ +--- +card_id: "customer/operations_transaction" +title: "Giao dịch Vận hành (Operations Transaction)" +domain: "customer" +related_cards: + - "catalogue/item_master" + - "campaign/campaign_rule" + - "customer/pool_balance" +tags: ["redemption", "award transaction", "manual entry", "call center"] +--- + +# Giao dịch Vận hành (Operations Transaction) + +## Mô tả ngắn + +Giao dịch Vận hành (Operations Transaction) bao gồm các chức năng trên màn hình quản trị (OA) cho phép nhân viên vận hành hoặc tổng đài viên (Call Center) thay mặt khách hàng thực hiện các nghiệp vụ: **Đổi quà (Item Redemption)** và **Tạo giao dịch thưởng (Award Transaction)**. Các giao dịch này sau khi được duyệt sẽ được xử lý thời gian thực tương tự như luồng giao dịch tự động. + +## Thuật ngữ liên quan + +- **Redemption Mode**: Chế độ đổi quà, bao gồm "Fixed Points" (chỉ dùng điểm) hoặc "Fixed Partial" (dùng điểm + tiền mặt). +- **FFP (Frequent Flyer Program)**: Chương trình khách hàng thường xuyên của đối tác hàng không (dùng để đổi Dặm bay - Miles). +- **Transaction Context**: Ngữ cảnh giao dịch (Amount, MCC, Store, Terminal) cần thiết để giả lập một giao dịch thực tế. + +## Cấu trúc dữ liệu (Data Schema) + +Dữ liệu đầu vào được chia làm 2 loại nghiệp vụ chính: + +### 1. Item Redemption (Đổi quà thủ công) +- **Định danh**: Người đổi (CIF, Account hoặc Card). +- **Redemption Channel & Date**: Kênh đổi (thường là OA/Call Center) và ngày đổi. +- **Item Details**: + - **Catalogue & Item**: Chọn danh mục và vật phẩm (Bắt buộc phải có cấu hình giá hợp lệ tại thời điểm đổi). + - **Redemption Mode**: Fixed Points hoặc Fixed Partial (nếu Item Price cho phép). + - **Unit Price / Cash Amount**: Giá điểm và giá tiền mặt cho mỗi đơn vị. (Với Fixed Partial, nhân viên có thể điều chỉnh số điểm sử dụng nhưng không được thấp hơn mức tối thiểu quy định). + - **Redemption Quantity**: Số lượng đổi (không được vượt quá Quantity on hand của kho). +- **Thông tin bổ sung (theo loại Item)**: + - **Miles**: Mã số FFP, Tên, Họ (để gửi đối tác). + - **Physical/Evoucher**: Địa chỉ, Zip code, Tên người nhận, SĐT, Email (để giao hàng). + +### 2. Award Transaction (Tạo giao dịch thưởng) +- **Định danh**: Người thực hiện giao dịch (CIF, Account hoặc Card). +- **Transaction Context (Ngữ cảnh giả lập)**: + - **OLS Transaction Code (TC)**: Mã định danh loại nghiệp vụ (sẽ dùng để dò tìm Campaign Rule). + - **Transaction Date**: Ngày giao dịch thực tế. + - **Gross Amount / Currency**: Giá trị giao dịch và loại tiền tệ. + - **Store / Terminal / MCC / Country Code**: Thông tin điểm chấp nhận thẻ. + - **POS Entry Mode / Channel / Salary Indicator**: Các chỉ báo phụ trợ đi kèm. + +## Cách hoạt động (How It Works) + +### 1. Xử lý Đổi quà (Item Redemption) +- **Tính năng Real-time**: Khi tạo và (nếu cần) Approve thành công, hệ thống lập tức trừ điểm trong Pool Balance tương ứng theo logic FIFO (trừ bucket hết hạn gần nhất). +- **Ràng buộc**: Số lượng tồn kho (Quantity on hand) được kiểm tra tức thời. Giao dịch bị từ chối nếu không đủ điểm (Redeemable Balance) hoặc không đủ tồn kho. +- **Tích hợp đối tác**: Cuối ngày (EOD), các giao dịch đổi quà thành công (đặc biệt là Evoucher/Miles) sẽ được xuất ra file để gửi đối tác hoặc hệ thống fulfillment xử lý bước tiếp theo. + +### 2. Xử lý Tạo giao dịch thưởng (Award Transaction) +- **Giả lập giao dịch Core**: Chức năng này không cộng trực tiếp điểm vào Pool (như Positive Adjustment), mà tạo ra một bản ghi Transaction đẩy vào Transaction Processing Engine (TP). +- **Rule Evaluation**: Engine sẽ dùng TC Code và các tham số (Amount, MCC...) nhập trên form để quét qua tập hợp các Campaign Rule đang Active. Nếu thỏa mãn Rule Criteria, hệ thống mới thực hiện cộng điểm (Award) cho khách hàng. +- **Ứng dụng**: Dùng để xử lý các giao dịch ngoại lệ bị rớt từ hệ thống Core, hoặc các chiến dịch đặc biệt cần ghi nhận thủ công tại quầy (Store). + +## Mối quan hệ với modules khác + +- **Pool Balance**: Đổi quà sẽ trực tiếp kiểm tra và trừ số dư Khả dụng (Redeemable Balance) từ Pool. +- **Item Master**: Cung cấp danh sách vật phẩm, giá cả (Price) và tồn kho (Quantity) cho nghiệp vụ đổi quà. +- **Campaign Rule**: Award Transaction phụ thuộc hoàn toàn vào cấu hình của Rule để xác định xem khách hàng có được thưởng điểm hay không. + +## Ví dụ thực tế + +Khách hàng B gọi lên tổng đài báo muốn đổi "Voucher Starbucks 50K". +- Nhân viên CSKH mở tab "Item Redemption", chọn số thẻ của khách. +- Chọn Catalogue "Ẩm thực", Item "Voucher SB 50K", Mode = "Fixed Points", Quantity = 1. +- Hệ thống hiển thị Unit Price = 500 điểm. Kiểm tra Pool Balance khách có 1,000 điểm. +- Nhân viên xác nhận. Giao dịch lập tức trừ 500 điểm của khách và xuất hiển thị mã Evoucher cho nhân viên cung cấp cho khách hàng. diff --git a/docs/knowledge-cards/customer/pool_balance.md b/docs/knowledge-cards/customer/pool_balance.md new file mode 100644 index 0000000..a0e3d86 --- /dev/null +++ b/docs/knowledge-cards/customer/pool_balance.md @@ -0,0 +1,70 @@ +--- +card_id: "customer/pool_balance" +title: "Số dư Ví điểm (Pool Balance)" +domain: "customer" +related_cards: + - "customer/customer_overview" + - "campaign/pool_definition" + - "customer/account" + - "customer/card" +tags: ["pool", "balance", "bucket", "LAB", "redeemable"] +--- + +# Số dư Ví điểm (Pool Balance) + +## Mô tả ngắn + +Pool Balance (Số dư Ví điểm) là thực thể đại diện cho tổng hợp số dư điểm, dặm thưởng hoặc đơn vị giá trị khác của khách hàng trong hệ thống. Dữ liệu này là kết quả tổng hợp (aggregation) từ các ví nhỏ (buckets) trong bảng dữ liệu LAB (Loyalty Account Bucket), giúp xác định số điểm hiện có, số điểm khả dụng và thời hạn của điểm. + +## Thuật ngữ liên quan + +- **Pool**: Ví điểm/Kho điểm - Nơi lưu trữ điểm thưởng theo một loại cụ thể. +- **Bucket**: Nhóm điểm/Lô điểm - Một phần của Pool, chứa điểm có cùng ngày sinh và ngày hết hạn. +- **LAB**: Loyalty Account Bucket - Bảng lưu trữ chi tiết từng bucket điểm của khách hàng. +- **ASN**: Account Sequence Number - Định danh tài khoản. +- **CSN**: Card Sequence Number - Định danh thẻ. + +## Cấu trúc dữ liệu (Data Schema) + +Dữ liệu tổng hợp số dư Ví điểm: + +| Field (EN/VN) | Description | Data type / Rules | +| --- | --- | --- | +| Pool ID | Mã ví điểm. | Lookup từ Pool Definition. | +| Pool Name | Tên ví điểm. | Lookup từ Pool Definition. | +| Pool type | Loại ví điểm. | Lookup từ Pool Definition. | +| Pool Entity level | Cấp độ thực thể của ví điểm (VD: Khách hàng, Tài khoản, Thẻ). | Lookup. | +| Balance | Tổng số dư hiện có. | Tính tổng (Sum) tất cả các buckets của Pool từ bảng LAB. | +| Redeemable Balance | Số dư khả dụng. | Tính tổng các buckets chưa hết hạn (non-expired) và có thể sử dụng (available) từ LAB. | +| Next Expiring Balance | Số dư sắp hết hạn. | Số dư của bucket có ngày hết hạn gần nhất (sắp đến hạn nhưng chưa hết hạn) từ LAB. | +| Account type | Loại tài khoản (PAL + PAT). | Lookup từ Product_Account bằng ASN. | +| Account No | Số tài khoản liên kết. | Lookup bằng ASN. | +| Card Number | Số thẻ liên kết (chỉ có nếu Pool Entity Level là Card). | Hiển thị dựa trên thẻ liên kết. | +| Expiry Date | Ngày hết hạn của bucket điểm. | Được nhóm (Group by) theo Ngày hết hạn / Pool ID / ASN / CSN. | + +## Cách hoạt động (How It Works) + +- **Bản chất dữ liệu**: Số dư ví điểm (Pool Balance) không được lưu thành một con số cứng tĩnh lẻ tẻ mà được tính toán/tổng hợp động từ nhiều lô điểm (buckets) thuộc bảng LAB. +- **Phân loại số dư**: + - **Balance**: Tổng cộng mọi điểm đang tồn tại trong Pool. + - **Redeemable Balance**: Chỉ tính những điểm hợp lệ (có thể sử dụng), loại bỏ các điểm đã hết hạn hoặc bị phong tỏa (blocked). + - **Next Expiring**: Hệ thống dò tìm bucket có ngày hết hạn gần nhất ở tương lai để hiển thị con số sẽ bị mất nếu không sử dụng kịp thời. +- **Cấp độ (Entity Level)**: Tùy thuộc vào cấu hình của Pool (Pool Entity Level), số dư có thể gắn ở cấp độ toàn bộ Khách hàng (Customer), từng Tài khoản (Account) hoặc từng Thẻ (Card). +- **Read-only**: Dữ liệu này hoàn toàn là kết quả tính toán hiển thị (chỉ xem), mọi sự thay đổi điểm số phải thông qua các giao dịch phát sinh (award/redeem) hoặc điều chỉnh (adjustment) tác động trực tiếp vào các buckets. + +## Mối quan hệ với modules khác + +- **Pool Definition**: Định nghĩa các tham số của ví điểm (Tên, Loại, Cấp độ). +- **Customer Overview**: Nơi hiển thị tổng quan các ví điểm của toàn bộ khách hàng. +- **Account / Card**: Số dư có thể được gắn cụ thể vào một tài khoản hoặc một thẻ tùy thuộc vào Entity Level của Pool. + +## Ví dụ thực tế + +Khách hàng sở hữu ví điểm "Cashback" (Pool ID: P01). Trong bảng LAB, khách có 2 lô điểm (buckets): +1. Bucket 1: 50,000 điểm, hết hạn 31/12/2026. +2. Bucket 2: 20,000 điểm, hết hạn 30/06/2026. +Hệ thống sẽ tổng hợp Pool Balance như sau: +- **Balance**: 70,000 điểm (50K + 20K). +- **Redeemable Balance**: 70,000 điểm (giả sử cả 2 đều đang khả dụng). +- **Next Expiring Balance**: 20,000 điểm (vì bucket 2 hết hạn sớm nhất). +- **Expiry Date**: 30/06/2026. diff --git a/docs/knowledge-cards/customer/statement.md b/docs/knowledge-cards/customer/statement.md new file mode 100644 index 0000000..1f35e57 --- /dev/null +++ b/docs/knowledge-cards/customer/statement.md @@ -0,0 +1,67 @@ +--- +card_id: "customer/statement" +title: "Sao kê điểm thưởng (Statement)" +domain: "customer" +related_cards: + - "customer/account" + - "campaign/pool_definition" + - "customer/transaction_history" +tags: ["statement", "balance", "cycle", "monthly"] +--- + +# Sao kê điểm thưởng (Statement) + +## Mô tả ngắn + +Sao kê điểm thưởng (Statement) là bản ghi tổng hợp định kỳ (thường là hàng tháng) về tình hình biến động điểm thưởng của một tài khoản. Bản ghi chốt số dư đầu kỳ, tổng điểm phát sinh (cộng/trừ/điều chỉnh) trong kỳ, số dư cuối kỳ và điểm sắp hết hạn. Sao kê được tính toán tự động bởi các batch jobs của hệ thống OLS. + +## Thuật ngữ liên quan + +- **Statement Pool**: Pool điểm thưởng được cấu hình để sinh sao kê (chỉ tính điểm từ Pool này). +- **Cycle**: Chu kỳ sao kê, khoảng thời gian mà các giao dịch được tổng hợp lại để tính số dư. +- **Loyalty Account Number**: Số tài khoản khách hàng thân thiết nội bộ của hệ thống. + +## Cấu trúc dữ liệu (Data Schema) + +Bản ghi Statement Enquiry bao gồm thông tin tổng hợp chu kỳ và chi tiết giao dịch phát sinh: + +### 1. Thông tin tài khoản & Chu kỳ (Account & Cycle Info) +- **Loyalty Account Number**: Số tài khoản Loyalty. +- **Product Account Number / Type**: Số và loại tài khoản sản phẩm (lookup từ ASN trong bảng Statement). +- **Pool ID**: Mã Pool cấu hình sao kê. +- **Cycle Start Date / Cycle Statement Date**: Ngày bắt đầu và kết thúc (chốt) của chu kỳ sao kê. + +### 2. Thông tin số dư (Balance Summary) +- **Statement Opening Balance**: Số dư điểm đầu kỳ (mang từ cuối kỳ trước sang). +- **Total Award**: Tổng số điểm thưởng kiếm được trong kỳ. +- **Total Redeem**: Tổng số điểm đã sử dụng (đổi quà) trong kỳ. +- **Total Adjust**: Tổng số điểm được điều chỉnh trong kỳ. +- **Statement Closing Balance**: Số dư điểm tích lũy cuối kỳ. +- **Expired Points**: Số dư điểm trong các bucket đã quá hạn nhưng chưa bị hệ thống thu hồi (forfeited). + +### 3. Chi tiết giao dịch trong kỳ (Transaction Summary) +- **Last Transaction Date**: Ngày post giao dịch cuối cùng trong chu kỳ này. +- **Reference Number**: Số tham chiếu giao dịch OLS. +- **Transaction Type**: Loại giao dịch (Award/Redeem/Adjust). +- **Unit**: Giá trị điểm phát sinh (được nhóm theo Reference No, Post Date, Transaction Date và Txn Type). +- **Post Date / Transaction Date**: Ngày đăng và ngày giao dịch thực tế. + +## Cách hoạt động (How It Works) + +- **Cấp độ lưu trữ**: OLS hỗ trợ sao kê ở cấp độ Khách hàng (Customer) và Tài khoản (Account). Tuy nhiên, bản ghi vật lý luôn được lưu trữ ở cấp độ Tài khoản cho từng Statement Pool tương ứng. +- **Xử lý tự động (Batch)**: Các bản ghi sao kê không sinh ra realtime (thời gian thực) mà được tổng hợp định kỳ bởi OLS batch jobs khi kết thúc chu kỳ. +- **View-only**: Màn hình Statement Enquiry cung cấp tính năng tra cứu (Read-only) các bản ghi sao kê đã được chốt (active statement records), không cho phép thao tác sửa xóa. +- **Công thức chốt số**: `Closing Balance = Opening Balance + Total Award - Total Redeem ± Total Adjust`. + +## Mối quan hệ với modules khác + +- **Account**: Sao kê luôn gắn liền với một Tài khoản (Account) cụ thể. +- **Pool Definition**: Bản ghi sao kê chỉ theo dõi biến động điểm của một Pool nhất định (Statement Pool). +- **Transaction History**: Chi tiết các giao dịch hiển thị trong sao kê chính là các bản ghi từ lịch sử giao dịch phát sinh trong chu kỳ (Cycle Start Date đến Cycle Statement Date). + +## Ví dụ thực tế + +Tài khoản Thẻ tín dụng A có chu kỳ sao kê từ 01/10 đến 31/10 cho Pool "Điểm thưởng thường niên". +- **Opening Balance** (01/10): 1,000 điểm. +- **Trong kỳ** (01/10 - 31/10): Phát sinh 3 giao dịch mua sắm (Tổng Award = 500 điểm), đổi quà 1 lần (Tổng Redeem = 200 điểm). +- **Batch job** chạy đêm 31/10 sẽ chốt bản ghi Statement tháng 10 cho tài khoản A: Total Award = 500, Total Redeem = 200, Closing Balance = 1,300 điểm. diff --git a/docs/knowledge-cards/customer/transaction_history.md b/docs/knowledge-cards/customer/transaction_history.md new file mode 100644 index 0000000..9bca25e --- /dev/null +++ b/docs/knowledge-cards/customer/transaction_history.md @@ -0,0 +1,83 @@ +--- +card_id: "customer/transaction_history" +title: "Lịch sử giao dịch (Transaction History)" +domain: "customer" +related_cards: + - "customer/account" + - "customer/card" + - "campaign/campaign_rule" + - "campaign/pool_definition" + - "campaign/counter_definition" +tags: ["transaction", "history", "reward", "redemption", "counter"] +--- + +# Lịch sử giao dịch (Transaction History) + +## Mô tả ngắn + +Transaction History là bản ghi lưu vết tất cả các giao dịch của khách hàng trên hệ thống OLS (bao gồm cả giao dịch hủy), thường hiển thị cho 12 tháng gần nhất (dựa trên tham số housekeep). Mỗi bản ghi chứa thông tin chi tiết về tài khoản, giá trị giao dịch, điểm thưởng/đổi/điều chỉnh, cập nhật bộ đếm và chi tiết đổi quà. + +## Thuật ngữ liên quan + +- **OLS Transaction Code**: Mã giao dịch trên hệ thống OLS để định danh loại nghiệp vụ. +- **Housekeep parameter**: Tham số hệ thống quyết định thời gian lưu trữ hiển thị (VD: 12 tháng). +- **MCC (Merchant Category Code)**: Mã danh mục của đơn vị chấp nhận thẻ. +- **POS Entry Mode**: Phương thức nhập dữ liệu giao dịch tại thiết bị thanh toán. +- **Pool Unit**: Đơn vị điểm thưởng tương ứng với một Pool cụ thể (Earn/Redeem/Adjust). + +## Cấu trúc dữ liệu (Data Schema) + +Bản ghi Transaction tổng hợp thông tin từ nhiều khía cạnh: + +### 1. Chi tiết tài khoản (Account Detail) +- **Account Number / Type / Level**: Số tài khoản, loại và hạng tài khoản sản phẩm thực hiện giao dịch. +- **Card Number**: Số thẻ thực hiện giao dịch. + +### 2. Chi tiết giao dịch (Transaction Detail) +- **Invoice No / Reference No**: Số hóa đơn nội bộ sinh bởi OLS và Số tham chiếu giao dịch. +- **Source Reference Number**: Số tham chiếu từ hệ thống nguồn bên ngoài. +- **OLS Transaction Code**: Mã giao dịch trên OLS. +- **Gross / Nett Amount**: Giá trị giao dịch gộp và ròng. +- **Award / Redeem / Adjust Points**: Tổng điểm thưởng, đổi, hoặc điều chỉnh (giá trị này bằng tổng của tất cả các Campaign Rules được áp dụng). +- **Date Information**: Ngày giao dịch, Ngày đăng (Post Date), Ngày ghi sổ (Settlement Date). +- **MCC / Store / Terminal**: Thông tin điểm chấp nhận giao dịch, mã cửa hàng, thiết bị đầu cuối. +- **Cancellation Indicator**: Chỉ thị xác định giao dịch đã hủy. +- **Transaction Mode / Channel**: Phương thức và kênh giao dịch. + +### 3. Chi tiết phân bổ thưởng (Reward Details - Quick View) +- **Campaign Rule**: Mã quy tắc chiến dịch đã áp dụng. +- **Transaction Type / OLS Code**: Loại giao dịch và mã OLS tương ứng. +- **Pool & Pool Unit**: Pool nhận điểm và số lượng/giá trị Pool Unit được cộng/trừ. + +### 4. Chi tiết cập nhật bộ đếm (Counter Details) +- **Campaign Rule**: Mã quy tắc kích hoạt. +- **Counter & Entity**: Bộ đếm được cập nhật và Cấp thực thể (Entity level). +- **Counter Value**: Giá trị bộ đếm thay đổi. +- **Bucket Info**: Số thứ tự bucket, Ngày bắt đầu và kết thúc của bucket được cập nhật. + +### 5. Chi tiết đổi quà (Item Redemption Details) +- **Item**: Mã vật phẩm (Item) được đổi. +- **Redeemed Quantity / Points**: Số lượng và tổng điểm đã sử dụng. +- **Cash Amount Used**: Số tiền mặt (nếu có) dùng để đổi kèm. + +## Cách hoạt động (How It Works) + +- **Lưu trữ tổng hợp**: Một record Transaction Detail là sự kết hợp của tất cả các trường đầu vào được gán cho một OLS Reference No duy nhất. Nó ghi nhận cả giá trị tài chính (Gross/Nett) lẫn logic Loyalty (Points). +- **Tính nhất quán dữ liệu**: Tổng số điểm thưởng (Award), điểm đổi (Redeem) và điểm điều chỉnh (Adjust) hiển thị ở Transaction Detail PHẢI BẰNG tổng các giá trị chi tiết được sinh ra bởi từng Campaign Rule tương ứng trong mục Reward Details. +- **View-only**: Chức năng/bản ghi này chủ yếu dùng để tra cứu (View only) phục vụ Customer 360, bao gồm cả các giao dịch đã bị hủy. +- **Gắn kết quy tắc**: Một giao dịch có thể kích hoạt không, một hoặc nhiều Campaign Rule, dẫn đến việc sinh ra nhiều bản ghi phân bổ Pool hoặc cập nhật Counter đồng thời. + +## Mối quan hệ với modules khác + +- **Account** / **Card**: Transaction luôn được gắn với một tài khoản và/hoặc thẻ cụ thể. +- **Campaign Rule**: Giao dịch thỏa điều kiện sẽ kích hoạt Rule, ghi nhận vào chi tiết thưởng của giao dịch. +- **Pool Definition**: Điểm thưởng/đổi/điều chỉnh của giao dịch được hạch toán vào các Pool cụ thể. +- **Counter Definition**: Giao dịch có thể làm thay đổi giá trị của một hoặc nhiều bộ đếm (cập nhật vào bucket tương ứng). +- **Item Master**: Giao dịch đổi quà (Redemption) sẽ liên kết với Item được đổi. + +## Ví dụ thực tế + +Khách hàng quẹt thẻ tín dụng tại siêu thị (MCC 5411) số tiền 500.000 VNĐ. Hệ thống OLS sinh ra bản ghi Transaction: +- **Transaction Detail**: Gross Amount = 500.000, MCC = 5411, Award Points = 50, OLS Transaction Code = "RETAIL_PURCHASE". +- **Reward Detail**: Áp dụng "Campaign Rule: Mua sắm siêu thị cuối tuần", cộng 50 Pool Unit vào "Pool: Điểm tiêu dùng". +- **Counter Detail**: Cập nhật "Counter: Tổng chi tiêu tháng 10" thêm 500.000 vào giá trị hiện tại. diff --git a/docs/knowledge-cards/marketing/ab_testing.md b/docs/knowledge-cards/marketing/ab_testing.md new file mode 100644 index 0000000..a9d866b --- /dev/null +++ b/docs/knowledge-cards/marketing/ab_testing.md @@ -0,0 +1,78 @@ +--- +card_id: "marketing/ab_testing" +title: "Thử nghiệm A/Bn (A/Bn Testing)" +domain: "marketing" +related_cards: + - "marketing/marketing_campaign" + - "marketing/marketing_message" +tags: ["marketing", "AB testing", "content", "targeting", "optimization"] +--- + +# Thử nghiệm A/Bn (A/Bn Testing) + +## Mô tả ngắn + +A/Bn Testing là chức năng dùng để đánh giá và tối ưu hóa các chiến dịch tiếp thị. Bằng cách so sánh nhiều biến thể (A, B, ..., n) của nội dung tin nhắn hoặc của tập khách hàng mục tiêu, hệ thống giúp người dùng xác định phương án mang lại tương tác và hiệu quả cao nhất. + +## Thuật ngữ liên quan + +- **A/Bn Testing**: Thử nghiệm nhiều hơn hai biến thể cùng một lúc (A, B, C, D...). +- **Content Marketing Testing**: Thử nghiệm các nội dung (Message Template) khác nhau trên cùng một tập khách hàng mục tiêu. +- **Target Customer Testing**: Thử nghiệm cùng một nội dung trên các tập khách hàng mục tiêu (OMR Criteria) khác nhau. + +## Cấu trúc dữ liệu (Data Schema) + +*Cấu hình thử nghiệm A/Bn chia làm hai loại: Nội dung (Content) và Khách hàng (Targeting).* + +### Thông tin chung (Chung cho cả hai loại) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Campaign ID | Mã định danh duy nhất của chiến dịch thử nghiệm | Không chứa ký tự đặc biệt. | +| Message Channel | Kênh gửi tin nhắn (SMS, Email, Push Notification) | Bắt buộc chọn 1. | +| Effective Date From / To | Thời gian hiệu lực của chiến dịch thử nghiệm | Bắt buộc. | +| Run Schedule | Lịch chạy chiến dịch (One time, Daily, Weekly, Monthly, Annually) | Bắt buộc chọn và cấu hình chi tiết giống Marketing Campaign (OMR). | + +### Cấu hình Content Marketing Testing + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| OMR Criteria | Điều kiện lọc danh sách khách hàng mục tiêu (Target Customer) chung | Chỉ có 1 tập khách hàng duy nhất cho tất cả biến thể. | +| Variant A, B, ... n | Các biến thể nội dung tin nhắn (Message Template) | Bắt buộc có ít nhất 2 biến thể. Tên mỗi biến thể phải là duy nhất. | + +### Cấu hình Target Customer Testing + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Variant A, B, ... n | Các biến thể tập khách hàng mục tiêu (OMR Criteria) khác nhau | Bắt buộc có ít nhất 2 biến thể. Cùng sử dụng chung 1 nội dung tin nhắn. | + +## Cách hoạt động (How It Works) + +- **Kích hoạt Batch Job**: Hệ thống (ABn Job) chạy định kỳ để quét các chiến dịch A/Bn đang trong thời gian hiệu lực và có lịch chạy (Run Schedule) khớp với ngày hiện tại. +- **Xử lý Content Testing**: + - Hệ thống lấy ra tập khách hàng mục tiêu chung dựa trên cấu hình *OMR Criteria*. + - Chia tập khách hàng này thành các nhóm nhỏ và gửi các *Variant Nội dung* (Message Template) khác nhau cho từng nhóm. + - Phối hợp với đối tác thứ ba (Third-party) để thu thập dữ liệu về Tỷ lệ mở (Open Rate), Tỷ lệ click (Click-through Rate) của từng biến thể nội dung, từ đó lập báo cáo so sánh. +- **Xử lý Target Customer Testing**: + - Hệ thống áp dụng từng cấu hình *Variant Tập khách hàng* (Criteria A, B, n...) để lấy ra các danh sách khách hàng khác nhau. + - Sau khi batch job chạy xong, người dùng có thể xem kết quả quy mô và đặc điểm (số lượng, giới tính...) của từng tập khách hàng thu được để đánh giá điều kiện lọc nào tiếp cận đúng đối tượng hơn. + +## Mối quan hệ với modules khác + +- **Marketing Campaign**: Cả hai tính năng đều sử dụng chung cách cấu hình điều kiện lọc khách hàng (OMR Criteria) và cấu hình lịch chạy (Run Schedule). +- **Marketing Message**: Các nội dung tin nhắn (Message Template) đã tạo trước đó sẽ được sử dụng để làm các biến thể (Variant) trong loại thử nghiệm Content Marketing. + +## Ví dụ thực tế + +**1. Thử nghiệm Nội dung (Content Testing):** +- Mục tiêu: Xem thông điệp nào thu hút khách hàng nữ click vào link hơn. +- Cấu hình: Target chung là "Khách hàng Nữ, độ tuổi 20-30". +- Biến thể A: Gửi mẫu tin SMS "Giảm 50% thời trang nữ cuối tuần, [Link]". +- Biến thể B: Gửi mẫu tin SMS "Freeship cho đơn hàng từ 200k, [Link]". +Hệ thống gửi ngẫu nhiên cho tập mục tiêu và theo dõi SMS nào có tỷ lệ click link cao hơn. + +**2. Thử nghiệm Tập khách hàng (Targeting Testing):** +- Mục tiêu: Xem nhóm khách hàng nào có quy mô lớn hơn với cùng một điều kiện chi tiêu. +- Biến thể A: OMR Criteria là "Khách hàng chi tiêu > 5 triệu VÀ ở Hà Nội". +- Biến thể B: OMR Criteria là "Khách hàng chi tiêu > 5 triệu VÀ ở TP.HCM". +Sau khi chạy thử nghiệm, người dùng xem báo cáo sẽ biết Variant nào trả về danh sách khách hàng nhiều hơn. diff --git a/docs/knowledge-cards/marketing/audience_filter.md b/docs/knowledge-cards/marketing/audience_filter.md new file mode 100644 index 0000000..9d10f88 --- /dev/null +++ b/docs/knowledge-cards/marketing/audience_filter.md @@ -0,0 +1,75 @@ +--- +card_id: "marketing/audience_filter" +title: "Bộ lọc đối tượng (Audience Filter: Blacklist & Whitelist)" +domain: "marketing" +related_cards: + - "marketing/marketing_campaign" + - "marketing/frequency_capping" +tags: ["blacklist", "whitelist", "filter", "audience", "exclude"] +--- + +# Bộ lọc đối tượng (Audience Filter: Blacklist & Whitelist) + +## Mô tả ngắn + +Audience Filter là module quản lý các danh sách khách hàng đặc biệt để can thiệp vào luồng gửi thông điệp của hệ thống Marketing. Nó bao gồm **Blacklist** (Danh sách đen: chặn khách hàng nhận mọi thông điệp, thường dùng cho khách hàng fraud) và **Whitelist** (Danh sách trắng: loại trừ khách hàng khỏi các quy tắc Frequency Capping, đảm bảo họ luôn nhận được thông điệp mà không bị giới hạn số lượng). + +## Thuật ngữ liên quan + +- **Blacklist**: Danh sách khách hàng bị chặn (block) không nhận thông báo khuyến mãi/chiến dịch marketing. +- **Whitelist**: Danh sách khách hàng được ưu tiên, loại trừ khỏi quy tắc Frequency Capping mặc định. +- **CIF (Customer Information File) number**: Mã định danh khách hàng trên hệ thống OLS (Core System), dùng để thêm khách hàng vào danh sách. +- **Frequency Capping**: Quy tắc giới hạn tần suất gửi tin nhắn marketing. + +## Cấu trúc dữ liệu (Data Schema) + +Cấu trúc dữ liệu của Blacklist và Whitelist là tương tự nhau. + +### Thông tin chung + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| ID | Mã định danh danh sách (Blacklist/Whitelist Identifier) | Tự sinh, String (10). | +| Name List | Tên của danh sách (Blacklist/Whitelist) | Required. String (50). | +| Description | Mô tả chi tiết mục đích của danh sách | Optional. String (200). | +| Input Type | Phương thức nhập liệu danh sách khách hàng | Enum: "Input from screen" hoặc "Upload file". | + +### Quản lý danh sách khách hàng (Customer List) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Customer List (Dropdown) | Chọn trực tiếp khách hàng theo mã CIF (nếu Input Type = "Input from screen") | Multi-select. Phải nhập ít nhất 4 ký tự của CIF để tìm kiếm nhằm đảm bảo hiệu năng. | +| Upload file | Tải lên file danh sách khách hàng (nếu Input Type = "Upload file") | Cho phép định dạng CSV, xls, xlsx. Dung lượng ≤ 50MB. | + +## Cách hoạt động (How It Works) + +### Quản lý danh sách + +1. **Tạo danh sách**: Người dùng (có quyền tương ứng) tạo một Blacklist hoặc Whitelist mới. +2. **Thêm khách hàng**: Có hai cách để đưa khách hàng vào danh sách: + - **Nhập thủ công (Input from screen)**: Tìm kiếm và chọn mã CIF của khách hàng từ hệ thống OLS. + - **Tải file (Upload file)**: Tải lên một file (.csv, .xls, .xlsx) chứa danh sách khách hàng. Hệ thống sẽ validate định dạng và dung lượng file (tối đa 50MB). Nếu có lỗi, hệ thống báo lỗi và yêu cầu tải lại file khác. Trạng thái xử lý file được hiển thị rõ ràng. +3. **Phê duyệt**: Sau khi tạo, danh sách cần được review và approve (phê duyệt) tương tự như các màn hình cấu hình khác trong hệ thống. +4. **Truy xuất & Tải xuống**: Người dùng có thể xem trước danh sách trên màn hình hoặc tải file danh sách về (hệ thống sẽ sinh file CSV cho danh sách nhập thủ công, hoặc trả về file gốc nếu danh sách được tạo qua upload). + +### Ứng dụng trong chiến dịch Marketing + +- **Blacklist**: Khi một chiến dịch Marketing chuẩn bị gửi thông điệp, hệ thống sẽ đối chiếu với Blacklist (nếu được áp dụng). Bất kỳ khách hàng nào nằm trong Blacklist sẽ tự động bị loại khỏi tập đối tượng mục tiêu, thông điệp sẽ không được gửi đi. +- **Whitelist**: Theo mặc định, tập khách hàng trong Whitelist sẽ được bypass (bỏ qua) mọi quy tắc giới hạn của **Frequency Capping**. Nếu một giới hạn tần suất cụ thể (Cap rules) nào đó VẪN MUỐN áp dụng lên Whitelist, người dùng cần chỉ định rõ Whitelist đó trong cấu hình Cap rules. Điều này hữu ích để gửi tin liên tục cho các mục đích testing, hoặc cho tập khách hàng VIP. + +## Mối quan hệ với modules khác + +- **Marketing Campaign**: Cấu hình chiến dịch cần kiểm tra đối chiếu danh sách Blacklist để chặn thông điệp đối với các tập khách hàng rủi ro. +- **Frequency Capping**: Whitelist có liên kết trực tiếp với Frequency Capping, cho phép cấu hình một số khách hàng vượt qua quy tắc giới hạn tần suất gửi tin. + +## Ví dụ thực tế + +**Tạo danh sách chặn (Blacklist)**: +- Ngân hàng phát hiện 500 khách hàng có hành vi trục lợi khuyến mãi (fraud). +- User tạo một Blacklist tên "Fraud_Customer_Q3", chọn `Input Type = Upload file` và tải lên file `.xlsx` chứa 500 số CIF. +- Sau khi được approve, hệ thống lưu danh sách này. Các chiến dịch Marketing sau đó sẽ không bao giờ gửi SMS/Email tới 500 người này. + +**Tạo danh sách ưu tiên (Whitelist)**: +- Đội ngũ UAT cần test luồng gửi Email cho một campaign mới. +- User tạo một Whitelist tên "UAT_Testers", chọn `Input Type = Input from screen` và nhập 5 mã CIF của các nhân viên test. +- Khi test, dù chiến dịch có quy định "Mỗi user chỉ nhận 1 email/ngày", các testers vẫn có thể nhận nhiều email thử nghiệm liên tiếp do được bypass quy định Frequency Capping. diff --git a/docs/knowledge-cards/marketing/frequency_capping.md b/docs/knowledge-cards/marketing/frequency_capping.md new file mode 100644 index 0000000..bad99df --- /dev/null +++ b/docs/knowledge-cards/marketing/frequency_capping.md @@ -0,0 +1,76 @@ +--- +card_id: "marketing/frequency_capping" +title: "Giới hạn Tần suất (Frequency Capping)" +domain: "marketing" +related_cards: + - "marketing/marketing_campaign" + - "marketing/marketing_message" + - "targeting/segmentation" +tags: ["marketing", "capping", "limit", "notification", "spam"] +--- + +# Giới hạn Tần suất (Frequency Capping) + +## Mô tả ngắn + +Frequency Capping là cấu hình giới hạn số lượng tin nhắn tối đa được phép gửi đến một khách hàng thông qua một kênh liên lạc cụ thể (SMS, Email, Push Notification) trong một khoảng thời gian nhất định. Mục đích là để bảo vệ trải nghiệm khách hàng, tránh tình trạng spam và tối ưu hóa chi phí gửi tin nhắn của hệ thống OneMarketing. + +## Thuật ngữ liên quan + +- **Notification Channel**: Kênh gửi thông báo (SMS, Email, Push Notifications). +- **Capping Period**: Chu kỳ giới hạn (Daily, Weekly, Monthly). +- **Whitelist**: Danh sách khách hàng ngoại lệ, được phép bỏ qua các quy tắc giới hạn tần suất chung. + +## Cấu trúc dữ liệu (Data Schema) + +### Thông tin giới hạn chung + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Frequency Cap Id | Mã định danh cấu hình giới hạn tần suất | Bắt buộc. | +| Notification Channel | Kênh thông báo áp dụng giới hạn (SMS, Email, Push Notifications) | Bắt buộc. Chỉ được có 1 cấu hình hiệu lực cho 1 kênh tại 1 thời điểm. | +| Effective Date From / To | Thời gian cấu hình có hiệu lực | Bắt buộc. | +| Description | Mô tả cấu hình | Không bắt buộc. | + +### Cấu hình chu kỳ (Period Units) + +*Một cấu hình có thể bao gồm nhiều chu kỳ (Period Unit) khác nhau.* + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Capping Period | Chu kỳ áp dụng giới hạn: Daily (Hàng ngày), Weekly (Hàng tuần), Monthly (Hàng tháng) | Bắt buộc. Không được cấu hình trùng chu kỳ trong cùng 1 channel. | +| Maximum number | Số lượng tin nhắn tối đa được phép gửi cho 1 khách hàng trong chu kỳ | Bắt buộc. Lớn hơn 0. | + +### Danh sách ngoại lệ (Whitelist) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Include Whitelist | Cờ đánh dấu có áp dụng ngoại lệ cho tệp khách hàng đặc biệt hay không | Mặc định OFF. | +| Customer list | Danh sách khách hàng đặc biệt được bỏ qua giới hạn tần suất (nhận được nhiều tin nhắn hơn bình thường) | Bắt buộc nếu Include Whitelist = ON. Lookup từ hệ thống phân tập (Segmentation). | + +## Cách hoạt động (How It Works) + +- **Cấu hình**: Quản trị viên thiết lập số lượng thông báo tối đa cho từng kênh (VD: SMS tối đa 1 tin/ngày, 3 tin/tuần). Các cấu hình này được áp dụng chung cho tất cả chiến dịch Marketing (OMR) trên toàn hệ thống. +- **Theo dõi**: Hệ thống tự động theo dõi (track) số lượng tin nhắn mà mỗi khách hàng đã nhận được trên từng kênh và trên từng chu kỳ (ngày, tuần, tháng). +- **Kiểm tra trước khi gửi**: Khi một chiến dịch Marketing (`marketing/marketing_campaign`) chuẩn bị gửi tin nhắn cho khách hàng: + - Hệ thống kiểm tra số lượng tin đã gửi trong kỳ so với giới hạn cấu hình. + - Nếu đã đạt hoặc vượt ngưỡng giới hạn (Maximum number) → tin nhắn sẽ KHÔNG được gửi đi cho khách hàng đó. + - Nếu chưa đạt ngưỡng → tin nhắn được gửi và hệ thống cộng dồn bộ đếm. +- **Ngoại lệ (Whitelist)**: Nếu khách hàng nằm trong "Customer list" của Whitelist, hệ thống sẽ bỏ qua kiểm tra giới hạn và cho phép gửi tin bình thường, đảm bảo các tin nhắn quan trọng đến được nhóm khách VIP hoặc nhóm nội bộ. + +## Mối quan hệ với modules khác + +- **Marketing Campaign (OMR)**: OMR là nơi phát sinh yêu cầu gửi tin nhắn, Frequency Capping đóng vai trò như một màng lọc cuối cùng chặn tin nhắn nếu vi phạm giới hạn. +- **Marketing Message**: Nội dung được gửi đi qua các kênh (SMS/Email/Push), chịu sự kiểm soát của Frequency Capping. +- **Segmentation**: Nguồn cung cấp danh sách khách hàng để cấu hình vào mục Whitelist (Customer list). + +## Ví dụ thực tế + +**Tránh spam SMS hàng ngày:** +- Cấu hình Kênh = SMS. +- Period Unit 1: Daily = Tối đa 2 tin/ngày. +- Period Unit 2: Weekly = Tối đa 5 tin/tuần. +Nếu một khách hàng đã nhận 2 SMS quảng cáo vào buổi sáng, thì bất kỳ chiến dịch Marketing nào định gửi thêm SMS thứ 3 trong ngày hôm đó cho họ sẽ bị hệ thống tự động chặn lại. + +**Ngoại lệ cho nhân viên (Whitelist):** +- Trong lúc testing, team marketing cấu hình Include Whitelist = ON và chọn danh sách "Nhân viên nội bộ". Dù giới hạn là 1 tin/ngày, các nhân viên trong danh sách này vẫn có thể nhận 10 tin/ngày để kiểm thử tính năng gửi tin của OMR mà không bị chặn. diff --git a/docs/knowledge-cards/marketing/marketing_campaign.md b/docs/knowledge-cards/marketing/marketing_campaign.md new file mode 100644 index 0000000..b2086fc --- /dev/null +++ b/docs/knowledge-cards/marketing/marketing_campaign.md @@ -0,0 +1,84 @@ +--- +card_id: "marketing/marketing_campaign" +title: "Yêu cầu Tiếp thị (OneMarketing Request - OMR)" +domain: "marketing" +related_cards: + - "marketing/marketing_message" + - "marketing/frequency_capping" + - "campaign/campaign_rule" + - "campaign/transaction_codes" +tags: ["marketing", "campaign", "OMR", "notification", "schedule", "trigger"] +detail_refs: + - "marketing/omr_execution_flow" +--- + +# Yêu cầu Tiếp thị (OneMarketing Request - OMR) + +## Mô tả ngắn + +OneMarketing Request (OMR) là chức năng lọc và chọn danh sách khách hàng mục tiêu thỏa mãn các điều kiện tiếp thị. OMR cho phép gửi thông báo (Notification) tự động hoặc kích hoạt quy tắc chiến dịch thưởng (Trigger Campaign Rule) dựa trên lịch trình cài đặt sẵn hoặc khi có sự kiện hệ thống phát sinh. + +## Thuật ngữ liên quan + +- **OMR (OneMarketing Request)**: Yêu cầu tiếp thị, chứa điều kiện lọc khách hàng và hành động thực thi. +- **Notification**: Chức năng gửi tin nhắn/thông báo đến khách hàng. +- **Trigger Campaign Rule (TCR)**: Chức năng tự động kích hoạt Rule thưởng (cộng/trừ/đổi điểm) cho khách hàng. +- **Run Schedule**: Lịch trình tự động chạy OMR (một lần, hàng ngày, hàng tuần, hàng tháng, hàng năm). + +## Cấu trúc dữ liệu (Data Schema) + +### Thông tin chung (General Information) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Request ID | Mã định danh duy nhất của OMR | Không chứa ký tự đặc biệt. | +| Description | Mô tả chi tiết OMR | Bắt buộc. | +| Effective Date From/To | Khoảng thời gian OMR có hiệu lực | Bắt buộc. | +| Marketing Function | Hành động: Notification (gửi tin) hoặc Trigger Campaign Rule (chạy Rule thưởng) | Bắt buộc chọn 1. | + +### Cài đặt Lịch & Nội dung (Run Schedule & Message Content) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Trigger method | Phương thức kích hoạt: Schedule (theo lịch) hoặc Event trigger (theo sự kiện) | Bắt buộc. | +| Run Schedule | Lịch chạy: One time, Daily, Weekly, Monthly, Annually | Cần thiết nếu chọn Schedule. | +| Business Event | Sự kiện kích hoạt OMR (VD: đăng nhập, xem số dư) | Cần thiết nếu chọn Event trigger. | +| Message template | Mẫu tin nhắn gửi cho khách hàng | Bắt buộc nếu Marketing Function = Notification. | +| OLS Transaction Code | Mã giao dịch kích hoạt hệ thống thưởng | Bắt buộc nếu Marketing Function = Trigger Campaign Rule. | + +### Điều kiện mục tiêu (Targeting) + +| Field Name | Description | Constraints / Rules | +|---|---|---| +| Targeting Method | Phương pháp chọn mục tiêu: OMR Criteria (cấu hình điều kiện) hoặc Upload file | Bắt buộc. | +| OMR Criteria | Các điều kiện (AND/OR) để lọc khách hàng, hỗ trợ loại trừ (NOT) | Áp dụng khi chọn OMR Criteria. | +| Upload file | File danh sách khách hàng mục tiêu có sẵn | Áp dụng khi chọn Upload file. | + +## Cách hoạt động (How It Works) + +- **Kích hoạt theo lịch (Schedule)**: Hệ thống chạy OMR Batch Job định kỳ. Job này tìm các OMR đang trong thời gian hiệu lực và có lịch chạy trùng với ngày/giờ hiện tại. +- **Kích hoạt theo sự kiện (Event trigger)**: Khi một sự kiện nghiệp vụ xảy ra (VD: qua API hoặc Frontend event), hệ thống gọi Backend kiểm tra xem có OMR nào gắn với sự kiện này không để kích hoạt lập tức. +- **Xử lý Hành động (Marketing Function)**: + - Nếu chức năng là **Notification**: OMR lấy danh sách khách hàng từ phần *Targeting* và gửi *Message template* đến họ. Quá trình gửi sẽ dừng lại nếu chạm ngưỡng giới hạn cấu hình trong Frequency Capping. + - Nếu chức năng là **Trigger Campaign Rule**: OMR gọi hệ thống Rule, tạo một giao dịch giả lập với *OLS Transaction Code* đã chọn để kích hoạt tính toán thưởng (cộng/trừ điểm/cashback) cho tập khách hàng mục tiêu. + +## Mối quan hệ với modules khác + +- **Marketing Message**: OMR sử dụng Message để làm mẫu nội dung gửi cho khách hàng khi chức năng là Notification. +- **Frequency Capping**: Cấu hình giới hạn tần suất gửi tin, giúp OMR biết khi nào phải dừng gửi thông báo để tránh spam khách hàng. +- **Campaign Rule**: Nếu chức năng là Trigger Campaign Rule, OMR sẽ đóng vai trò như một nguồn phát sinh giao dịch để kích hoạt các Rule tính thưởng. +- **Transaction Codes**: OMR cần truyền một Transaction Code cụ thể để hệ thống Loyalty nhận diện và đánh giá đúng Campaign Rule tương ứng. + +## Ví dụ thực tế + +**1. Gửi SMS chúc mừng sinh nhật:** +- **General**: Function = Notification. +- **Schedule**: Trigger = Schedule, Daily vào lúc 8:00 sáng. +- **Message**: Template "Chúc mừng sinh nhật khách hàng". +- **Targeting**: OMR Criteria chọn điều kiện "Khách hàng có sinh nhật trong hôm nay". + +**2. Tặng 100 điểm thưởng nhân dịp Tết:** +- **General**: Function = Trigger Campaign Rule. +- **Schedule**: Trigger = Schedule, One time vào ngày mùng 1 Tết. +- **TC**: OLS Transaction Code = "TET_BONUS". +- **Targeting**: Upload file danh sách 10.000 khách hàng thân thiết. Khi chạy, hệ thống sẽ trigger TC "TET_BONUS" cho 10.000 khách hàng này để cộng điểm (theo Rule đã cấu hình bên Loyalty). diff --git a/docs/knowledge-cards/marketing/marketing_message.md b/docs/knowledge-cards/marketing/marketing_message.md new file mode 100644 index 0000000..b8b8606 --- /dev/null +++ b/docs/knowledge-cards/marketing/marketing_message.md @@ -0,0 +1,74 @@ +--- +card_id: "marketing/marketing_message" +title: "Mẫu thông báo (Marketing Message)" +domain: "marketing" +related_cards: + - "campaign/campaign_rule" + - "catalogue/item_master" +tags: ["Message", "SMS", "Email", "Push Notification", "OMR-type"] +--- + +# Mẫu thông báo (Marketing Message) + +## Mô tả ngắn + +Marketing Message là module quản lý và định nghĩa các thông báo gửi đến khách hàng mục tiêu qua nhiều kênh giao tiếp (Channels) khác nhau như SMS, Email, và Push Notification. Hệ thống hỗ trợ tạo thông báo từ nội dung chữ thuần (text) hoặc HTML template, kết hợp các tham số động (message parameters) để cá nhân hoá nội dung. + +## Thuật ngữ liên quan + +- **Channel**: Kênh giao tiếp, ví dụ: SMS, Email, Push Notification. +- **Richer Push / Carousel Push**: Các định dạng thông báo Push trên ứng dụng có hỗ trợ đính kèm một ảnh (Richer) hoặc nhiều ảnh vuốt ngang (Carousel). +- **Message Parameter**: Tham số động có thể kéo/thả vào nội dung (VD: Tên khách hàng, Số dư điểm) để cá nhân hóa khi gửi. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. SMS Message +| Field | Description | Type | +| --- | --- | --- | +| Message ID / Description | Mã định danh duy nhất và mô tả thông báo. | Character | +| SMS Type | Loại SMS: Promotion/Marketing hoặc Transaction. | Drop-down | +| Effective Date (From-To) | Thời gian hiệu lực của mẫu thông báo. | Date | +| SMS Brand Name | Tên hiển thị người gửi SMS (Sender). | Drop-down | +| Message | Nội dung Unicode, không hỗ trợ hình ảnh/đính kèm. Cho phép chèn Message Parameters. | Character | +| Send Sample | Nút test thông báo qua SĐT thực tế. | Button | + +### 2. Email Message +| Field | Description | Type | +| --- | --- | --- | +| Email Type | Loại Email: Promotion/Marketing hoặc Transaction. | Drop-down | +| Use type | Chọn cách tạo: Viết trực tiếp (Use message) hoặc Upload HTML (Upload template). | Checkbox | +| Sender Name / From email | Tên hiển thị người gửi và Email gốc đã cấu hình. | Character | +| Subject / Preview Text | Tiêu đề Email và văn bản Preheader (hiển thị tóm tắt trên hộp thư). | Character | +| Message / Upload file | Nội dung soạn thảo HTML hoặc file HTML được upload. | Character/File | + +### 3. Push Notification +| Field | Description | Type | +| --- | --- | --- | +| Notification Type | Loại Push: Promotion/Marketing hoặc Transaction. | Drop-down | +| Message Title | Tiêu đề chính hiển thị trên thông báo. | Character | +| Image type | Tùy chọn ảnh: Single (Không ảnh), Richer (1 ảnh), Carousel (Nhiều ảnh). | Drop-down | +| Upload Image / Link URL | Hình ảnh đính kèm và đường link điều hướng khi click. | File/Character | +| Send Sample | Nút gửi test bằng cách nhập số CIF để xác định thiết bị nhận. | Button | + +## Cách hoạt động (How It Works) + +- **Cá nhân hóa nội dung:** Người dùng soạn thông báo có thể kéo thả các Message Parameters (như `{{CustomerName}}`) vào nội dung. Khi gửi, hệ thống thay thế tham số bằng thông tin thật của khách hàng. +- **Kiểm thử thông báo (Send Sample):** Hỗ trợ test hiển thị trước khi áp dụng: + - *SMS*: Nhập số điện thoại. + - *Email*: Nhập địa chỉ Email. + - *Push*: Nhập CIF Number để hệ thống dò Registration Token của thiết bị. +- **Upload Template:** Với kênh Email, người dùng có thể upload file thiết kế dạng HTML có sẵn và chỉnh sửa trực tiếp. Với kênh Push, hỗ trợ đính kèm hình ảnh và URL điều hướng. + +## Mối quan hệ với modules khác + +- **Campaign Rule**: Các rule kịch bản chiến dịch (`campaign/campaign_rule`) sử dụng mẫu thông báo này để gửi tự động cho khách hàng khi họ thoả điều kiện thưởng. +- **Item Master**: Mẫu thông báo cũng có thể được dùng trong luồng đổi quà (`catalogue/item_master`) để gửi xác nhận đổi quà thành công. + +## Ví dụ thực tế + +**Tạo mẫu Email thông báo đổi điểm:** +1. Marketer tạo Message mới chọn kênh **Email**, loại **Transaction**. +2. Thiết lập Sender là `CSKH Loyalty`, Subject là `Xác nhận đổi quà thành công`. +3. Trong nội dung, nhập: `Chào {{Customer_Name}}, bạn đã đổi thành công {{Item_Name}}. Số dư hiện tại là {{Pool_Balance}} điểm.` +4. Chọn **Send Sample**, nhập email của chính mình để test. Hệ thống gửi email preview về hộp thư. +5. Sau khi lưu, mẫu này được gắn vào Item Master hoặc Campaign Rule để tự động kích hoạt. diff --git a/docs/knowledge-cards/system/application_parameter.md b/docs/knowledge-cards/system/application_parameter.md new file mode 100644 index 0000000..b1f1b90 --- /dev/null +++ b/docs/knowledge-cards/system/application_parameter.md @@ -0,0 +1,68 @@ +--- +card_id: "system/application_parameter" +title: "Tham số hệ thống (Application Parameter)" +domain: "system" +related_cards: + - "customer/account" + - "customer/card" +tags: ["Application Parameter", "System", "Configuration", "Access Control"] +--- + +# Tham số hệ thống (Application Parameter) + +## Mô tả ngắn + +Tham số hệ thống (Application Parameter) cung cấp bộ cấu hình chuẩn để điều khiển hành vi ứng dụng. Module này giúp quản lý các thiết lập liên quan đến bảo mật tài khoản (Access Control), hiển thị giao diện (Display Setting) và chức năng hoạt động chéo (Functionality). + +## Thuật ngữ liên quan + +- **Access Control**: Các quy tắc kiểm soát quyền truy cập và bảo mật mật khẩu của người dùng. +- **Processing Date**: Ngày xử lý giao dịch do người dùng cấu hình, chủ yếu dùng cho mục đích kiểm thử (testing). +- **Cross Function Update**: Quyền cho phép cập nhật chéo dữ liệu giữa các luồng chức năng. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Access Control (Kiểm soát truy cập) +| Field | Description | Type | +| --- | --- | --- | +| Same User Cannot Approve | Không cho phép người dùng tự phê duyệt bản ghi do chính họ tạo (Mặc định: OFF). | Switch button | +| Same User Cannot Modify Own Profile | Không cho phép người dùng tự đổi thông tin cá nhân (Mặc định: OFF). | Switch Button | +| User Session Inactivity Time-out | Hết hạn phiên đăng nhập nếu không có thao tác trong N phút (Mặc định: 30). | Numeric | +| Maximum Failed Password Attempts | Khóa tài khoản nếu nhập sai mật khẩu liên tiếp N lần (Mặc định: 5). | Numeric | +| Inactivate User Id after N days | Tự động vô hiệu hóa tài khoản sau N ngày không đăng nhập (Mặc định: 30). | Numeric | +| Remind User to Change password | Nhắc đổi mật khẩu trước N ngày tính tới ngày hết hạn (Mặc định: 5). | Numeric | +| Password expiration [days] | Số ngày hiệu lực của mật khẩu trước khi bị khóa (Mặc định: 180). | Numeric | +| Disallow re-use of passwords | Không cho phép dùng lại N mật khẩu gần nhất (Mặc định: 2). | Numeric | +| Password length (Max/Min) | Độ dài tối đa (Mặc định: 50) và tối thiểu (Mặc định: 8) của mật khẩu. | Numeric | +| Password rules | Yêu cầu số lượng ký tự tối thiểu: Numeric, Upper case, Lower case, Special character (Mặc định: mỗi loại 1 ký tự). | Numeric | + +### 2. Display Setting (Thiết lập hiển thị) +| Field | Description | Type | +| --- | --- | --- | +| Date format | Định dạng hiển thị ngày trên hệ thống (Mặc định: DD/MM/YYYY). | Drop-down | +| Time format | Định dạng hiển thị giờ trên hệ thống (Mặc định: HH:mm: ss). | Drop-down | +| Amount display format | Định dạng số tiền (VD: American `999,999.99` hoặc European `999.999,99`). | Character | + +### 3. Functionality (Chức năng) +| Field | Description | Type | +| --- | --- | --- | +| Processing Date | Ngày xử lý áp dụng cho giao dịch trực tuyến (Chỉ dùng cho testing, Mặc định: Trống - dùng ngày hệ thống). | Date | +| Allow Cross Function Update | Cho phép cập nhật chéo dữ liệu khách hàng, tài khoản, thẻ (Mặc định: ON). | Switch button | + +## Cách hoạt động (How It Works) + +- **Kiểm soát bảo mật:** Hệ thống áp dụng các quy tắc Access Control để tự động cảnh báo (hết phiên, sắp hết hạn mật khẩu) hoặc khóa tài khoản (nhập sai nhiều lần, lâu không đăng nhập, hết hạn mật khẩu). +- **Quy tắc tạo mật khẩu:** Khi tạo hoặc đổi mật khẩu mới, hệ thống validate độ dài, thành phần ký tự và kiểm tra lịch sử để đảm bảo không trùng với N mật khẩu cũ. +- **Ngày xử lý giao dịch:** Nếu `Processing Date` được thiết lập, hệ thống dùng ngày này cho giao dịch trực tuyến. Nếu trống (trên Production), hệ thống sử dụng ngày hiện tại của máy chủ. + +## Mối quan hệ với modules khác + +- **Account Management**: Các tham số bảo mật và phiên đăng nhập tác động trực tiếp tới quá trình đăng nhập và bảo mật của tài khoản người dùng (`customer/account`). +- **Card Management**: Cấu hình cập nhật chéo (`Cross Function Update`) ảnh hưởng tới dữ liệu khách hàng, tài khoản và thẻ (`customer/card`). + +## Ví dụ thực tế + +**Trường hợp quản trị viên cấu hình chính sách bảo mật mới:** +1. Quản trị viên truy cập màn hình Application Parameters. +2. Cập nhật `Maximum Failed Forgotten Password Attempts` từ 5 thành 3. +3. Khi người dùng hệ thống nhập sai mật khẩu 3 lần liên tiếp, tài khoản của họ sẽ tự động bị khóa thay vì 5 lần như trước đó. diff --git a/docs/knowledge-cards/targeting/segmentation.md b/docs/knowledge-cards/targeting/segmentation.md new file mode 100644 index 0000000..8412884 --- /dev/null +++ b/docs/knowledge-cards/targeting/segmentation.md @@ -0,0 +1,56 @@ +--- +card_id: "targeting/segmentation" +title: "Phân khúc khách hàng & Tệp đối tượng (Segmentation & Audience Upload)" +domain: "targeting" +related_cards: + - "campaign/campaign_rule" + - "customer/customer_overview" +tags: ["Segmentation", "Audience Upload", "Targeting", "Demographic", "Behavior"] +--- + +# Phân khúc khách hàng & Tệp đối tượng (Segmentation & Audience Upload) + +## Mô tả ngắn + +Phân khúc khách hàng (Segmentation) là công cụ cho phép nhóm các khách hàng có chung đặc điểm (nhân khẩu học, hành vi giao dịch) thành các tập khách hàng mục tiêu. Hệ thống cung cấp hai cách tiếp cận: thiết lập logic động (segmentation rules) và upload danh sách tĩnh (Audience Upload). + +## Thuật ngữ liên quan + +- **Segmentation**: Phân đoạn khách hàng dựa trên sự kết hợp của nhiều tiêu chí (Demographic, Behavior, Psychographic). +- **Audience Upload**: Quá trình đưa danh sách khách hàng tĩnh (file CSV/Excel) vào hệ thống để dùng làm tập khách hàng mục tiêu cho các chiến dịch. +- **Demographic**: Các yếu tố nhân khẩu học như tuổi, giới tính, thu nhập, tình trạng hôn nhân. + +## Cấu trúc dữ liệu (Data Schema) + +### 1. Phân khúc khách hàng (Logic criteria) +*Segmentation sử dụng Query Builder để tạo logic lọc. Các tiêu chí phổ biến:* +- **Demographic**: Age, Gender, Income, Marital Status, DOB, Location. +- **Tenure**: Customer's Tenure, Account's Tenure (Dựa trên ngày đăng ký hoặc AOD). +- **Behavior (Giao dịch)**: Last transaction date (Recency), Transaction Frequency, Total spending value, Merchant/MCC. +- **Psychographic**: Favorite Item/Category (Dựa trên khảo sát hoặc lịch sử). + +### 2. Tệp đối tượng tĩnh (Audience Upload) +| Field | Description | Type | +| --- | --- | --- | +| File ID | ID định danh hệ thống sinh ra cho tệp (dùng nội bộ). | Character | +| Audience Name | Tên tệp khách hàng, bắt buộc phải duy nhất trên hệ thống. | Character | +| Description | Thông tin mô tả tệp. | Character | +| Upload file | File upload chứa danh sách khách hàng (Định dạng CSV, XLS, XLSX; dung lượng <= 50MB). | File | + +## Cách hoạt động (How It Works) + +- **Tạo Segment bằng Logic:** Người dùng sử dụng Query Builder kéo/thả các tiêu chí thuộc tính (Attribute Criteria) để tạo Segment. Một Segment có thể kết hợp nhiều điều kiện (VD: *Nữ giới + Có giao dịch tháng qua + Mua tại Merchant ABC*). +- **Sử dụng tệp tĩnh:** Người dùng có danh sách cụ thể có thể sử dụng chức năng Audience Upload để tải lên file CSV/Excel (<50MB). Hệ thống sẽ validate các field bắt buộc và định dạng của file để tạo thành Audience. +- **Ứng dụng Segment:** Các Segment hoặc Audience tạo ra được tái sử dụng trên module Marketing để nhắm mục tiêu (Targeting) cho chiến dịch. + +## Mối quan hệ với modules khác + +- **Campaign Rule**: Segment được sử dụng trực tiếp làm tiêu chí đầu vào (Targeting Criteria) khi thiết lập các chiến dịch thưởng (`campaign/campaign_rule`). +- **Customer Overview**: Phân khúc động (Logic Criteria) truy xuất các trường dữ liệu nhân khẩu học và hành vi từ Hồ sơ khách hàng chung (`customer/customer_overview`) để tạo bộ lọc. + +## Ví dụ thực tế + +**Tạo chiến dịch tri ân khách hàng thân thiết:** +1. Marketing tạo một Segment dựa trên Behavior: `Total spending value` > 50,000,000 VND và `Last transaction` trong vòng 3 tháng qua. +2. Ngoài ra, họ dùng `Audience Upload` tải lên file CSV danh sách 500 khách VIP do bộ phận CSKH lập sẵn. +3. Cả Segment động và Audience tĩnh này đều có thể được gán vào chiến dịch "Mừng Sinh Nhật Công Ty" để gửi quà tặng. diff --git a/docs/knowledge-refs/campaign/batch_rule_processing.md b/docs/knowledge-refs/campaign/batch_rule_processing.md new file mode 100644 index 0000000..92030b6 --- /dev/null +++ b/docs/knowledge-refs/campaign/batch_rule_processing.md @@ -0,0 +1,46 @@ +--- +ref_id: "campaign/batch_rule_processing" +parent_card: "campaign/cep_request, campaign/rep_rule" +title: "Chi tiết Lịch trình chạy Batch cho CEP/REP (Batch Rule Processing Schedule)" +domain: "campaign" +ref_type: "process_detail" +tags: ["batch", "schedule", "CEP", "REP", "extraction"] +--- + +# Chi tiết Lịch trình chạy Batch cho CEP/REP (Batch Rule Processing Schedule) + +## Thuộc về + +campaign/cep_request và campaign/rep_rule — Các card mô tả quy tắc trích xuất tự động (CEP/REP). Reference này làm rõ chi tiết các tùy chọn cấu hình lịch chạy (Run Schedule) và cách hệ thống chọn đúng Bucket để trích xuất khi Batch Job được kích hoạt. + +## Chi tiết + +### Các tùy chọn cấu hình lịch chạy (Run Schedule) + +Hệ thống cung cấp 5 loại lịch trình có thể cấu hình cho cả CEP và REP Batch Job: + +| Loại lịch chạy | Thời điểm kích hoạt Batch Job | +|---|---| +| **Daily** | Chạy hàng ngày vào cuối ngày (End-of-day batch stream). | +| **Monthly on Day N of Month** | Chạy vào ngày N cố định hàng tháng. | +| **Statement Cycle Date** | Chạy vào ngày chốt sao kê (Statement Cycle) của từng tài khoản. | +| **N Days after AOD** | Chạy vào thời điểm chính xác N ngày sau Ngày mở tài khoản (Account Opened Date). | +| **Annually, on Day N of Month M** | Chạy mỗi năm một lần vào ngày N tháng M. | + +*(Lưu ý: Trong mọi trường hợp, nếu lịch chạy rơi vào ngày hệ thống không chạy batch, job sẽ tự động lùi sang ngày chạy batch tiếp theo).* + +### Ma trận Quyết định (Decision Matrix) trích xuất Bucket + +Khi Batch Job chạy theo lịch đã định, hệ thống áp dụng ma trận dưới đây để chọn đúng Bucket (thường dùng cho CEP) để lấy giá trị: + +| Bucket Cấu hình (Counter Bucket to Extract) | Điều kiện trích xuất thực tế | +|---|---| +| **Current Bucket** | Trích xuất Bucket có Ngày hết hạn (Expiry Date) sớm nhất lớn hơn Ngày xử lý hiện tại, VÀ trạng thái State = `C` (hoặc `NULL`). | +| **Previous Bucket** | Trích xuất Bucket có Ngày hết hạn muộn nhất nhỏ hơn Ngày xử lý hiện tại, VÀ trạng thái State = `C` (hoặc `NULL`). | +| **Period Before Last** | Trích xuất Bucket ngay trước Previous Bucket, VÀ trạng thái State = `C` (hoặc `NULL`). | + +### Cập nhật Trạng thái (State Update) sau trích xuất + +Để tránh trích xuất trùng lặp vào chu kỳ chạy kế tiếp, trạng thái của Bucket (`C`) phải được cập nhật: +- Nếu Counter cấu hình `Update on aware`: Đổi State từ `C` sang `A` (Awarded) nếu giao dịch ảo tạo ra từ CEP Hit được một Campaign Rule. +- Nếu Counter cấu hình `Update on extract`: Đổi State từ `C` sang `E` (Extracted) ngay sau khi trích xuất, bất kể có Hit Rule hay không. diff --git a/docs/knowledge-refs/campaign/criteria_operators.md b/docs/knowledge-refs/campaign/criteria_operators.md new file mode 100644 index 0000000..74d6b7e --- /dev/null +++ b/docs/knowledge-refs/campaign/criteria_operators.md @@ -0,0 +1,125 @@ +--- +ref_id: "campaign/criteria_operators" +parent_card: "campaign/campaign_rule" +title: "Chi tiết Criteria Operators (Rule Criteria Operators)" +domain: "campaign" +ref_type: "enum_detail" +tags: ["criteria", "operators", "query builder", "AND", "OR", "condition"] +--- + +# Chi tiết Criteria Operators (Rule Criteria Operators) + +## Thuộc về + +campaign/campaign_rule — Card tóm tắt Criteria Operators thành 1 dòng: "Operators: String (Is in, Contains...), Number (Between, Greater...), Date (Fixed, Period...)". Reference này liệt kê TOÀN BỘ operators cho mỗi data type để model nhỏ trả lời chính xác. + +## Chi tiết + +### Operators theo Data Type + +#### String / Lookup + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| Is in | Giá trị nằm trong danh sách | Customer Status Is in [Active, Inactive] | +| Is not in | Giá trị KHÔNG nằm trong danh sách | MCC Is not in [5411, 5412] | +| Contains | Chuỗi chứa text con | Customer Name Contains "Nguyễn" | +| Equal to | Bằng chính xác | Account Type Equal to "Visa Platinum" | +| Not equal to | Không bằng | Gender Not equal to "Male" | +| Starts with | Bắt đầu bằng | Card No Starts with "4123" | +| Ends with | Kết thúc bằng | Phone Ends with "999" | +| Is null | Giá trị rỗng/null | Email Is null | +| Is not null | Giá trị có dữ liệu | Email Is not null | + +#### Number + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| Equal | Bằng | Transaction Count Equal 10 | +| Not equal | Không bằng | Amount Not equal 0 | +| Less than | Nhỏ hơn | Age Less than 18 | +| Less than or equal | Nhỏ hơn hoặc bằng | Amount Less than or equal 500000 | +| Greater than | Lớn hơn | Nett Amount Greater than 100000 | +| Greater than or equal | Lớn hơn hoặc bằng | Counter Value >= 5000000 | +| Between | Trong khoảng | Amount Between 100000 AND 500000 | +| Is null | Giá trị rỗng | Income Is null | +| Is not null | Giá trị có dữ liệu | Income Is not null | + +#### Date + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| On or before | Vào ngày hoặc trước | Registration Date On or before 2024-01-01 | +| On or after | Vào ngày hoặc sau | DOB On or after 1990-01-01 | +| Fixed date | Đúng ngày cụ thể | Transaction Date Fixed date 2024-06-15 | +| Between date range | Trong khoảng ngày | Transaction Date Between 2024-01-01 AND 2024-12-31 | +| Between period from N | So sánh dynamic | Last Transaction Between period from 3 months ago | + +**Ghi chú Date**: Một số Date operators hỗ trợ so sánh Day/Month bỏ qua Year (VD: DOB ngày 15/03 bất kể năm nào) — dùng cho criteria sinh nhật. + +#### Day of Week + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| Is the day of week | Ngày trong tuần | Transaction Date Is the day of week [Monday, Friday] | + +Giá trị: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. + +#### Time + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| Is between | Trong khoảng thời gian | Transaction Time Is between 09:00 AND 17:00 | + +Format: HH:mm (00:00 – 23:59). + +#### Boolean + +| Operator | Mô tả | Ví dụ | +|---|---|---| +| Is | True hoặc False | Is Primary Card Is True | + +### Criteria Categories + +Criteria được nhóm theo 6 danh mục: + +| Category | Áp dụng cho | Ví dụ fields | +|---|---|---| +| Customer | Thông tin khách hàng | CIF, Customer Status, Gender, DOB, Income, Registration Date | +| Account | Thông tin tài khoản | Account Type, Account Status, Account Open Date | +| Transaction | Dữ liệu giao dịch | Nett Amount, Transaction Date, Transaction Time, Currency | +| Attribute | Custom attributes | Bất kỳ attribute nào đã cấu hình (VD: Membership Tier) | +| Counter | Giá trị Counter tích lũy | Counter Value, Counter Bucket (Current/Previous) | +| Merchant | Thông tin merchant | Corporation, Chain, Store, MCC (Merchant Category Code) | + +### Logic Grouping Rules + +| Rule | Mô tả | +|---|---| +| AND / OR | Criteria trong cùng 1 group kết hợp bằng AND hoặc OR | +| Multi-group | 1 Rule có thể có nhiều groups, nhưng logic GIỮA các groups phải nhất quán (tất cả AND hoặc tất cả OR) | +| NOT toggle | Mỗi condition có thể bật NOT để đảo ngược (VD: NOT MCC Is in [5411]) | + +## Ví dụ cụ thể + +**Criteria phức tạp — "Thưởng 2x cho VIP ăn uống cuối tuần":** + +``` +Group 1 (AND): + - Customer: Membership Tier Equal to "VIP" ← Attribute operator + - Transaction: Nett Amount Greater than 100000 ← Number operator + +Group 2 (AND): ← Inter-group: AND + - Merchant: MCC Is in [5411, 5412, 5441, 5499] ← String/Lookup operator + - Transaction: Day of week Is [Saturday, Sunday] ← Day of week operator + - Transaction: Time Is between 11:00 AND 22:00 ← Time operator +``` + +Kết quả: Chỉ kích hoạt Rule khi khách VIP chi tiêu > 100K tại merchant ăn uống vào cuối tuần giờ 11h-22h. + +**Criteria đơn giản — "Thưởng cho mọi giao dịch":** + +``` +Group 1 (AND): + - Transaction: Nett Amount Greater than 0 ← Chỉ cần amount > 0 +``` diff --git a/docs/knowledge-refs/campaign/expiry_policies.md b/docs/knowledge-refs/campaign/expiry_policies.md new file mode 100644 index 0000000..90394e4 --- /dev/null +++ b/docs/knowledge-refs/campaign/expiry_policies.md @@ -0,0 +1,40 @@ +--- +ref_id: "campaign/expiry_policies" +parent_card: "campaign/pool_definition" +title: "Chi tiết Chính sách Hết hạn (Expiry Policies)" +domain: "campaign" +ref_type: "enum_detail" +tags: ["pool", "expiry", "bucket", "policy"] +--- + +# Chi tiết Chính sách Hết hạn (Expiry Policies) + +## Thuộc về + +campaign/pool_definition — Card tóm tắt Expiry Policy là cách tính ngày hết hạn cho số dư nhưng THIẾU danh sách các chính sách cụ thể. Reference này bổ sung chi tiết các loại Expiry Policy áp dụng cho Pool để model hiểu rõ cách tính ngày. + +## Chi tiết + +### Danh sách Expiry Policy + +| Giá trị | Tên | Cách hoạt động | Tham số đi kèm | +|---|---|---|---| +| N_MONTHS_FROM_EARNING | N Months from month of earning | Điểm kiếm được trong tháng 1 sẽ hết hạn vào cuối tháng 1+N. | Pool Expiry Policy Parameter N | +| N_QUARTERS_FROM_EARNING | N Quarters from quarter of earning | Điểm kiếm được trong quý 1 sẽ hết hạn vào cuối quý 1+N. | Pool Expiry Policy Parameter N | +| SEMI_ANNUAL | Semi-annual, mid- and end-year | Điểm kiếm được nửa đầu năm hết hạn vào cuối tháng 6 năm sau; nửa cuối năm hết hạn vào cuối tháng 12 năm sau. | Không | +| N_YEARS_FROM_EARNING | N Years from year of earning | Điểm kiếm được trong năm 1 sẽ hết hạn vào cuối năm 1+N. | Pool Expiry Policy Parameter N | +| ANNIVERSARY | Anniversary of membership | Điểm sẽ hết hạn vào mỗi ngày kỷ niệm đăng ký thành viên của khách hàng. | Không | +| FIXED_DATE | Fixed Date | Điểm sẽ hết hạn vào đúng một ngày cụ thể được chỉ định. | Expiry Date | +| NO_EXPIRY | No Expiry | Điểm kiếm được sẽ không bao giờ hết hạn (mặc định ngày hết hạn là 31-Dec-2999). | Không | + +### Quy tắc chọn + +- **eVoucher Pool**: Mặc định KHÔNG CÓ Expiry Policy (trường này inactive cho Evoucher pool). +- **Fixed Date**: Nếu chọn chính sách này, bất kỳ Campaign Rule nào cập nhật (nạp điểm) vào Pool này không được phép có End Date muộn hơn Expiry Date đã chọn. + +## Ví dụ cụ thể + +- **N Months from month of earning**: Nếu `N = 3`, điểm thưởng nhận được trong tháng 1 sẽ hết hạn vào ngày cuối cùng của tháng 4. +- **N Quarters from quarter of earning**: Nếu `N = 2`, điểm thưởng nhận được trong khoảng 1/1 đến 31/3 (Quý 1) sẽ hết hạn sau ngày 30/9 (cuối Quý 3). +- **N Years from year of earning**: Nếu `N = 1`, điểm thưởng nhận được trong khoảng thời gian của năm 2015 sẽ hết hạn vào ngày 31/12/2016. +- **Anniversary**: Khách hàng tham gia (đăng ký) vào ngày 15/02/2010. Điểm kiếm được trước ngày 15/02/2011 sẽ hết hạn vào đúng ngày 15/02/2011. diff --git a/docs/knowledge-refs/campaign/formula_calculation.md b/docs/knowledge-refs/campaign/formula_calculation.md new file mode 100644 index 0000000..ba4d611 --- /dev/null +++ b/docs/knowledge-refs/campaign/formula_calculation.md @@ -0,0 +1,45 @@ +--- +ref_id: "campaign/formula_calculation" +parent_card: "campaign/campaign_rule" +title: "Chi tiết Tính toán Công thức (Formula Calculation)" +domain: "campaign" +ref_type: "enum_detail" +tags: ["formula", "calculation", "amount to use", "cap"] +--- + +# Chi tiết Tính toán Công thức (Formula Calculation) + +## Thuộc về + +campaign/campaign_rule — Card đề cập đến phần tính toán công thức (Formula Amount to Use, Formula result is rounded, Award limit) nhưng THIẾU chi tiết các công thức cụ thể (F1, F4, F6, F7, F8...). Reference này nhằm bổ sung các công thức thưởng (Award/Redeem). + +## Chi tiết + +[SOURCE_NEEDED] Thông tin chi tiết về các loại Formula (F1, F4, F6, F7, F8...) hiện đang nằm trong tài liệu đính kèm (attached file) của FSD gốc và không có sẵn trong spec text markdown hiện tại. Cần bổ sung tài liệu đính kèm để định nghĩa chi tiết từng công thức. + +### Nguồn lấy giá trị A (Amount to Use in Formula) + +Biến `A` trong công thức tính toán có thể được lấy từ: + +| Nguồn giá trị | Mô tả | +|---|---| +| **Numeric Attribute** | Lấy từ bất kỳ thuộc tính nào có kiểu dữ liệu là Số (Numeric Attribute). | +| **Active Counter** | Lấy giá trị từ bộ đếm (Counter) đang hoạt động (bao gồm current/previous/before last bucket). | +| **Code Management** | Các cấu hình mặc định (tra cứu từ bảng `Code_Management` với loại `amt-to-use-formula`). | + +### Rounding (Làm tròn kết quả công thức) + +| Option | Cách làm tròn | +|---|---| +| **Down** | Làm tròn xuống (ví dụ 1.9 -> 1). | +| **To Nearest** | Làm tròn tới số nguyên gần nhất (ví dụ 1.5 -> 2, 1.4 -> 1). | +| **Up** | Làm tròn lên (ví dụ 1.1 -> 2). | + +### Giới hạn thưởng (Award Limit) + +- **Cap A not more than**: Giới hạn biến số `A` trước khi đưa vào tính toán công thức (có thể giới hạn cứng hoặc giới hạn dựa trên 1 Counter - gọi là Cap-tracking Counter). +- **Give At Least / No More Than**: Giới hạn tổng số lượng trả thưởng (Result) sau khi tính xong. `At Least` (Tặng tối thiểu) chỉ áp dụng cho 1 Campaign Rule. `No More Than` (Tặng tối đa) có thể giới hạn trên mỗi Campaign Rule hoặc liên kết với một Counter tổng. + +## Ví dụ cụ thể + +[SOURCE_NEEDED] Cần cung cấp ví dụ về cách áp dụng F1, F6, F7, F8 khi có đủ thông tin chi tiết về các công thức này. diff --git a/docs/knowledge-refs/campaign/velocity_control_detail.md b/docs/knowledge-refs/campaign/velocity_control_detail.md new file mode 100644 index 0000000..f920970 --- /dev/null +++ b/docs/knowledge-refs/campaign/velocity_control_detail.md @@ -0,0 +1,51 @@ +--- +ref_id: "campaign/velocity_control_detail" +parent_card: "campaign/pool_definition" +title: "Chi tiết Thiết lập Giới hạn và Cảnh báo (Velocity Control)" +domain: "campaign" +ref_type: "edge_cases" +tags: ["velocity control", "limit", "alert", "pool"] +--- + +# Chi tiết Thiết lập Giới hạn và Cảnh báo (Velocity Control) + +## Thuộc về + +campaign/pool_definition — Card định nghĩa cấu trúc của Pool nhưng chưa đi sâu vào cơ chế chống gian lận và giới hạn. Reference này bổ sung chi tiết cấu hình Velocity Control để giới hạn số lượng giao dịch/điểm và kích hoạt cảnh báo tự động. + +## Chi tiết + +### Khái niệm Velocity Control + +Velocity Control là cơ chế kiểm soát tần suất và dung lượng giao dịch trên một Quỹ thưởng (Pool) nhằm ngăn chặn việc phát sinh điểm bất thường (do lỗi cấu hình rule hoặc gian lận). Nếu số lượng vượt quá ngưỡng (Maximum), hệ thống sẽ từ chối giao dịch hoặc gửi thông báo cảnh báo (Alert). + +### Cấu hình Giới hạn (Threshold Settings) + +Để thiết lập Velocity Control, người dùng cần cấu hình các tham số sau: + +| Tham số | Ý nghĩa | Lựa chọn / Giá trị | +|---|---|---| +| **Transaction Type** | Loại giao dịch nào sẽ bị kiểm soát. | Award (Cộng), Redeem (Đổi), Adjust (Điều chỉnh). | +| **Maximum** | Ngưỡng giới hạn (số lượng điểm/vật phẩm). | Số thập phân. | +| **Units** | Đơn vị tính toán cho Maximum. | `Per Pool units` (Tính theo tổng điểm Pool) hoặc `Per transaction` (Tính trên từng giao dịch đơn lẻ). | +| **Per Period** | Khoảng thời gian chu kỳ để reset bộ đếm giới hạn. | Quarter, Month, Week, Day. | +| **Per Entity 1 / 2** | (Tuỳ chọn) Giới hạn mức thực thể. | Entity 1: Customer, Account, Card.
Entity 2: Corporation, Chain, Store, Terminal. | + +### Cảnh báo (Alert Flow) + +Khi một giao dịch phát sinh khiến tổng số lượng trong chu kỳ (`Per Period`) vượt qua ngưỡng (`Maximum`), luồng cảnh báo sẽ được kích hoạt: + +1. **Chặn hoặc Cảnh báo**: Giao dịch gây vượt ngưỡng sẽ bị gắn cờ (Flagged). +2. **Alert Template**: Hệ thống lấy nội dung thông báo từ mẫu tin nhắn đã chọn trong cấu hình. +3. **Alert Group**: Hệ thống tự động gửi email/tin nhắn thông báo đến nhóm người nhận (Recipient Group) đã được thiết lập để có biện pháp can thiệp (ví dụ: Security Team hoặc Admin OLS). + +## Ví dụ cụ thể + +- **Tình huống**: Ngân hàng muốn ngăn chặn việc một Khách hàng lạm dụng lỗ hổng để tích lũy quá nhiều điểm thưởng vào ví "Điểm Thường Niên" trong 1 ngày. +- **Cấu hình**: + - Transaction Type = `Award` + - Maximum = `100,000` + - Units = `Per Pool units` + - Per Period = `Day` + - Per Entity 1 = `Customer` +- **Kết quả**: Bất kỳ khách hàng nào nhận được số điểm (Award) vượt mức 100,000 điểm trong một ngày sẽ kích hoạt Alert. Hệ thống gửi email cảnh báo ngay lập tức cho nhóm Admin OLS để kiểm tra log giao dịch của khách hàng đó. diff --git a/docs/knowledge-refs/catalogue/fulfillment_lifecycle.md b/docs/knowledge-refs/catalogue/fulfillment_lifecycle.md new file mode 100644 index 0000000..ebd24ef --- /dev/null +++ b/docs/knowledge-refs/catalogue/fulfillment_lifecycle.md @@ -0,0 +1,49 @@ +--- +ref_id: "catalogue/fulfillment_lifecycle" +parent_card: "catalogue/voucher_code" +title: "Chi tiết Vòng đời Fulfillment của Voucher (Fulfillment Lifecycle)" +domain: "catalogue" +ref_type: "process_detail" +tags: ["voucher", "fulfillment", "status", "lifecycle"] +--- + +# Chi tiết Vòng đời Fulfillment của Voucher (Fulfillment Lifecycle) + +## Thuộc về + +catalogue/voucher_code — Card tóm tắt 5 trạng thái vòng đời nhưng chưa giải thích rõ event nào trigger việc chuyển đổi trạng thái và hệ thống xử lý thế nào. Reference này bổ sung chi tiết luồng chuyển trạng thái Fulfillment Status của từng Voucher No. + +## Chi tiết + +### Các trạng thái Fulfillment Status + +Mỗi Voucher Detail (Voucher No) đều có một trạng thái theo dõi suốt vòng đời, được hệ thống cập nhật dựa trên các sự kiện (events): + +| Trạng thái (Status) | Giải thích | Trigger Event (Sự kiện kích hoạt) | +|---|---|---| +| **New** | Mã chưa được sử dụng, đang nằm trong kho. | Khi Voucher được khởi tạo tự động hoặc upload từ file vào OLS. | +| **Issued** | Mã đã được cấp phát cho khách hàng. | Khi khách hàng thao tác đổi điểm lấy mã này thành công trên hệ thống OLS. | +| **Fulfilled** | Khách hàng đã dùng mã thành công tại đối tác. | Khi đối tác gửi xác nhận (qua API hoặc file batch) rằng mã đã được chấp nhận và thanh toán. | +| **Cancelled** | Mã bị hủy sau khi đã Issued. | Khi khách hàng chủ động hủy giao dịch đổi điểm, hoặc hệ thống phát sinh lỗi cần rollback giao dịch. | +| **Rejected** | Đối tác từ chối sử dụng mã này. | Khi đối tác trả về lỗi (Mã vi phạm T&C, đã đổi ở nơi khác, v.v.). | + +### Luồng chuyển trạng thái (State Transition Flow) + +1. **Upload/Generate**: `(Chưa có) -> New` +2. **Redeem (Đổi điểm)**: `New -> Issued` +3. **Usage (Sử dụng)**: + - Hợp lệ: `Issued -> Fulfilled` + - Bị từ chối: `Issued -> Rejected` +4. **Cancel (Hủy đổi)**: `Issued -> Cancelled` + +### Xử lý Ngoại lệ (Error Handling) + +| Ngoại lệ | Hành động của hệ thống | +|---|---| +| Hủy mã (Cancelled) | Tuỳ thuộc cấu hình hệ thống, mã bị Cancelled có thể được tái tạo lại (trở về New) để cấp cho người khác, hoặc bị khóa vĩnh viễn và hoàn điểm lại cho khách hàng. | +| Từ chối (Rejected) | Ghi log giao dịch lỗi, nhân viên vận hành sẽ phải đối soát lại với Vendor. | + +## Ví dụ cụ thể + +- **Luồng thành công**: Khách hàng đổi điểm lấy mã Grab. OLS lấy 1 mã từ kho đang ở trạng thái `New` và gán cho khách, đổi thành `Issued`. Khách nhập mã vào app Grab đi xe thành công. Grab gọi API thông báo về OLS, OLS đổi trạng thái mã thành `Fulfilled`. +- **Luồng thất bại do Hủy**: Khách đổi mã CGV (`Issued`) nhưng ứng dụng gặp lỗi mạng (timeout) không hiển thị được vé. Hệ thống tự động rollback giao dịch hoàn điểm, voucher chuyển thành `Cancelled`. diff --git a/docs/knowledge-refs/catalogue/redemption_pricing_detail.md b/docs/knowledge-refs/catalogue/redemption_pricing_detail.md new file mode 100644 index 0000000..596b530 --- /dev/null +++ b/docs/knowledge-refs/catalogue/redemption_pricing_detail.md @@ -0,0 +1,44 @@ +--- +ref_id: "catalogue/redemption_pricing_detail" +parent_card: "catalogue/item_price" +title: "Chi tiết Tính toán Partial Redemption (Partial Redemption Calculation)" +domain: "catalogue" +ref_type: "edge_cases" +tags: ["partial redemption", "cash per point", "pricing"] +--- + +# Chi tiết Tính toán Partial Redemption (Partial Redemption Calculation) + +## Thuộc về + +catalogue/item_price — Card có đề cập cơ bản về đổi một phần (Partial Redemption) nhưng thiếu công thức toán học chính xác và các ngoại lệ. Reference này bổ sung chi tiết công thức tính số tiền mặt cần bù và các validation rule khi cấu hình. + +## Chi tiết + +### Công thức tính tiền bù (Cash Calculation) + +Khi chức năng `Partial Redemption Allowed = ON`, hệ thống cho phép khách hàng đổi quà bằng cách kết hợp Điểm và Tiền mặt. Số tiền mặt phải bù được tính theo công thức: + +`Số tiền mặt = (Price_in_point - Số_điểm_khách_hàng_dùng) * Cash_per_point + Applicable_Taxes` + +| Tham số | Ý nghĩa | Ràng buộc | +|---|---|---| +| **Price_in_point** | Giá trị món quà quy ra điểm (Full redemption price) | Phải > 0 | +| **Số_điểm_khách_hàng_dùng** | Số điểm mà khách hàng chọn để đổi (thường khách sẽ dùng tối đa điểm mình đang có) | Phải `>= Minimum Partial Redeem Points` VÀ `<= Price_in_point` | +| **Cash_per_point** | Số tiền phạt/bù cho mỗi 1 điểm còn thiếu | Phải > 0 | +| **Applicable Taxes** | Tiền thuế tương ứng với phần tiền mặt giao dịch | Dựa theo cấu hình Tax Rate Maintenance | + +### Các Rules đặc biệt + +| Rule / Ngoại lệ | Giải thích | +|---|---| +| **Đổi 100% bằng tiền mặt** | Chỉ được phép nếu `Minimum Partial Redeem Points = 0`. Khi đó khách hàng có thể dùng `Số_điểm_dùng = 0`. | +| **Full Redemption ưu tiên** | Nếu khách hàng có đủ điểm (Số dư >= `Price_in_point`), khách hàng vẫn có quyền chọn Partial Redemption để giữ lại điểm (miễn là phần điểm dùng lớn hơn mức Minimum). | + +## Ví dụ cụ thể + +- **Tình huống**: Quà tặng "Tai nghe Bluetooth" có giá Full (`Price_in_point`) là 10,000 điểm. Cấu hình Partial cho phép tối thiểu `Minimum = 2,000` điểm, `Cash_per_point = 50 VND/điểm`. +- **Trường hợp hợp lệ**: Khách hàng A có 3,000 điểm. Khách hàng dùng toàn bộ 3,000 điểm (thoả mãn `>= 2,000`). + Số điểm thiếu: 10,000 - 3,000 = 7,000 điểm. + Số tiền mặt cần thanh toán: 7,000 * 50 = 350,000 VND (Cộng thêm thuế nếu có). +- **Trường hợp bị Reject**: Khách hàng B chỉ có 1,500 điểm. Hệ thống chặn giao dịch vì 1,500 < 2,000 (Minimum limit). Khách hàng B không thể đổi quà dù có sẵn tiền mặt. diff --git a/docs/knowledge-refs/customer/adjustment_deduction_logic.md b/docs/knowledge-refs/customer/adjustment_deduction_logic.md new file mode 100644 index 0000000..b845b37 --- /dev/null +++ b/docs/knowledge-refs/customer/adjustment_deduction_logic.md @@ -0,0 +1,53 @@ +--- +ref_id: "customer/adjustment_deduction_logic" +parent_card: "customer/operations_adjustment" +title: "Chi tiết Logic Bù Trừ và Trừ Điểm (Adjustment Deduction Logic)" +domain: "customer" +ref_type: "edge_cases" +tags: ["adjustment", "offset", "deduction", "negative balance", "fifo"] +--- + +# Chi tiết Logic Bù Trừ và Trừ Điểm (Adjustment Deduction Logic) + +## Thuộc về + +customer/operations_adjustment — Card mô tả quy tắc bù trừ (offset) và trừ điểm (deduction) chung chung. Reference này làm rõ chi tiết thứ tự trừ điểm giữa các bucket, cách xử lý negative balance để đảm bảo model hiểu cách tính toán điểm chính xác khi có điều chỉnh. + +## Chi tiết + +### Logic Bù trừ (Offset) khi Cộng Điểm (Positive Adjustment) + +Khi một giao dịch Positive Adjustment được duyệt, hệ thống phân bổ số điểm được cộng theo thứ tự ưu tiên sau: + +| Trình tự | Điều kiện kiểm tra | Hành động | +|---|---|---| +| 1 | Tìm các Bucket đang có số dư âm (Negative Balance) | Điểm cộng thêm được ưu tiên dùng để bù đắp (offset) cho bucket đang âm về 0. | +| 2 | Nếu có nhiều Bucket âm | Ưu tiên bù trừ cho Bucket có Expiry Date sớm nhất. | +| 3 | Điểm cộng vẫn còn dư (sau khi offset hết các bucket âm) | Số điểm dư sẽ được tạo thành một Bucket mới với Expiry Date được cấu hình trong giao dịch điều chỉnh. | + +### Logic Trừ Điểm (Deduction) khi Điều chỉnh Âm (Negative Adjustment) + +Người dùng có hai lựa chọn khi thực hiện Negative Adjustment: + +| Tùy chọn | Cơ chế xử lý | +|---|---| +| **Chỉ định đích danh Bucket** | Nếu người dùng chọn cụ thể 1 Bucket để trừ điểm (dựa trên Bucket Expiry Date), hệ thống sẽ CHỈ trừ điểm trên Bucket đó. Nếu số lượng trừ lớn hơn số dư của Bucket, Bucket đó sẽ bị âm (nếu Pool cho phép âm). | +| **Không chỉ định Bucket (Mặc định)** | Hệ thống tự động trừ điểm theo phương pháp **FIFO (First-In, First-Out) dựa trên Expiry Date**. Điểm sẽ được trừ dần từ Bucket có ngày hết hạn sớm nhất đến ngày hết hạn muộn nhất cho đến khi đủ số lượng. | + +### Validation Rules + +| Rule | Khi nào check | Reject nếu | +|---|---|---| +| Cho phép âm (Allow Negative Balance) | Khi thực hiện Negative Adjustment mà số lượng trừ lớn hơn tổng số dư khả dụng | Pool Definition được cấu hình `Allow Negative Balance = OFF` | + +## Ví dụ cụ thể + +1. **Ví dụ Bù trừ (Offset)**: + - Tình trạng: Khách hàng đang có 1 Bucket âm `-50` điểm (hết hạn 31/12/2024). + - Hành động: Nhân viên thực hiện Positive Adjustment `+100` điểm (hết hạn 31/12/2025). + - Kết quả: Hệ thống lấy 50 điểm bù cho Bucket cũ (về 0). 50 điểm còn lại vào Bucket mới (Balance 50, hết hạn 31/12/2025). + +2. **Ví dụ Trừ điểm theo FIFO**: + - Tình trạng: Khách hàng có Bucket A (50 điểm, hết hạn T6/2024) và Bucket B (100 điểm, hết hạn T12/2024). + - Hành động: Nhân viên thực hiện Negative Adjustment `-70` điểm không chỉ định Bucket. + - Kết quả: Hệ thống trừ 50 điểm ở Bucket A (về 0) và tiếp tục trừ 20 điểm ở Bucket B (còn 80). diff --git a/docs/knowledge-refs/marketing/omr_execution_flow.md b/docs/knowledge-refs/marketing/omr_execution_flow.md new file mode 100644 index 0000000..5dcb48e --- /dev/null +++ b/docs/knowledge-refs/marketing/omr_execution_flow.md @@ -0,0 +1,48 @@ +--- +ref_id: "marketing/omr_execution_flow" +parent_card: "marketing/marketing_campaign" +title: "Chi tiết Luồng thực thi OMR (OMR Execution Flow)" +domain: "marketing" +ref_type: "process_detail" +tags: ["OMR", "batch", "schedule", "execution", "targeting"] +--- + +# Chi tiết Luồng thực thi OMR (OMR Execution Flow) + +## Thuộc về + +marketing/marketing_campaign — Card mô tả tổng quan về OneMarketing Request (OMR). Reference này đi sâu vào quy trình xử lý nội bộ của OMR Batch Job khi nó được chạy, từ lúc lập lịch đến lúc xuất ra kết quả (Tin nhắn hoặc Trigger Giao dịch). + +## Chi tiết + +### Cấu hình Lịch trình (Run Schedule) + +Nếu OMR được thiết lập chạy theo lịch (`Schedule`), người dùng có thể cấu hình các tần suất sau: +- **One time**: Chạy một lần duy nhất vào một Ngày và Giờ cố định. +- **Daily**: Chạy lặp lại mỗi N ngày (VD: 3 ngày 1 lần) vào Giờ cố định. +- **Weekly**: Chạy mỗi N tuần vào các Ngày cụ thể trong tuần (Ví dụ: Thứ 2 và Thứ 5 hàng tuần). +- **Monthly**: Chạy mỗi N tháng. Hỗ trợ 2 tùy chọn: + - Option 1: Chạy vào các ngày cố định trong tháng (Ví dụ: Ngày 15 và 30). Hỗ trợ tùy chọn tự động lùi về "Ngày cuối cùng của tháng" nếu tháng đó không đủ ngày (VD: tháng 2). + - Option 2: Chạy vào tuần thứ tự (Ví dụ: Thứ Hai của tuần đầu tiên trong tháng). +- **Annually**: Chạy mỗi N năm vào một Ngày và Tháng cố định. + +### Luồng thực thi của OMR Batch Job + +Batch Job của OMR (thường chạy song song với hệ thống Loyalty) hoạt động theo trình tự sau: + +1. **Quét OMR hiệu lực (Scan Effective Requests)**: + - Batch Job so sánh Ngày xử lý hệ thống (Processing Date) với khoảng thời gian `Effective Date From/To` của tất cả OMR. + - Từ danh sách OMR đang có hiệu lực, Job đối chiếu với `Run Schedule` để xác định chính xác OMR nào có lịch chạy trùng với ngày/giờ hiện tại. + +2. **Xác định Khách hàng mục tiêu (Targeting)**: + - Đối với các OMR được chọn, hệ thống đọc điều kiện `Targeting Method`. + - Nếu là **OMR Criteria**: Quét toàn bộ CSDL khách hàng (hoặc dựa trên bảng Transaction Log) để xuất ra danh sách (Audience) thoả mãn điều kiện (AND/OR/NOT). + - Nếu là **Upload file**: Sử dụng trực tiếp danh sách CIF/Account ID từ file đã tải lên. + +3. **Thực thi Hành động (Action Execution)**: + - **Với Notification**: Duyệt qua danh sách Audience, kiểm tra quy tắc `Frequency Capping`. Nếu khách hàng chưa vượt quá số lượng tin nhắn cho phép, tiến hành gửi `Message template` đến khách hàng qua các kênh tích hợp. + - **Với Trigger Campaign Rule**: Duyệt qua danh sách Audience, hệ thống tự động sinh ra một Batch Giao dịch ảo mang mã `OLS Transaction Code` đã cấu hình và đẩy vào hệ thống Campaign Engine để kích toán thưởng. + +### Tương tác với Transaction Log + +Đặc biệt, OMR Batch Job có thể được cấu hình để trích xuất (extract) giao dịch trực tiếp từ bảng Transaction Log. Thay vì quét toàn bộ hồ sơ khách hàng, OMR lấy các giao dịch (batch events) để tìm ra tập khách hàng mục tiêu một cách tối ưu nhất. diff --git a/docs/specs/00_MIGRATION_REPORT.md b/docs/specs/00_MIGRATION_REPORT.md deleted file mode 100644 index d891428..0000000 --- a/docs/specs/00_MIGRATION_REPORT.md +++ /dev/null @@ -1,27 +0,0 @@ -# Migration Report - -## Summary -The migration of the monolithic FSD (Functional Specification Document) Markdown files to the OpenSpec standard is complete. The goal was to decompose massive, human-oriented Word-converted markdown files into Agent-Friendly, atomic, and structured OpenSpec documents. - -## Completed Tasks -1. **Decomposition:** All major monolithic files have been decomposed into domain-specific subdirectories. -2. **Archiving:** The original monolithic markdown files have been moved to `docs/specs/archive/`. -3. **Format Standardization:** The newly created documents follow the OpenSpec format, including proper YAML frontmatter (`title`, `type`, `status`, `domain`). -4. **Cleanup:** Unnecessary UI clutter, malformed artifacts (e.g. `[Image Removed]`), and verbose narrative instructions were removed or converted into structured business rules and data schemas. - -## Output Structure -The new documentation is organized into the following domains under `docs/specs/`: -* `customer_management/`: Profiles, Accounts, Cards, Pool Balances, Transactions, Adjustments, etc. -* `reward_campaign/`: Campaign Structures, Rules, Criteria, Formulas, Counter Definitions, Transaction Categories, etc. -* `onetargeting/`: Segmentation, Audiences. -* `onecatalogue/`: Catalogues, Categories, Master Items, Vouchers. -* `onemarketing/`: Messages, Campaigns, A/B Testing, Whitelists, Blacklists. -* `oneaccess/`: Users, Permissions, Profiles. -* `oneadmin/`: Framework behavior. -* `system_management/`: Application parameters. -* `introduction/`: Terminology. -* `reference/`: References, Change History. - -## Next Steps -- Implement Agent tooling capable of reading these OpenSpec files to generate test cases or boilerplate code. -- Ensure any future updates to the requirements are made directly to the atomic OpenSpec files, not the archived monolithic documents. diff --git a/docs/specs/00_MIGRATION_TRACKER.md b/docs/specs/00_MIGRATION_TRACKER.md deleted file mode 100644 index 2a277d1..0000000 --- a/docs/specs/00_MIGRATION_TRACKER.md +++ /dev/null @@ -1,34 +0,0 @@ -# Migration Tracker: FSD to OpenSpec - -## Objective -Convert `docs/FSD P1_Finnal Version.docx` to a structured, modular Knowledge Base based on the OpenSpec format. - -## Stages -- [x] **Step 1:** Convert `.docx` to HTML using Python (`mammoth`), then to Markdown (`markdownify`) to preserve tables and structure. (Script: `convert_fsd.py`) -- [x] **Step 2:** Generate the Master Markdown file (`docs/FSD_Master_Clean.md`). -- [x] **Step 3:** Analyze the Master Markdown file to extract domains (e.g., Campaign, Customer, OneAccess). -- [x] **Step 4:** Split the content into modular OpenSpec Markdown files under `docs/specs/`, clean up heavy image tags, and apply standard headings. -- [x] **Step 5:** Finalize migration and generate report (`docs/specs/00_MIGRATION_REPORT.md`), remove temporary files. - -## Extracted Domains -1. `overview.md` (Overview) -2. `scope_and_assumption.md` (Scope & Assumption) -3. `one_access.md` (OneAccess) -4. `one_loyalty.md` (OneLoyalty / Campaign) -5. `customer_management.md` (Customer Management) -6. `one_marketing.md` (OneMarketing) -7. `one_catalogue.md` (OneCatalogue) -8. `one_targeting.md` (OneTargeting) - -## Decomposed and Verified -- [x] `onetargeting.md` -> `onetargeting/segmentation.md`, `onetargeting/audience_upload.md`, `onetargeting/customer_audience.md` -- [x] `application_parameter.md` -> `system_management/application_parameter.md` -- [x] `introduction.md` -> `introduction/terminology.md` -- [x] `reference.md` -> `reference/change_history.md`, `reference/document_references.md` -- [x] `oneaccess.md` -> `oneaccess/user_group.md`, `oneaccess/permission_management.md`, `oneaccess/user_profile.md` -- [x] `oneadmin.md` -> `oneadmin/framework_behavior.md` -- [x] `onecatalogue.md` -> `onecatalogue/catalogue.md`, `onecatalogue/category.md`, `onecatalogue/item_master.md`, `onecatalogue/item_price.md`, `onecatalogue/voucher_code.md` -- [x] `onemarketing.md` -> `onemarketing/marketing_message.md`, `onemarketing/marketing_campaign.md`, `onemarketing/frequency_capping.md`, `onemarketing/ab_testing.md`, `onemarketing/blacklist.md`, `onemarketing/whitelist.md` -- [x] `customer_management.md` -> `customer_management/customer_profile.md`, `customer_management/customer_360.md`, `customer_management/account.md`, `customer_management/card.md`, `customer_management/pool_balance_detail.md`, `customer_management/transaction_history.md`, `customer_management/no_hit_cp_transaction.md`, `customer_management/statement.md`, `customer_management/attribute.md`, `customer_management/counter.md`, `customer_management/adjustment.md`, `customer_management/transfer_balance.md`, `customer_management/re_instatement.md`, `customer_management/item_redemption.md`, `customer_management/award_transaction.md` -- [x] `reward_campaign_management.md` -> `reward_campaign/campaign_structure.md`, `reward_campaign/external_transaction_code.md`, `reward_campaign/ols_transaction_code.md`, `reward_campaign/pool_definition.md`, `reward_campaign/counter_definition.md`, `reward_campaign/transaction_category.md`, `reward_campaign/account_type_group.md`, `reward_campaign/reward_campaign.md`, `reward_campaign/reward_campaign_rule.md`, `reward_campaign/campaign_rule_criteria.md`, `reward_campaign/campaign_rule_formula.md`, `reward_campaign/campaign_rule_contributor.md`, `reward_campaign/cep_rule.md`, `reward_campaign/rep_rule.md`, `reward_campaign/item_redemption_rule.md`, `reward_campaign/campaign_insight.md` -1 \ No newline at end of file diff --git a/docs/specs/archive/introduction.md b/docs/specs/archive/introduction.md deleted file mode 100644 index 3075991..0000000 --- a/docs/specs/archive/introduction.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "Introduction" -type: OpenSpec -status: Draft ---- -# Introduction - -## Scope of Document - -## Terminology - -1. The following sets out the definition of terms which are used in this document: - -| | **Term** | **Definition** | -| --- | --- | --- | -| | Amount vs Quantity | * In OLS, “Amount” is used in connection with monetary amounts – i.e. when the unit of measure is an actual currency such as Dollars, Pesos, and Indonesian Rupiah etc. For example, “Transaction Amount” is the most frequently encountered “amount” entity. * Quantity is used to refer to the number of units of an entity, but not to monetary value. For example, the number of points awarded is typically referred to as the “Award Quantity”, and the number of points redeemed is the “Redeem Quantity”, whereas the value of the award is the “Award Amount” and the value of the redemption is the “Redeem Amount” | -| | Pool Blance Bucket (Bucket) | * It is used in the context of a Reward Pool Bucket, per bucket: based on pool entity level and expiring date to determine a pool balance bucket. | -| | Bucket Expiry Date | * If used in the context of a Counter, see Counter. * If used in the context of a Reward Pool Bucket, see Pool. | -| | Campaign Rule (Rule) | * A Rule is a business rule defining the conditions under which a reward will be given, including the type and quantity of reward. * The Rule includes a set of “**Rule Criteria**” that defines the conditions to be met in order that the quantity of rewards to be calculated with the formula and parameters that are defined in the “**Rule Formula**” is to be given to the customer. | -| | CEP | * “Counter Extract & Process” is a module for setting up job requests to extract a specified counter based on criteria set up in the request, and using the counter value as transaction amount, to form a transaction to process against Campaign Rules linked to the transaction through a Transaction Code and other Rule Criteria. * The module includes the corresponding batch processes to execute the requests. | -| | Contributor | * Identifies an entity which funds the rewards given under a given Rule. * One or more Contributors can be set up for rewards of each Rule. * If there is more than one Contributor for a Rule, the “**Rule Contributor Settings**” function is used to define the percentage of reward to be billed to each Contributor. The total contribution percentage must be 100%. * If the business entity with which the customer is transacting is the only Contributor for the rewards, then no setting has to be done in the “**Rule Contributor Settings**”, as BLP will consider the transacting entity as the default Contributor. * The Contributor setting is used in the end-of-day Contributor settlement report to calculate the amount due from each Contributor, for each reward transaction. | -| | Counter | * Counters are used to track customer’s transaction statistics. * Counters can be defined on demand to track a spend frequency or spend total for a given set of criteria. * For example, a Counter can be configured to track the number of transactions done by each customer in a specific Merchant Category Code or MCC. * If the count to be tracked is periodic – e.g. monthly – then the Counter can be configured to track the count for each period in a separate “**Counter Bucket**”, where each Counter Bucket has a “**Counter Bucket Date**” equal to the end date of the month. * What is tracked depends on which “**Counter Method**” is selected. * Counters are identified by “Counter Ids”. | -| | Effective Period | * Many parameters have a Start Date and End Date range during which the parameter is effective. * The general rule is that the Start Date starts on and after 00:00:00 hours and the End Date ends at 23:59:59. * Note that in BLP, time is considered a discrete quantity in seconds. * This definition applies for all cases where we have the “Start Date” and “End Date” parameters – e.g. campaign rules, currency rates, item price schedules, etc, where the corresponding start and end times are not specified. | -| | Expiry Policy | * See more on the Pool Definition section | -| | Formula | * This part of the Rule defines the calculation formula or formulae to be used for calculating the quantity (number of units in the Reward Pool – e.g. number of points, number of coupons) of reward to be given for a given transaction if the conditions set in the Rule Criteria are fulfilled. * The Formula comprises 2 parts: the Formula Header and the Formula Detail. * “**Formula Header**” defines a set of parameters to be adopted by all formulas selected in the Formula Detail – e.g. the maximum amount of reward to be given, the rounding rule (round down, round up, etc), the quantity to use for calculation (whether the Gross Amount or Nett Amount). * “**Formula Detail**” defines the details of the formula to be used in the calculations. Each Formula Detail can have one or more Formula. * **Execution Sequence**. A Rule has one or more Formula Details. Each Formula Detail is assigned an Execution Sequence number that determines the order in which the Formula is executed during transaction processing. The higher the numbers are executed first. | -| | Gross Amount | * See Transaction Amount. | -| | Pool | * Each type of reward – e.g. points or coupons, is tracked in a “**Pool**” or “**Reward Pool”**. * Each Reward Pool is associated with a “**Pool Expiry Policy**”, also referred to as “**Expiry Policy**”. * The Pool Expiry Policy selected for the Pool determines how the reward earned in that Pool is expired. * An example of a Pool Expiry Policy is “Expire 2 calendar quarters after earning”. * This would cause all the rewards earned in a given calendar quarter to be put in a Pool Bucket with an Bucket Expiry Date set to the end date 2 calendar quarters from the quarter in which the rewards were earned. * Rewards that expire on a given date are tracked in a separate “**Pool Bucket**”. * Example, if **Expiry Policy** for a Reward Pool is “Expire rewards 6 months from month of earning”, then all the points earned in each month will be stored in a separate bucket, each “Pool Bucket” having its own **Bucket Expiry Date**. * To meet the requirements of UNIRMs, new policy based on Card Types will be provided. For details of this, see “Expiry Policy” definition. | -| | REP | * “Redeem, Extract and Process” is a module for setting up a request to redeem a specified Pool, subject to criteria set up as part of the request, and to then output the redemption transaction details according to the selection set up in the request. | -| | Rule Criteria | * See Campaign Rule Criteria | -| | Rule Pool | * The Rule Pool is a Reward Pool which is updated with the results of the Rule Formula or Formulae. * Each Rule is associated with one Rule Pool. | -| | Transaction Amount | * Each transaction record in OLS for award processing has a mandatory column identified as the Transaction Amount. The Transaction Amount is used as the principal quantity for reward calculation in the Formula. * If the transaction is a payment transaction: + The Transaction Amount is the payment amount + If the transaction request includes a request to offset the payment amount by redeeming any available rewards, the amount remaining after deducting the available rewards value from the payment amount is referred to as the “**Nett Amount**”. + The payment amount before the deduction is the “**Gross Amount**”. * The Transaction Amount is always logged in OLS as the “Gross Amount”. | -| | OLS Transaction Code (TC) | * Each transaction record received in OLS for award processing has a column identified as the Transaction Code or TC. * The TC is used as the key to locate applicable Rules. * If no Rule is linked to TC, no reward calculation is done for that transaction. * TC is user-defined but it must be set up in the Transaction Code look-up table. | - -## Structure of Document - -The rest of this document is made up of the following sections: - -1. Introduction -2. OneAcess -3. Customer Management -4. Campaign Management -5. OneCatalouge -6. OneMarketing -7. OneTargeting - diff --git a/docs/specs/archive/oneaccess.md b/docs/specs/archive/oneaccess.md deleted file mode 100644 index ae057cb..0000000 --- a/docs/specs/archive/oneaccess.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -title: "OneAccess" -type: OpenSpec -status: Draft ---- -# OneAccess - -## Overview - -1. OneAccess™ is the module for managing user access rights to OLS administration functions. -2. The Access control Management functions are comprised of: - -* User Group definition -* User Profile set-up (defining user IDs for logging into the system). -* Permission Management setup 2 permission type: Particular user/ User Group. - -1. Report permission - -* To identify reports each Permission Group is allowed to access. - -1. View filter Management - -Every screen can be configured with a filter based on the value of fields in the screen (View Filter). The View Filter restricts which fields in which screens are displayed to users in a User Group. The View Filter can also be used to block the entire view from the users in a User Group. - -**In phase 1, we are focusing on item #1 first and allow automation to approve when user/edit record.** - -## User Group - -### Business Requirement - -1. The User Group module is utilized to categorize users who share identical permissions within OLS. -2. Use this screen to define the group to be assigned to a particular user or group of users. When adding a new user to the system, select this group for that user. - -### Process Flow - -=TBD= - -### Trigger - -1. A new user group needs to be defined. -2. An existing user group needs to be modified or the user needs to review the existing group to make any decision. - -### Post –Condition - -1. Users have to have the access right on this screen to access this screen. -2. Depending on the user’s access rights, they can view/add/edit user group records. - -### Wireframe - -Please refer to the wireframe on the Figma. - -### Business Rules - -* + - * 1. The user group ID must be a unique value. - 2. If the required user group has not been defined, click on the User group icon in the Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_18) - 3. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for User Group is illustrated in section [Wireframe](#_Wireframe_18). - 4. Screen description: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Genneral information** | | | | -| | User Group ID\*/ Id nhóm người dùng | The identify of user group | ~~X(20)~~ X(10) | -| | User group Name\*/ Tên nhóm người dung | The name of the user group For reference only | X(100) | -| | Description /Mô tả | Description for user group | X(200) | -| **Group users: List all active User Profile record are assigned to this group.** **This part is display when user click to view any active record only** | | | | -| | User ID\* / ID người dùng | The identify of the user who be long to the chosen group | Display | -| | User name\*/Tên người dung | The name of the user | Display | -| | Email \*/Địa chỉ email | Email | Display | - -### Post –Condition - -* 1. The data is updated in the DB and relation screen (if needed). - -### Exception Flow - -1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Permission Management - -### Business requirement - -1. The Permission Management module is used to maintain Access Rights Groups – i.e. to define: - 1. Which modules and functions can be accessed by users in a group, and - 2. Which of the applicable actions can be performed by the users in each of the functions within each of the modules in the group: - -| | | | -| --- | --- | --- | -| * + 1. Add | * + 1. Change | * + 1. View | -| * + 1. Delete | * + 1. Approve (or Reject) | * + 1. Copy | -| * + 1. View History | h. Save as Template | | - -### Process Flow - -TBD - -### Trigger - -* + 1. New user group to be defined then need to add permission to this group. - -### Post-Conditions - -1. Users have to have the access right on this screen in order to access this screen. -2. Depending on the user’s access rights, they can view/add/edit Permission Management records. - -### Wireframe - -Please refer to the wireframe on the Figma. - -### Business Rules - -* + - * 1. If permission required has not been defined, click on the Permission Management icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_19) - 2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Permission Management is illustrated in the section [Wireframe](#_Wireframe_19). - 3. Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Step 1\*: General information/Thông tin Chung** | | | | -| | Role \*/Quyền | The unique identifier of the permission group. | ~~X(20)~~ X(10) | -| | Role Name\*/Tên nhóm quyền | Text describing the Permission Group Name, for user reference | X(100) | -| | Permission Type \*/Loại quyền | Drop down to select the following permission type: *Particular User* *User Group* | Drop-down Select one | -| | User/Người dùng | Condition field Drop-down list to select one or more users who can be accessed on all functions of this role. This field is only active and required when "Particular User" is selected in the previous step. | Drop-down Multiple select | -| | User group/ Nhóm người dung | Condition field Drop-down list to select only one group and all users under this group can be accessed on all functions of this role. This field is only active and required when this role is applicable to the user group type. | Drop-down Select one | -| | Description/ Mô tả | Text describing the Role, for user reference | X(200) | -| **Step 2**\*: **Permission Management** /Quản lí quyền | | | | -| | **Select Modules** A hierarchy of modules contains the list of functions available. Top-level module: The modules group Second level module: The specific module for each group. Allow the user to search the modules by entering the module name | | | -| | Select All/Chọn tất cả | Check/Uncheck to drag/drop all modules in the system into the permission part to configure the specific permission of the role. | Check box | -| | “Module Name” | Check/Uncheck to drag/drop this module permission part to configure the specific permission of the role. Checked/Unchecked on top level then all second level modules will be applicable as well. | Check box | -| | Search /Tìm kiếm | Users input their search keyword(s) into a designated search bar to find the module they're looking for. | Search feature | -| | **Permission /Quyền** **A list contains all selected modules in the previous step and the permission list applicable for each module.** **Note that: N/A =**Not Applicable will be defined in the master data and the user can’t check/uncheck to allow/disallow the permission if this permission is not applicable. **The system allows the user to quickly add/delete one permission to all modules per each module group.** **Besides the system allows** to allow/disallow all available permissions for all modules that appeared in the “Permission” part | | | -| | Selected all/Chọn tất cả | Check/Uncheck to allow/disallow all available permissions for all modules that appeared in the “Permission” part. | Check box | -| | “Top-level module name” E.g: Customer Management | The name of the top-level selected module. Check/uncheck to allow/disallow all available permission for all second-level modules belonging to this module | Check box | -| | “Second level Module name” E.g: Card | The name of the second level selected module. Check/uncheck to allow/disallow all available permissions for the chosen module. | Check box | -| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup to define the permission of each field on the each screen. See more on “Acccess Right Fields” | Hyperlink | -| | View /Xem | This column contains one checkbox in each row corresponding to a function to which the View action is applicable. If checked, users in this role can view the data available in this function | Check box | -| | Create/Thêm mới | This column contains one checkbox in each row corresponding to a function to which the Create action is applicable. If checked, users in this role can create data in this function. If user have created permisson then user will have "Save as draft" role also | Check box | -| | Edit /Sửa | This column contains one checkbox in each row corresponding to a function to which the Edit action is applicable. If checked, users in this role can do "update" action in this function. | Check box | -| | Delete/Xóa | This column contains one checkbox in each row corresponding to a function to which the Delete action is applicable. If checked, users in this role can do "delete" action in this function. | Check box | -| | Copy /Sao chép | This column contains one checkbox in each row corresponding to a function to which the Copy action is applicable. If checked, users in this Role can coppy available data in this function | Check box | -| | Approve /Phê duyệt | This column contains one checkbox in each row corresponding to a function to which the Approve/Reject action are applicable. If checked, users in this role can do " approve/reject" action in this function | Check box | -| | History/Xem lịch sử | This column contains one checkbox in each row corresponding to a function to which the History action (i.e. to view earlier versions of the data in the activity log) is applicable. If checked, users in this role can view data history in this function. | Check box | -| | Template/Tạo biểu mẫu | This column contains one checkbox in each row corresponding to a function to which the "Save As Tempalte"action is applicable. If checked, users in this role can save record as a template and able to access to "template" tab in listing page | Check box | -| **Access rights field /Phần quyền chi tiết trường thông tin** | | | | -| | Access permission | The list available fields of chosen module | Display | -| | View/Xem | This column contains one checkbox in the each row corresponding to a function to which the “view” action is applicable. If checked, user in this role can view the field in the screen. | Check box | -| | Editable/Cho phép chỉnh sửa | This column contains one checkbox in the each row corresponding to a function to which the “Editable” action is applicable. If checked, user in this role can modify the value of this field in the screen. | Checkbox | - -* When viewing any record, the system displays only the available permissions for this group. - -### Post-Conditions - -Record is automation approval. - -Based on the permission the system will check and display available module/function of each user as following: - -A = Set of Permission of role which are assigned directly to user - -B= Set of Permission of Role which are assigned to permission group and user are in these permission group. - -**Therefore: C= User permission = Combination of A and B.** - -### Exception Flow - -1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## User Profile - -### Business requirement - -The user profile defines user attributes and sets the date and time for allowing user access to system functions. User profile created will be used for login, and users, upon logging in, will be able to view a list of functions with specific operations set in the permission management section and will be associated with users through this function screen. - -### Process Flow - -N/A - -### Trigger - -* + 1. New account need to be defined. - 2. Need to update information of any existing account in the system. - -### Post-codition - -1. Users have to have the access right on this screen in order to access this screen. -2. Depending on user’s access rights, they can view/add/edit User Profile records. - -### Wireframe - -Please refer to the wireframe in the Figma. - -### Business Rules - -* + - * 1. If the permission required has not been defined, click on the User Profile icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_20). - 2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the User Profile is illustrated in the section [Wireframe](#_Wireframe_20). - 3. Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **General information** | | | | -| | User ID\*/ ID người dùng | Unique user identifier, assigned by the user | X(10) | -| | User Name\*/Tên người dùng | Name of the user associated with the User ID | X(50) | -| | Password/Mật khẩu | Condition field This field is only active and required when creating a new user. The password must be strong enough. | X(50) | -| | Re-enter password/Nhập lại mật khẩu | Condition filed This field is only active and required when viewing any record. The re-enter password must be matched with the password. | X(50) | -| | Reset Password | Condition field This field is only active and required when updating the user profile record. Click to reset the password in case the user forgot the password. See more on “ Reset password” | Hyperlink | -| | Email \*/Email | User’s email address. A password reset link can be sent to this address if the system is configured to do so. User can use this email to log in in the system instead. The email must be unique value | X(100) | -| | Default Language\* /Ngôn ngữ mặc định | Determines the language in which the screen labels are displayed. | Drop-down Select one | -| **Access Detail** | | | | -| | Access Day \*/Ngày truy cập | Seven checkboxes, each of which indicates the day of week on which the user has (checked) or has no (unchecked) access to the system. | Check box Allow to check more than one value | -| | Access time \*/Thời gian truy cập | On days when user has access, the Access Time is the time on and after which user has access to the system – i.e. is able to log in to the system | Time | -| | User Profile Effective From Date \*/Tài khoản có hiệu lực từ ngày | Date on and after which this User Profile is effective and the user can log in to the system | Date | -| | User Profile Effective End Date\*/Tài khoản hết hạn sau ngày | Date on and before which this User Profile is effective and the user can log in to the system After this day user can no longer log in to the system | Date | -| | User Group\*/Nhóm người dùng | A drop-down listing the available User groups. The selected group determines the functions to which the user that this user profile is defined for has access. | Drop-down Select one | -| | Report Access Right/ Quyền truy cập báo cáo | Drop-down listing the Report Access Rights groups. The selected Report Access Rights group determines which report(s) the user has access to. | Drop-down Select one | -| | User Status\*/Trạng thái người dùng | Drop-down to select following user status: Active Blocked If account is blocked then user can no longer login into the system. | Drop-down Select one | -| **Reset Password** A pop-up will be appeared when user click to Reset password | | | | -| | New Password\*/ Mật khẩu mới | Enter new password Password must be strong enough. | X(50) | -| | Re-enter Password\*/Nhập lại mật khẩu | Enters their new password again to confirm | X(50) | -| | Save /Lưu | Click to accept the change | Button | -| | Cancel /Hủy | Click to cancel the change | Button | -| **User Permission / Quyền người dùng** **Display for any active User Profile records** **The list contains all permission which applicable for the chosen user** | | | | -| | “Top level module name” E.g: Customer Management | The name of top-level module. | Display | -| | “Second level Module name” E.g: Card | The name of the seconde level selected module. | Display | -| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup show the access rights fields of chosen module. | Hyperlink | -| | View /Xem | Checked if allow Unchecked if disallow N/A if not applicable this action to that module | Display | -| | Create/Thêm mới | Display | -| | Edit /Sửa | Display | -| | Delete/Xóa | Display | -| | Copy /Sao chép | Display | -| | Approve /Phê duyệt | Display | -| | History/Xem lịch sử | Display | -| | Template/Tạo biểu mẫu | Display | - -### Post-Conditions - -When create new record then the new user account is successfully created in the system. - -The new user receives an email notification with login instructions and temporary password. - -When password is resetted then an email notification will send into user’s email with new password to user can login into the system again. - -### Exception Flow - diff --git a/docs/specs/archive/oneadmin.md b/docs/specs/archive/oneadmin.md deleted file mode 100644 index 2041e0e..0000000 --- a/docs/specs/archive/oneadmin.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: "OneAdmin™" -type: OpenSpec -status: Draft ---- -# OneAdmin™ - -## Overview - -1. OneAdmin™ is a browser-based application framework based on which all OLS administration screen functions are implemented. -2. This section describes the admin screen functions in general. -3. OneAdmin™ provides the screen functions such as the following for users to administer OLS: - -| | | -| --- | --- | -| * 1. Application parameters and campaign management | * 1. Creating and reviewing customer information through menus | -| * 1. Viewing and Posting of transactions for award, redeems and adjusts | * 1. Requesting for generation and viewing of reports. | -| * 1. Creating and reviewing catalogue information. | * 1. Generic Ledger management | -| * 1. Creating and reviewing merchant information | * 1. Posting of transaction testing for award, redeem and adjusts. | - -1. Maintenance actions supported include: - 1. “**Add**”, to add a new record in the module or function. See section 3.6 for an illustration of the [Add](#_Add_Form) form for adding a record. - 2. “**Edit**”, to modify an existing record on the module or function. See section [Edit](#_Edit_Form) for an illustration of the Edit form for editing a record. - 3. “**Copy**”, where user can add a new record with the contents of a currently selected record: user will be prompted to change key values which are not allowed to be replicated across records. See section [Record Copy](#_Record_Copy) for an illustration of the record copy screen. - 4. “**History**” tab brings up a display of previous versions of this record. See section [History](#_Record_History) for an illustration of the History screen. - 5. “**Save**” will save the record displayed in the edit form to the database (whether it’s a new record or changes made to an existing record). - 6. “**Cancel**” will cancel the action. - 7. “**Approve**”, to accept the change of the record in the module or function. - 8. “**Reject**”, to reject the change of the record in the modue or function. - 9. “**Save as Draft**”, to temporary save the record in the module or function without publishing it. - 10. “**Save as Template**”, to save the record displayed in the form to re-use in the furture as a template. -2. When first “saved”, the record is stored with its Status set to “Pending”. -3. It has to be selected (by click on the “Pending” tab to locate records with Status = “Pending”), then clicking on the record to view and/or approve it. -4. Upon approval, the record status is set to “Active”. -5. See section [Approve](#_Approve_Pending_Record) for the process to “**Approve**” pending records. -6. “**Delete**” marks the record being displayed as deleted or “inactive”. -7. The record will be copied into a new record with its status set to “Pending”, and the original record will be left intact. -8. A user with the necessary “Approval” rights must approve the deletion for the record to be deleted and blocked from further use. -9. All updates posted through OneAdmin™ are reflected in the database immediately on approval. - -## Types of Screen Layouts - -1. OLS admin screen functions are generally made up of 3 types of screen layouts, each corresponding to the screen function -2. The first is the **Home Page** – there is only one of this. This screen is displayed after a successful log in. -3. The second is the **Listing** **Page**: - 1. This class of screens is displayed when module in the navigation panel (Menu) is clicked. - 2. It generally displays a default list of records that can be accessed through the module. -4. The third type of screens is the “**Details Page**” layout: - 1. This is the page displayed after a record in the Summary Listing page has been selected. - 2. It shows the details of the selected record at the field level - 3. In some cases, access to child records of the record on display is provided as tabs in the screen. -5. The general features of each type of screen layout are described in the following sub-sections. - -## Home Page - -1. The following figure illustrates the Home Page screen: - -Main Menu - -1. The left panel (navigation panel) lists the module and functions to which user has access. The actual functions available in the navigation panel vary depending on the access rights of the user id that is used to log into the system. Only the functions to which the user has access will be displayed. -2. The main display area shows charts of key statistics, pre-configured at time of deployment. -3. Each of the listed modules in the navigation panel expands when clicked to show the functions available under that module. - -[Image Removed] - -Figure: The “Campaign Managemetn” module in illustrates this expanded view. - -This module has 07 functions – “Campaign Insight”, “Campaign”, “Campaign Rule”, “Pool Definition”, “Pool Conversion Rate”, “Counter Definition”, and “Account Type Group”. - -The total number of pending records on each module is displayed on the right side of the module name. - -1. Clicking on a function will bring up the summary listing page for that function: see section 3.4. - -## Summary Listing Screens - -1. When a function in the navigation menu is clicked, the main display area will typically show the summary listing page for that function. -2. The typical layout is illustrated in the following: - -[Image Removed] - -Sample Summary Listing Screen Layout - -1. In the following table, the row numbers correspond to the display areas enclosed in red boxes with the same number: - -| Box | Description | -| --- | --- | -| | The name and the path of the function are displayed at the top left corner of the main display area, in this case “Campaign Management > Pool List” – i.e. the function for maintaining “Pool Definition” records. | -| | The top right conner of the screen displays the language, with an icon of the language and language name. To change the display language, click on the icon to choose another language. | -| | The top right corner of the screen displays the user id and an icon of the user, with a description of the user’s access rights, i.e. the actions to which the user has access. To leave this screen simply click on the destination module and function in the navigation menu. | -| | The module name | -| | The area labelled in red displays the quick search form. It contains input boxes for filtering the records to be displayed. There are two modes of search – the **Quick search** mode and **Filter** mode: * The **Quick Search** mode search involves searching by key word: + Provides users with a fast and efficient way to access search functionality without navigating through multiple pages with the selection record status in the area 7. + Entering keyword on the text box. + By click on the icon or press “Enter” key to get result. The system will display the list of records where the keyword is found in any column on the listing page except date time data type coulmn, in the area labeled as box number 9. + The search uses the "Contains" operator in a case-insensitive manner to find the matching record | -| | The area labelled 4 in red displays the link to the advanced filter form where multiple fields can be set up as part of the search/filter criteria. * The advanced mode involves clicking on the “**Filter**” link. * When click on the “Filter” button the advanced filter form that appears is illustrated as following: [Image Removed] Figure 1 – Example of the Advanced Filter Form * When click to “Add” button the form that appears as illustrated in red box in area 2 as following: [Image Removed] Figure 2 – Example of the Advanced Filter when add any filter In the red box, which represents the Advance Filter form (area 2): * + Three purple boxes appear in the adjacent areas: area 4, area 5, and area 6. + In the area 4, there is the “Search Field” drop-down a data field name by which to search. The system list all available **field in the listing page by the default, except “Action” and “Status” field.** * Some specific modules will need include custom filter field, that are not displayed on the listing page such as: “Customer Profile” and “Transacion History” screen. See more on its section. * Users can choose from the available data fields to narrow down their search. + In the area 5, there is the “Search Operator”. For each data type‘s search filed then the system provides a set of “Operator” options that users can apply. These operator allow the user to specific how the field should be applied to the selected filter field. All available operator according on each data type’s search field are described on the following table: | | | | | --- | --- | --- | | **Index** | **Data Type** | **Operator** | | | Character | A drop dow to select following values: * Equal * Not Equal * Empty * Not Empty * Contains * Not Contains * In * Not In | | | Number | A drop dow to select following values: * Equal * Not Equal * Greater Than * Less Than * Greater than Or Equal to * Less than or Equal to * Between | | | Boolean | A drop dow to select following values: * Equal | | | Datetime | A drop down to select following values: * Equal * Not Equal * Greather Than or Equal To * Less than or Equal to * Between | * + In the area 6, there is the “Value Field”. This field can be of two types: Text box or Drop-Down. The type of value fields (text box or drop-down) displayed to users depends on the selected operator and searched field as following: * “Empty” and “Not Empty” operator should not require a value input field. * “Between” operator of Date/Time search field should require 2 value input fields with date/ time picker to allow the users to specific the range of date /time to be used in the filter query. * “Between” operator of number search field should require 2 text boxes with number format to allow user to specific the range of number to be used in the filter query. * “In” /”Not In” operator of character search field may present a drop-down list when search field is a lookup value field on that screen, meaning it is a field that fetches data from other tables in the system . The drop-donw list all active records of the search field and allow user select multiple value to be used in the filter query. * “In”/”Not In” operator of character search field may present a text box when search field is not a lookup value field on that screen. This text box should allow the user to enter multiple values, separated by input tag. * “Contain”/”Not Contain” operator of character search field shoud present a text box. This text box should allow the user to enter multiple values, separated by input tag. They system uses “\*” to match zero or more occurrences of the preceding subexpression. * All remaining operators may present a text box input filed to allow the users to enter a filter value. The system should validate the user-entered value based on the data type of the search field. * There is no sensitive case for character search fields. * All selected fields are used in an “AND” search. * On clicking the “Adanced Search” button, the list of records found to have the matching value would be displayed in area in box number 9. * Searching by “Filter” and “Status” be done together as an AND condition. * On clicking the “Reset” button, the system delete all filter field and return all records by the slection status. | -| | This are contains three distinct tabs, each representing a different record status: Active, Pending and Rejected. On the “Pending” tab the system show the total number of pending records next to the tab label. | -| | This area contains the pagination control links – to page forward, backward or to navigate directly to a numbered page with the number of records displayed and the number of record in total. | -| | This is the main display area listing the first N records within the function selected, where N defaults to a system parameter. N can be changed in drop-down box in area 8. The top row contains the column headings, with up to N numbered rows below it. The right-most column in are 10, inclues the actions for viewing, editing, deleting and approval the record in each row. | -| | This area shows the number of records displayed and the number of record in total. | -| | This is the Add button which when clicked brings up the edit form described in section 3.6, for adding a new record in the system. | - -## Detail View - -1. When the View icon for a row is clicked in the Summary List page as described in section 3.4, the details of the record in that row is displayed as illustrated in the following: - -[Image Removed] - -Figure 3 – Sample Record View Screen with Labelled Areas - -[Image Removed] - -Figure 4 – Sample Record History - -| | | -| --- | --- | -| Box | Description (Refer to figure 3 and figure 4) | -| | * This area display the name of the module with the record status and record primary key. | -| | * Clicking on the “Copy” button brings up the view described in section 3.10. This feature provides a convenient means by which to create new records by changing existing records. The “Copy” feature is provided only for selected functions where a “Copy” action is practical. * Clicking on the “Edit” button, the fields are displayed with details of the record in that row, awaiting user input to amend the details. * Clicking on the “Delete” button brings up the pop-up to user confirm the deleted action. | -| | * The function accessed is displayed as a tab. * If the function has data which can be categorised separately in a logical way, each category is displayed as a different tab. * This area shows the tabs available and clicking on the tab brings up the display for that category of data. | -| | * This area shows the details of the record. | -| | * The panel on the right/bottom displays supplementary data relating to the record in the main display area (area 5). The details in the right panel vary depending on the function. | -| 7 | * Clicking on the “Back” button brings the view back to the Summary Listing page. | -| 8 | This area shows when the record was last changed, and by whom. * Every time a record is updated or approved, the user id that last made the change and the user id that last approved a change are logged with the record, together with the date and time of the action. * This information is always shown at the bottom of the record details screen display. * Only records with Status = “A” for Active are taken into account during transaction processing: if a record status is not active it will not be taken into account for any transaction processing. * The “Last Updated By” field shows the user id of the user who last updated this record. If the record is updated by a batch process, this field will contain the Batch Id. * The “Last Updated Date” field shows the date and time when the record was last updated. * The “Last Approved By” field shows the user id of the user who last approved this record. For updates by programs (batch processes and online transactions), this field is empty. * The “Last Approved Date” field shows the date and time when the record was last Approved. For updates by programs (batch processes and online transactions), this field is empty. | -| 9 | This area shows when the action records may can be changed * Clicking on the “History” records will bring up the display described as in area 4. * By choose the 2 version and clicking the “Compare” button will bring up the display described in section 3.8: Record History. Feature allows for easy browsing of the changes made to the record | - -## Add/ Edit Screen - -1. When the Edit /add for a row is clicked in the Summary List page, the details of the record in that row is displayed in the edit form for editing, as illustrated in the following: - -[Image Removed] - -Figure 3 – Sample Record Edit Form with Labelled Areas - -1. Each row in the following describes the correspondingly numbered area in Figure 3: - -| | | -| --- | --- | -| Box | Description (Refer to Figure 3) | -| | This area shows the function for which the edit form is being displayed. | -| | This is the main edit form. * Mandatory input fields have a coloured border on the left. * If the edit form is displayed as a result of the “Add” button being clicked in the previous screen, the fields will be displayed empty, awaiting user input * If the edit form is displayed as a result of the “Edit” button being clicked in the previous screen, the fields are displayed with details of the record in that row, awaiting user input to amend the details. | -| | * The “Create”/”Update” button will save the changes or in the case of the “Add” action, the input data, in the database as a new record with record Status = “Pending”. Note that the record being changed (“original record”) will remain unchanged. | -| | * The Cancel button causes any input or change made to be discarded and the display will return to the previous summary listing page. | - -## Approve Pending Record - -1. When a new record is first added, or when an existing record is “Changed” or “Deleted”, the new or modified record is inserted in the database with a Status set to “Pending”. -2. The original record remains active. -3. The “Pending” records must first be “Approved” by a user who has the rights to the “Approve” action for that function before the change becomes effective. -4. To “Approve” a record, the record must first be located by clicking for records with the “Pending ” tab as illustrated here: - -[Image Removed] - -Figure 4 – Search for Pending Records - -[Image Removed] - -Figure 5– Pending Record Listing - -1. In change mode, the record values with and without the change are both displayed for comparison.The previous value (before change) and the modified value,that pending approval are displayed side by side, with modified fields displayed in a font of a different color, as illustrated: - -* Red text highlights changes of the active record, ~~Red text~~ highlight with strikethrough effect for the deteled data. -* Green text highlights changes of the pending record. -* **Black text** denotes unchanged information in both record versions. - -[Image Removed] - -Figure 6 – Pending Record Displayed Side-by-side with Currently “Active” Record - -1. At this point, it is possible to click on the Modify button to edit the record and save it back into the Pending list. The user who edits the record will not be able to “Approve” the change. -2. Click on the “Approve” button to put the record into active use. -3. Click on the “Reject” button to return the record to the Reject list for follow-up and correction. -4. Users can “Approve/Reject” record from detail view mode or by clicking on the “Approve/Reject” button from listing page. - -## Record History - -1. The “History” feature is for scanning through historical versions of a record. -2. When in the Record Detail view, clicking on the “History” Tab will bring up the all version of the record. -3. When the “Compare” button is clicked, the display will show details of two chosen version as following: - -[Image Removed] - -Figure 7 – Sample Display of a Record’s History - -| | | -| --- | --- | -| Box | Description (Figure 7) | -| | Drop-down lisitng all history version inclues currently version. Users can change version to compare by select the verion to compare. | -| | Details displayed in the change history of two selected versions by the version in the drop-down list in area 1. * Red text highlights changes of the record in the red drop-down in the area 1. * Green text highlights changes of the redcoed in the green drop-down in the area 1. * **Black text** denotes unchanged information in both record versions. | - diff --git a/docs/specs/archive/reference.md b/docs/specs/archive/reference.md deleted file mode 100644 index de034e6..0000000 --- a/docs/specs/archive/reference.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Reference" -type: OpenSpec -status: Draft ---- -# Reference - -| Ref# | Description / File Name | -| --- | --- | -| R01 | | -| R02 | | -| R03 | | -| R04 | | -| | | - -Change History - -| **Version** | **Change Description** | **Date** | **Updated by** | -| --- | --- | --- | --- | -| | The first version including: Customer Management Campaign Management Draft OMR module | 14/12/2023 | Trangdth Maivt | -| | 1. Customer 360: Add more detail for Account/Card information 2 Section 5.1 Add filter, Add/update some fields in the screen Section 5.5 Card: Update description and logical Section 5.9 and 5.10: Update label | 18/12/2023 | Trangdth | -| | 1. Update the Pool Conversion Rate module 2. Update data type DD/MM/YYYY into "Date" to respect the date time configuration format 3. Update the Card logically: Add more detail when updating the card 4. **Update customer Management module section 5: an update based on Sang's requirement (Customer/Account/dashboard/transaction history/attribute/counter)** Update Vietnamese fields and some cosmetic issues | 20/12/2023 | Trangdth | -| | 1. Update customer block data type from X(20) into X(10) 2. Section 5.4 update the card activation date from mandatory to optional 3. Section 5.2.6: Update the logic of most items 4. Section 4.7- Pool Conversion Rate: update field name and logic for pool conversion rate 5. Section 4.12 Campaign Rule Criteria: Correction some typos and add more detail for txncat criteria 6. Pool Definition: remove the item code field (move to Rule setup). Add some validations(red line) 7. Add CEP rule type | 27/12/2023 | Trangdth | -| | 1. Add REP Rule 2. Update Pool Definition Screen: screen and logical 3. Update Counter Defintion to match with PMS and add more detail. | 02/01/2024 | Trangdth | -| | 1. Update API information for REP rule 2. Update API information for CEP Rule 3. Add document for Formula (UI+ Logical) | 10/01/2024 | Trangdth | -| | 1. Add Section 5.15 Awward Transaction Entry Screen 2. Update Section 4.8 Counter Definition: Add Late txn posting option. Update logical on post-condition 3. Update Pool Defintion: add more detail for ATG field 4. CEP/REP: Update API for run schedule | 16/01/2024 | Trangdth | -| | 1. Counter definition: Update: Active "First start date is fixed" for "Days from COD" period unit 2. Pool conversion rate: Update code from X(03) into X(05) 3. Card - Update data type and logic for Old Card number - Update the relationship of Account type and Account number 4. Add Campaign : Add description for CP module | 24/01/2024 | Trangdth | -| | 1. Add section 4.12 Campaign Rule logical for Award/redem/Adjust rule type 2. Add section 4.9 Transaction Category module | 25/01/2024 | Trangdth | -| | 1. Campaign: change data type and add alidation for Campaign type 2. CEP: Update data type for Run schedule and change the sequence order in Layout 3. REP: Update data type for Run schedule and change the sequence order in Layout | 30/01/2024 | Trangdth | -| | Section 4.17 : CEP : Update API information of following fields: - Account with blocked Card - Post Transactions under PA Account selected based on | 19/02/2024 | Trangdth | -| | Section 4.12.6 : Campaign Rule/Business Rule : Update validation of "Apply after Cap value " field | 21/02/2024 | Trangdth | -| | 1. Correction typo 2. Section 4.13: Rule criteria: Update more detail and req 3. Section 5.11 Adjustment : Add field and update logical of quick view | 05/03/2024 | Trangdth | -| | 1. Correction typo 2. Section 5.11 Adjustment: Update Vietnamese label and correction logical 3. Section 5.12 Transfer Balance: Add fields, Update logical, Add User Stories and Accepted Criterions 4. Section 5.13 Re-instatement : Add fields, Update logical , Add User Stories and Accepted Criterions | 07/03/2024 | Trangdth | -| | 1. 5.2.6.3: Account/Card information: Update logical and data entities 2. 5.11 Adjust: Add US and AC 3. 5.12 Award Transaction: Add fields, Update logical , Add User Stories and Accepted Criterions 4 5.5 Pool Balance Detail: Correction and Add User Stories and Accepted Criterions | 11/03/2024 | Trangdth | -| | 1. Section 4.15 contributor setting: Update data type of "Contributor Percentage" field 2. Section 4.14 Campaign Rule formula: Remove validation of F5/Multiplier | 12/03/2024 | Trangdth | -| | 1. Section 7: Added OneCatelogue module, including: Item master/ Catalogue/Category/Voucher management 2. Section 4.12 Campaign Rule: Added Post-condition for Amount to Use feature (Transaction Processing with Amount to use). 3. Secttion 4.6 Pool Definition: Remove CP Rule name and change data for "List Of Campaign" listing page. | 20/03/2024 | Trangdth | -| | 1. Add section 7.5: Item Price 2. Update section 5.14 Item redemption to match onecatalogue logical 3. Update quick view of Adjust/transfer balance/Re-instatement/Award. Take note that I just remove redundant information and update the description to be more clearly. The logical is not changed. | 25/03/2024 | Trangdth | -| | 1. Added section 2 (2.1/ 2.2/2.3/2.4) OneAccess module, including Overview, User Group, Permission Management and User Profile 2. 4.6 Pool Definition: Correction typo 3. 4.13 Rule Criteria: Correct index of operator on each data type 4. 4.14 Campaign Formula : Update Formula logical on TP sides | 03/04/2024 | Trangdth | -| | 1. Correction typo 2. Section 4.13 Rule Criteria: Update logical of String data type (TP sides only) (change in red text) | 12/04/2024 | Trangdth | -| | 1. Section 5.6 Transaction History: Update sketch, Update US and AC, update Business rule 2. Section 5.11 Adjustment: Update sketch. Update US and AC, update business rule 3. Section 5.15 Award : Update US and AC | 15/04/2024 | Trangdth | -| | 1. Section 4.18 Added Item Redemption Rule Type | 16/04/2024 | Trangdth | -| | 1. Section 7: OneCatalogue: Typ0 correction and update section 7.6 Voucher Code module 2. Section 4.12.7 CP rule : Add Award limit use case in FSD | 19/04/2024 | Trangdth | -| | 1. Section 5.6 Transaction History: Added "Pool Unit Amount" on Award quick view. 2. Section 5.15 Item Redemption: update business req/ Flow and post condition 3. Section 7.5 Item Price Update flow/ post condition / add effective date | 26/04/2024 | Trangdth | -| | 1. Section 4.6 Pool Definition : Add validation for Card entity level field 2. Section 4.13 Campaign Rule Criteria : Correction description of filter value of Number data type 3. Section 5.14 Item Redemption : Correction Wireframe and update business rule 4. Section 7.3 Item master: Add Face value and correction typo | 02/05/2024 | Trangdth | -| | 1. Addded description to clear "Balance detail" quick view of Award and Adjustment Transaction Screen (in red text). 2. Section 5.14 Item redemption : Added User Stories and Acceptance criteria | 06/05/2024 | Trangdth | -| | 1. Section 4.13 Campaign Rule Criteria: Update String data type: Use Input tag instead of delimiter in case there are many filter value if input type as "value" | 09/05/2024 | Trangdth | -| | 1. Section 4.13 Campaign Rule Criteria: Add more description for Date Data type. 2. Section 4.12 Campaign Rule: Add new fields/validation to handle Evoucher Pool and Adjust Rule Type. ( Change in red) | 20/05/2024 | Trangdth | -| | 1. Section 4.6: Pool Definition: Add validation for Precision of Pool 2. Section 7.6: Voucher code: Change field name from Voucher type into Promotion Type 3. Section OneAdmin Overview: Update and correction section 3.1/3.2/3.3 4. Section 7.5 Item price: Add item code to avoid confuse 5. Customer Profile: Add "Address Type: field 6. Section 5.6 Item redemption Entry: Remove redudant field and add validation (Change in red text) | 24/05/2024 | Trangdth | -| | 1. Counter Definition: Add validation for "Bucket period Unit" 2. Campaign rule: Remove API of master data filed Remove Voucher code Add item code | 30/05/2024 | Trangdth | -| | 1. Section 5.9/5.10: Attribute/Counter: Correction and update more detail 2. Section 5.6: Transaction History: Remove Deleted field, correction typo and update detail for quick view 3. Section 5.11/5.12: Adjustment /Transfer balance: Correction process flow and business 4, Section 5.15: Award transaction: Update process flow on TP side 5. Other section: Update and correct to match with the system | 17/06/2024 | Trangdth | -| | All sections: Add more description for number field if needed | 19/06/2024 | Trangdth | -| | 1. Campaign formula /Business rule : Update validation for "Amount " field (F4/F6) 2. Section 5.2.6.2: Customer’s rewards statistic : Remove total spending, Update logical for Points/Cash back All change in red text | 24/06/2024 | Trangdth | -| | 1. Add section 3: Oneadmin: Overview about the OLS system : Search/Filter/Add/View/Edit/Approve/History 2. Add Section 4: Application Parameter 3. Update section 6.2.6: Customer 360=>Business Rule: Correct typo. Add more detail for pool balance information and most redeemed item | 12/07/2024 | Trangdth | -| | Correction typos | 11/11/2024 | Trangdth | - diff --git a/docs/specs/customer_management/account.md b/docs/specs/customer_management/account.md deleted file mode 100644 index 224ae0c..0000000 --- a/docs/specs/customer_management/account.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Account" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Account - -## Requirement Definition -Manages customer account information, which is either sent from an external system to OLS or added by users manually via the OLS system. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Account" module. -- An account type must exist in OLS before an account of that type can be added. -- The user must select a customer to access the Account tab. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| CIF Number | CIF number of selected customer. | String | Required. Read-only on creation. | -| Product Account Level (PAL) | Product Account Level. | Enum (Lookup) | Required. | -| Product Account Type (PAT) | Product Account Type. | Enum (Lookup) | Required. PAL + PAT = Account Type. | -| Account Number | Product Account Number. | String (20) | Required. Combination of Account No + Account Type must be unique. | -| Account Open Date | Open date of the account. | Date | Required. | -| Account Indicator | Personal [P] or Corporate [C]. | Enum (Lookup) | Required. | -| Account Block Code | Used to block transactions. | String (10) | Optional. | -| Block Code Reason | Reason for blocking. | String (100) | Optional. | -| Block Code Last Update Date | Date block was applied. | Date | Optional. | -| Cycle | Statement cycle date. | Integer (2) | > 0 if provided. | -| Account Status | Status of the account. | Enum (Lookup) | Required. | - -### Execution -- Each account belongs to one Customer. The CIF number cannot be changed via this screen (requires CIF Merge batch). -- Records managed by OLSACCT batch cannot typically be changed from the admin screen. -- On Add: Rejected if Account No + Account Type already exists. Else, record added to PRODUCT_ACCOUNT and LOYALTY_ACCOUNT_PRODUCT created. -- On Update: Must exist in OLS. Original record moved to history. -- On Delete: Rejected if linked to an active Card record. Else, logical delete applied (moved to history). - -## Exception Flow -- Input validation failures stop the action. diff --git a/docs/specs/customer_management/adjustment.md b/docs/specs/customer_management/adjustment.md deleted file mode 100644 index 7302495..0000000 --- a/docs/specs/customer_management/adjustment.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Adjustment" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Adjustment - -## Requirement Definition -Allows manual posting of adjustment transactions to correct balance discrepancies. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Adjustment Entry" module. -- Records require Maker-Checker approval. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Posted Transaction By | Card, Account, or CIF. | Enum | Required. | -| Card / Account / CIF | Identifier based on above selection. | String | Required. | -| Adjustment Quantity Sign | Positive or Negative adjustment. | Enum | Required. | -| Store | Store of transaction. | Enum (Lookup) | Required. | -| Pool Id | Pool to be adjusted. | Enum (Lookup) | Required. Must respect entity level logic. | -| Transaction Date | Transaction date time. | Date | Required. | -| Expiry Date (Positive) | Expiry date of the new bucket. | Date | Required if Positive Adjustment. Defaults to pool policy. | -| Bucket Expiry Date (Negative)| Specific bucket to deduct from. | Enum (Lookup) | Optional. If empty, uses FIFO Redemption approach. | -| Adjustment Quantity | Amount to adjust. | Decimal | Required. Must be > 0. | -| Reason Code | Reason for adjustment. | Enum (Lookup) | Required. | -| Transaction Code | OLS transaction code. | Enum (Lookup) | Required. | -| Remarks | Additional notes. | String (100) | Optional. | - -### Execution -- **Pending/Approve Flow**: New adjustments go to a Pending state. Authorized user must approve. -- **Positive Adjustments**: - - Offsets any negative balance buckets first. - - Remaining points added to a new bucket with specified Expiry Date. -- **Negative Adjustments**: - - If a specific Bucket Expiry Date is chosen, deduction happens there. - - Otherwise, points are deducted based on FIFO. -- OLS validates status, permissions, and block codes for the entity. - -## Post-Conditions -- Pool balance buckets updated. -- Transaction logged in history. - -## Exception Flow -- Validation failures or insufficient permissions. diff --git a/docs/specs/customer_management/attribute.md b/docs/specs/customer_management/attribute.md deleted file mode 100644 index 5094a35..0000000 --- a/docs/specs/customer_management/attribute.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Attribute" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Attribute - -## Requirement Definition -Provides a consolidated view of all attributes assigned to a customer, account, or card, populated by batch processes or Campaign Rules. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Attribute" module. - -## Business Rules - -### Data Schema - -#### Attribute Value Detail -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Attribute Group | Group of attribute. | String | Read-only. | -| Attribute ID | Attribute ID. | String | Read-only. | -| Attribute Name | Attribute Name. | String | Read-only. | -| Entity | Client, Product_Account, or Card. | Enum | Read-only. | -| Entity ID | CIF Number, PA Number, or Card Number based on Entity. | String | Read-only. | -| Account Type | Required for Account attribute. | String | Read-only. | -| Attribute Value | Value of the attribute. | String/Number | Read-only. | -| Effective Date From | Start date. | Date | Read-only. | -| Effective Date To | End date. | Date | Read-only. | - -#### Linked Campaign Details -Lists Campaign Rules referencing this attribute. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Campaign ID. | String | Read-only. | -| Campaign Name | Name of Campaign. | String | Read-only. | -| Campaign Rule | Campaign Rules ID. | String | Read-only. | -| Campaign Rule Name | Name of Campaign Rule. | String | Read-only. | -| Effect Date | Effective from and to dates. | Date | Read-only. | - -### Execution -- **View-only screen.** -- Data from `ATTRIBUTE_VALUE` table. -- Filterable by Entity level and effective dates. Only effective records listed by default. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/award_transaction.md b/docs/specs/customer_management/award_transaction.md deleted file mode 100644 index bf21169..0000000 --- a/docs/specs/customer_management/award_transaction.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Award Transaction" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Award Transaction - -## Requirement Definition -Allows users to review, verify, and manually create Award Transactions to grant points/rewards to a customer's account. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in both the "Customer Profile" and "Award Transaction" modules. -- The user must select a customer on the customer profile listing page. -- Dependent on access rights, users can view, add, edit, or approve manual Award Transaction records. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Posted Transaction By | Card, Account, or CIF. | Enum | Required. | -| Card / Account / CIF | Identifier based on above selection. | String | Required. | -| Store | Store of transaction. | Enum (Lookup) | Required. | -| Transaction Date | Transaction date time. | Date | Required. | -| Reason Code | Reason for the award. | Enum (Lookup) | Required. | -| Transaction Code | OLS transaction code. | Enum (Lookup) | Required. | -| Remarks | Additional notes. | String (100) | Optional. | - -#### Award Details -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Pool Id | Pool to be awarded. | Enum (Lookup) | Required. Must respect entity level logic. | -| Award Quantity | Points to award. | Decimal | Required. Must be > 0. | -| Expiry Date | Expiry date of the awarded points bucket. | Date | Required. Defaults based on pool's expiry policy. | - -### Execution -- **Pending/Approve Flow**: New award transactions go to a Pending state. An authorized user must approve them. -- Manual awards act similarly to positive Adjustments but follow the Award business logic path (potentially triggering Campaign Rules if configured). -- Points are added to a new bucket with the specified Expiry Date. - -## Post-Conditions -- Pool balance buckets are updated. -- Transaction is logged in history. - -## Exception Flow -- Validation failures or insufficient permissions. diff --git a/docs/specs/customer_management/card.md b/docs/specs/customer_management/card.md deleted file mode 100644 index 854eb44..0000000 --- a/docs/specs/customer_management/card.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Card" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Card - -## Requirement Definition -Manages customer card information. Generally updated in the external system and loaded into OLS, thus often view-only, though manual additions/replacements are supported with strict rules. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Card" module. -- The parent account must exist in OLS before adding a card. -- User must select a customer. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| CIF Number | CIF Number of the card. | String | Required. Defaults to selected customer but can change for Supplement Cards. | -| Account Type | Product Account Level + Type. | Enum (Lookup) | Required. | -| Account Number | Parent Product Account Number. | Enum (Lookup) | Required. | -| Card Number | The card number. | String (20) | Required. Must be globally unique. | -| Masked Card Number | Masked version. | String (20) | Optional. | -| Cardholder Name | Name on card. | String (50) | Required. | -| Card Indicator | Supplement [S], Principal [P], Corporate [K]. | Enum (Lookup) | Required. If Principal, Card CIF must equal Account CIF. | -| Card Status | Card status. | Enum (Lookup) | Required. | -| Card Block Code | Block code for transactions. | String (10) | Optional. | -| Card Activation Date | Date activated. | Date | Optional. | -| Card Creation Date | Date created. | Date | Required. | -| Card Expiry Date | Expiry date. | Date | Required. | -| Old Card Number | For replacements only. | Enum (Lookup) | Required only if adding a replacement card for an existing one. | - -### Execution -- Each Card belongs to one Account and one Customer. Changes to CIF/Account require CIF Merge batch. -- On Add: Rejected if Card Number already exists, or if Account/CIF does not exist. Adds to CARD and CARD_PRODUCT_ACCOUNT_REL. -- On Delete: Logical delete (moved to history). -- Replacement Flow: When replacing an old card, the new card gets the same PSN (Plastic Serial Number). The old card remains active until its status/block code is updated. All attributes, counters, and pool buckets linked to the old card are automatically linked to the new card. - -## Exception Flow -- Validation failures. diff --git a/docs/specs/customer_management/counter.md b/docs/specs/customer_management/counter.md deleted file mode 100644 index f79cd3a..0000000 --- a/docs/specs/customer_management/counter.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Counter" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Counter - -## Requirement Definition -Displays all counter buckets for a chosen customer, including Customer-level, Account-level, and Card-level counters, which are updated by Campaign Rules or manually. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Counter" module. - -## Business Rules - -### Data Schema - -#### Counter Value Detail -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Counter | Counter identifier. | String | Read-only. | -| Entity | Cust [CU], Account [PA], Card [CA]. | Enum | Read-only. | -| Entity ID | CIF Number, Account Number, or Card Number. | String | Read-only. | -| What to count | The data entity tracked. | String | Read-only. | -| Counter Value | Counter value. | Decimal | Read-only. | -| Bucket Start Date | Start date. | Date | Read-only. | -| Bucket End Date | End date. | Date | Read-only. | -| Counter State | A: Awarded, C: New. | Enum | Read-only. | - -#### Counter Statistic (History) -Lists transactions that updated this counter bucket. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Reference No | OLS Transaction Reference Number. | String | Read-only. | -| Post Date | Post date of the transaction. | Date | Read-only. | -| Counter Value | Value updated on this transaction. | Decimal | Read-only. | -| Bucket Number | Bucket number of selected counter. | Integer | Read-only. | -| Update Date | System date when updated. | Date | Read-only. | -| Updated By | Batch/User who posted transaction. | String | Read-only. | - -### Execution -- **View-only screen.** -- Values retrieved from `Campaign_Counter` table. -- Filterable by Entity level and bucket periods. Effective records listed by default. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/customer_360.md b/docs/specs/customer_management/customer_360.md deleted file mode 100644 index 544c393..0000000 --- a/docs/specs/customer_management/customer_360.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Customer 360" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Customer 360 - -## Requirement Definition -A centralized dashboard providing key information about a customer, giving a real-time view of customer behavior, balances, cards, and transaction statistics. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Customer Profile" module and select a customer to view the dashboard. - -## Business Rules - -### Dashboard Components - -#### 1. Customer Information -- Summarized view of the customer's profile (name, CIF, status, etc.). Allows edit/delete actions from a pop-up. - -#### 2. Customer's Rewards Statistic -- **Points**: Total available points. -- **Cash back**: Total available cash back. -- (Uses system date to determine balance bucket periods). - -#### 3. Account / Card Information -- Lists all of the customer's accounts and cards. -- If there are no cards, it shows just the accounts. -- Columns include: Account Type, Account No, Card No, CIF, Card Status, Indicator, Expiry, Account Block Code, Account Status, Open Date. - -#### 4. Transaction Statistic -- **Line Chart**: Shows fluctuation in balance (Earned/Redeemed/Adjusted) for a selected pool over a specified period (This month, Last month, Last 3/6 months). Data from TRANSACTION table. -- **Combo Chart**: Illustrates relationship between total number of transactions (line) and total transacted merchants (bar) over a specified period. - -#### 5. Customer Activities -- Logs loyalty program actions (enroll, earn, redeem, transfer), feedback/reviews, email engagement, and account management events. -- Filterable by timeframe. - -#### 6. Customer Segmentation -- Shows the demographic (Gender, Age, Marital Status, Income) and behavioral (Frequency, Membership class, Purchase channel, Hobby) segments the customer belongs to. - -#### 7. Most Redeemed Items -- Displays the top N (configurable, default 10) redeemed items of the customer. -- Shows Item Code, Name, Category, Quantity, Points used, Cash amount used. -- Data from CAT_CATALOGUE_TRANS_DETAIL ordered by quantity descending. - -#### 8. Balance Information -- Summary of all Pool balances for the customer. -- Shows Pool ID, Pool Name, Balance (sum of all buckets), Redeemable Balance (non-expired/available), Earliest Expiring Balance and Date. - -## Post-Conditions -- Strategy guide for personalized experiences. diff --git a/docs/specs/customer_management/customer_profile.md b/docs/specs/customer_management/customer_profile.md deleted file mode 100644 index 6dc4652..0000000 --- a/docs/specs/customer_management/customer_profile.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Customer Profile" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Customer Profile - -## Requirement Definition -Provides view-only access to Customer details within the OLS administration screens. Customer records are primarily updated from source systems via batch processes. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Customer Profile" module. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| CIF Number | Unique CIF Number assigned to each customer. | String (30) | Required. | -| First Name | Customer First Name. | String (50) | Required. | -| Last Name | Customer Last Name. (First Name + Last Name = Customer Name) | String (50) | Required. | -| Date of Birth | Customer birth date. | Date | Required. | -| Registration Date | Date customer opened an account. | Date | Optional. | -| Gender | Customer Gender. | Enum (Lookup) | Optional. | -| Customer Status | Customer status. | Enum (Lookup) | Required. | -| Customer Block Code | Customer block code. | String (10) | Optional. | -| Marital Status | Customer marital status. | Enum (Lookup) | Optional. | -| ID Type | ID Type of cardholder ID. | Enum (Lookup) | Optional. | -| Cardholder ID | Cardholder ID. | String (30) | Required if ID Type is selected. | -| Country Origin | Customer country origin. | Enum (Lookup) | Optional. | -| Customer Income | Customer income. | Decimal (14,2) | >= 0 if provided. | -| Profile Picture | Uploaded image file. | Image / URL | Optional. | - -#### Contact Detail -Each customer can have more than one contact detail (e.g., customer contact, guardian contact). At least one must be provided. - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Address Type | Home/Business/Shipping/Billing. | Enum | Required. Unique per customer. | -| Phone Number | Phone number. | String (30) | Required. | -| Email Address | Email address. | String (50) | Required. Must be valid email format. | -| Address 1 | Main address. | String (100) | Optional. | -| Address 2 | Other address. | String (100) | Optional. | -| State | State code. | Enum (Lookup) | Optional. | -| City | City code. | Enum (Lookup) | Optional. | -| Zip Code | Postal code. | Enum (Lookup) | Optional. | - -### Execution -- When a new customer is added in OLS, it is added to Client tables, and the corresponding LOYALTY_ACCOUNT is created. -- A request to add a customer whose CIF already exists with an Active status is rejected. -- A request to update/delete a CIF that does not exist or is inactive is rejected. -- Deletion of a CIF linked to an active Account is rejected. Logical delete is used (moving to History). -- Admin screen changes are generally restricted for records managed by the OLSCUST batch. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/item_redemption.md b/docs/specs/customer_management/item_redemption.md deleted file mode 100644 index 6ffa560..0000000 --- a/docs/specs/customer_management/item_redemption.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "Item Redemption" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Item Redemption - -## Requirement Definition -Allows users (e.g., call center staff) to manually redeem items for customers in real-time, exchanging points (and optionally cash) for catalog items. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Item Redemption Entry" module. -- Real-time catalog configuration and customer balances must be available. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Posted Transaction By | Card, Account, or CIF. | Enum | Required. | -| Card / Account / CIF | Identifier. | String | Required. | -| Redemption Channel | Channel of redemption. | Enum (Lookup) | Required. | -| Redemption Date | Transaction date. | Date | Required. | -| Store | Active store in OLS. | Enum (Lookup) | Required. | -| Applicable Fee | Apply item fee if configured. | Boolean | Default False. | - -#### Item Details -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Catalogue Code | Catalog to redeem from. | Enum (Lookup) | Required. | -| Item | Item code. | Enum (Lookup) | Required. Item must have a matched price. | -| Redemption Mode | Fixed Points or Fixed Partial (Cash + Points).| Enum | Required based on price configuration. | -| Unit Price (Points) | Point cost per item. | Decimal | Required. Fixed for Fixed Points; editable but >= minimum for Fixed Partial. | -| Unit Cash Amount | Cash cost per item. | Decimal | Required for Fixed Partial. Calculated: (Full Price - Unit Price) * Price in Cash. | -| Unit Face Value | Face value of item. | Decimal | Read-only. Base face value or price config face value. | -| Quantity on Hand | Available inventory. | Integer | Read-only. Displayed if tracked by quantity. | -| Redemption Quantity | Amount to redeem. | Integer | Required. Must be > 0 and <= Quantity on Hand. | -| Total Price (Points) | Total points required. | Decimal | Read-only. Unit Price * Redemption Quantity. | -| Total Cash Amount | Total cash required. | Decimal | Read-only. Unit Cash Amount * Redemption Quantity. | -| Delivery Address | Delivery details for Physical/Evoucher. | String | Auto-populated from profile, editable. | - -### Execution -- Transactions cannot be modified after posting. -- Validates block codes and permissions. -- Net transaction value is sum of tax, total fee, and total cash required. -- At EOD, approved items are output to a file for partners to fulfill. - -## Post-Conditions -- Balances and inventory updated. -- Transaction viewable in history. - -## Exception Flow -- Insufficient balance or TP validation failure blocks transaction. diff --git a/docs/specs/customer_management/no_hit_cp_transaction.md b/docs/specs/customer_management/no_hit_cp_transaction.md deleted file mode 100644 index d7e97a3..0000000 --- a/docs/specs/customer_management/no_hit_cp_transaction.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "No-Hit CP Transaction" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# No-Hit CP Transaction - -## Requirement Definition -Tracks all incoming transactions that trigger a campaign rule but are not eligible (do not meet criteria) OR transactions that have no linked campaign rule. Helps in troubleshooting why a customer did not receive an expected reward. - -## Process Flow - -### Pre-Conditions -- Incoming transactions trigger campaigns but do not hit the rule criteria. -- Users must have access rights in the "No hit CP- Transaction" module. - -## Business Rules - -### Data Schema - -#### Transaction Detail (Incoming request data) -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| CIF Number | CIF Number. | String | Read-only. | -| Product Account No | Product Account No. | String | Read-only. | -| Card Number | Card Number. | String | Read-only. | -| Invoice No | Generated unique incoming transaction ID. | String | Read-only. | -| Transaction Type | AWD / RED / ADJ. | Enum | Read-only. | -| OLS Transaction Code | Used to locate CP rule. | String | Read-only. | -| Transaction Amount | Gross amount or adjust point. | Decimal | Read-only. | -| Various | Store, Terminal, MCC, Currency, etc. | Various | Sourced from incoming transaction. | - -#### CP Rule Listing (Error Details) -Displays details for each Campaign Rule the transaction triggered but failed to hit. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Campaign ID. | String | Read-only. | -| Campaign Rule | Campaign Rule ID. | String | Read-only. | -| Pool ID | Reward pool. | String | Read-only. | -| Error Code | Error response code from OLS. | String | Read-only. | -| Error Descriptions | Detailed description of why criteria failed. | String | Read-only. | - -### Execution -- **View-only screen.** -- Data is sourced from `OLS_ORPHAN_TXN_NO_HIT`. -- The error description should specify exactly which criteria failed (e.g., MCC didn't match, Minimum amount not met). - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/pool_balance_detail.md b/docs/specs/customer_management/pool_balance_detail.md deleted file mode 100644 index d030372..0000000 --- a/docs/specs/customer_management/pool_balance_detail.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Pool Balance Detail" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Pool Balance Detail - -## Requirement Definition -Provides a summary and detailed breakdown of all reward pools and their balance buckets for a selected customer. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Balance Enquiry" module. - -## Business Rules - -### Data Schema - -#### Pool Balance Summary -Displays a row for each pool the customer interacts with. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Pool ID | Pool ID. | String | Read-only. | -| Pool Name | Pool Name. | String | Read-only. | -| Pool Type | Pool Type. | String | Read-only. | -| Pool Entity Level | Customer, Account, or Card level. | String | Read-only. | -| Balance | Sum of all balance buckets. | Decimal | Read-only. | -| Redeemable Balance | Sum of non-expired, available buckets. | Decimal | Read-only. | -| Next Expiring Balance | The earliest non-expired balance bucket amount. | Decimal | Read-only. | - -#### Pool Balance Detail (Bucket Breakdown) -Displays the individual expiry buckets for a selected pool. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Account Type | Account Type. | String | Read-only. | -| Account No | Account Number. | String | Read-only. | -| Card Number | Card Number (only if Card pool entity level). | String | Read-only. | -| Pool ID | Selected Pool ID. | String | Read-only. | -| Balance | Non-zero balance of the bucket. | Decimal | Read-only. | -| Expiry Date | Expiring date of the bucket. | Date | Read-only. | - -### Execution -- **View-only screen.** No modifications allowed directly. -- Grouping/Visibility is dependent on the Pool Entity Level: - - Customer level: Shows buckets grouped under accounts, even though earned at customer level. - - Account level: Shows buckets earned by the specific Account. - - Card level: Shows buckets earned by the specific Card. -- Expired buckets that have not yet forfeited are shown. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/re_instatement.md b/docs/specs/customer_management/re_instatement.md deleted file mode 100644 index 8cd8e75..0000000 --- a/docs/specs/customer_management/re_instatement.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Re-Instatement" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Re-Instatement - -## Requirement Definition -Allows manual re-instatement of expired balance buckets that have not yet been forfeited. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Re-Instatement" module. -- The customer must have expired pool buckets that are within the grace period (not yet forfeited). -- Requires Maker-Checker approval. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Posted Transaction By | Card, Account, or CIF. | Enum | Required. | -| Card / Account / CIF | Identifier based on above selection. | String | Required. | -| Store | Store of transaction. | Enum (Lookup) | Required. | -| Pool Id | Pool of the bucket to re-instate. | Enum (Lookup) | Required. Lists pools with non-forfeited expired balances. | -| Bucket to Re-instate | Specific expired bucket to reinstate. | Enum (Lookup) | Required. | -| Expiry Date | New expiry date of the reinstated points. | Date | Required. | -| Reason Code | Reason for re-instatement. | Enum (Lookup) | Required. | -| Remarks | Additional notes. | String (100) | Optional. | - -### Execution -- **Pending/Approve Flow**: New requests go to a pending list. Authorised user approves. -- Re-instatement is posted as an Adjustment. -- The expired bucket balance is set to 0. -- If a bucket with the new Expiry Date already exists, the amount is added to it. -- Otherwise, a new bucket is created with the new Expiry Date. - -## Post-Conditions -- Balances updated and logged as adjustments. - -## Exception Flow -- Rejected by TP validation or block code. diff --git a/docs/specs/customer_management/statement.md b/docs/specs/customer_management/statement.md deleted file mode 100644 index 5f418e4..0000000 --- a/docs/specs/customer_management/statement.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Statement" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Statement - -## Requirement Definition -Provides a list of all transactions for an account/customer over a set period (usually monthly). Includes earned, redeemed, adjusted points, beginning/ending balances, and expired points. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Statement Enquiry" module. - -## Business Rules - -### Data Schema - -#### Statement Summary -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Loyalty Account Number | Identifier. | String | Read-only. | -| Product Account Number | Identifier. | String | Read-only. | -| Pool ID | Statement Pool. | String | Read-only. | -| Cycle Start Date | Previous statement cycle start. | Date | Read-only. | -| Statement Opening Balance | Previous points balance. | Decimal | Read-only. | -| Total Award | Earned points in cycle. | Decimal | Read-only. | -| Total Redeem | Redeemed points in cycle. | Decimal | Read-only. | -| Total Adjust | Adjusted points in cycle. | Decimal | Read-only. | -| Statement Closing Balance | Accumulated points at cycle end. | Decimal | Read-only. | -| Expired Points | Balance in expired but not forfeited buckets. | Decimal | Read-only. | -| Cycle Statement Date | Generation date. | Date | Read-only. | - -#### Transaction Detail -Lists transactions within the cycle. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Reference Number | OLS Reference Number. | String | Read-only. | -| Transaction Type | Award, Redeem, Adjust. | Enum | Read-only. | -| Unit | Earned/Redeemed/Adjusted points. | Decimal | Read-only. | -| Post Date | Post Date. | Date | Read-only. | -| Transaction Date | Transaction Date Time. | Date | Read-only. | - -### Execution -- **View-only screen.** Records are updated by OLS batch jobs. -- Output supports Customer and Account level, but stored under Account level. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/transaction_history.md b/docs/specs/customer_management/transaction_history.md deleted file mode 100644 index 620016f..0000000 --- a/docs/specs/customer_management/transaction_history.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Transaction History" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Transaction History - -## Requirement Definition -Provides a running record of all transactions logged in OLS for a customer, including cancellations, over a configurable period (normally the last 12 months). - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Transaction History" module. - -## Business Rules - -### Data Schema - -#### Transaction Detail -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Invoice No | Internal invoice No generated by OLS. | String | Read-only. | -| Reference No | OLS Transaction Reference Number. | String | Read-only. | -| Source Reference Number | Reference number from source system. | String | Read-only. | -| OLS Transaction Code | OLS Transaction Code. | String | Read-only. | -| Gross Amount | Gross transaction amount. | Decimal | Read-only. | -| Nett Amount | Nett transaction amount. | Decimal | Read-only. | -| Redeem Points | Total redeem points. | Decimal | Read-only. | -| Points Redeemed Amount | Total redeem points amount. | Decimal | Read-only. | -| Adjust Points | Total adjustment points. | Decimal | Read-only. | -| Points Adjustment Amount | Total adjust point amount. | Decimal | Read-only. | -| Award Points | Total award points. | Decimal | Read-only. | -| Points Awarded Amount | Total award point amount. | Decimal | Read-only. | -| Transaction Date | Transaction Date Time. | Date | Read-only. | -| Post Date | Post Date. | Date | Read-only. | -| Settlement Date | Settlement Date. | Date | Read-only. | -| Cancellation Indicator | Cancellation Indicator. | Boolean | Read-only. | -| MCC | Transaction MCC Code. | String | Read-only. | -| Store | Transaction Store ID. | String | Read-only. | -| Terminal | Transaction Terminal ID. | String | Read-only. | -| Transaction Description | Transaction Description. | String | Read-only. | - -#### Quick View Details (Right Panel) -Provides a breakdown of the transaction into its component effects. - -**Reward Details** (Award/Redeem/Adjust) -- Campaign Rule triggered. -- Transaction Type. -- OLS Transaction Code. -- Reward Pool. -- Pool Unit / Amount. - -**Counter Transaction Detail** -- Campaign Rule triggered. -- Counter updated. -- Entity level. -- Counter Value. -- Bucket Number, Start Date, End Date. - -**Item Redemption Detail** -- Item, Description. -- Redeemed Quantity, Redeemed Points, Cash Amount Used. - -### Execution -- **View-only screen.** -- Represents all successful transaction impacts on balances, counters, and redemptions. - -## Exception Flow -- N/A diff --git a/docs/specs/customer_management/transfer_balance.md b/docs/specs/customer_management/transfer_balance.md deleted file mode 100644 index 40a5c1a..0000000 --- a/docs/specs/customer_management/transfer_balance.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Transfer Balance" -type: OpenSpec -status: Draft -domain: Customer Management ---- - -# Transfer Balance - -## Requirement Definition -Allows manual transfer of points from a customer/account to another customer/account (External) or between the customer's own accounts (Internal). - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Transfer Balance" module. -- Requires Maker-Checker approval. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Transfer Mode | Internal (self) or External (to another). | Enum | Required. | -| Transfer Type | Entity type to transfer from (Card, Account, Client). | Enum | Required. | -| From | Card/Account/CIF Number to transfer from. | String | Required. | -| To | Card/Account/CIF Number to transfer to. | String | Required. | -| Pool ID | The pool from which to transfer. | Enum (Lookup) | Required. Must respect "From" entity level. | -| Store | The store where transaction is logged. | Enum (Lookup) | Required. | -| Amount to Transfer | Amount. | Decimal | Required. > 0. Defaults to whole pool balance. | -| Expiry Date | Expiry date of transferred points. | Date | Required. Defaults to source expiry date. | -| Transaction Code | OLS transaction code. | Enum (Lookup) | Required. | -| Reason Code | Pre-defined reason for transfer. | Enum (Lookup) | Required. Determines GL posting accounts. | -| Remarks | Additional remarks. | String (100) | Optional. | - -### Execution -- **Pending/Approve Flow**: Goes to a pending list. Authorised user approves. -- OLS validates status, block codes, and permissions for both "From" and "To". -- Rejected if "From" pool balance is insufficient. -- Execution transfers all linked pools directly from "From" to "To". -- Logged as a negative Adjustment on "From" and positive Adjustment on "To". - -## Post-Conditions -- Pool balances updated. - -## Exception Flow -- Insufficient balance, TP validation failures, or input errors block the action. diff --git a/docs/specs/introduction/terminology.md b/docs/specs/introduction/terminology.md deleted file mode 100644 index 544b0fa..0000000 --- a/docs/specs/introduction/terminology.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "Terminology" -type: OpenSpec -status: Draft -domain: Introduction ---- - -# Terminology - -This document defines the terms used across the OLS (One Loyalty System) modules. - -## Term Definitions - -| Term | Definition | -|---|---| -| Amount vs Quantity | - **Amount**: Used in connection with monetary amounts (e.g., Dollars). For example, "Transaction Amount".
- **Quantity**: Refers to the number of units of an entity, not monetary value. For example, "Award Quantity" or "Redeem Quantity". | -| Pool Balance Bucket (Bucket) | Used in the context of a Reward Pool Bucket. A bucket is determined based on the pool entity level and expiration date. | -| Bucket Expiry Date | - If used in the context of a Counter, refers to the Counter Expiry.
- If used in the context of a Reward Pool Bucket, refers to the Pool Expiry. | -| Campaign Rule (Rule) | A business rule defining the conditions under which a reward will be given, including the type and quantity of the reward. It includes **Rule Criteria** and **Rule Formula**. | -| CEP | **Counter Extract & Process**. A module for setting up job requests to extract a specified counter based on criteria and using the counter value as a transaction amount to process against Campaign Rules. Includes batch processes to execute requests. | -| Contributor | Identifies an entity which funds the rewards given under a specific Rule. One or more Contributors can be set up. **Rule Contributor Settings** define the percentage billed to each Contributor (totaling 100%). Default is the transacting business entity if only one exists. Used in end-of-day settlement reports. | -| Counter | Used to track a customer's transaction statistics (e.g., spend frequency, spend total for specific criteria like MCC). Periodic counts (e.g., monthly) are tracked in separate **Counter Buckets** with a specific **Counter Bucket Date**. | -| Effective Period | Defines a Start Date and End Date range during which a parameter is effective. Generally starts at 00:00:00 and ends at 23:59:59. Time is considered a discrete quantity in seconds. | -| Expiry Policy | Defines how rewards expire. New policies based on Card Types will be supported. | -| Formula | Defines the calculation formula used for calculating the reward quantity. Comprises:
- **Formula Header**: General parameters (e.g., max reward amount, rounding rules, Gross vs Nett amount).
- **Formula Detail**: Specific calculations, each with an Execution Sequence number (executed in descending order). | -| Gross Amount | The payment amount before any reward deduction. | -| Pool (Reward Pool) | Tracks each type of reward (e.g., points, coupons). Associated with a **Pool Expiry Policy**. Rewards expiring on a given date are tracked in a **Pool Bucket** with a **Bucket Expiry Date**. | -| REP | **Redeem, Extract and Process**. A module for setting up requests to redeem a specified Pool based on criteria, and to output the redemption transaction details. | -| Rule Criteria | Defines the conditions to be met for a rule to apply. | -| Rule Pool | A Reward Pool which is updated with the results of a Rule Formula. Each Rule is associated with one Rule Pool. | -| Transaction Amount | Mandatory column in OLS for award processing. Used as the principal quantity for reward calculations. For payment transactions:
- **Gross Amount**: Total payment amount.
- **Nett Amount**: Amount remaining after offsetting with redeemed rewards. (Logged in OLS as Gross Amount). | -| OLS Transaction Code (TC) | The key used to locate applicable Rules for a transaction record. If no Rule is linked to a TC, no reward calculation occurs. Must be defined in the TC look-up table. | - -## Document Structure Reference -The standard modules defined across the system include: -1. Introduction -2. OneAccess -3. Customer Management -4. Campaign Management -5. OneCatalogue -6. OneMarketing -7. OneTargeting diff --git a/docs/specs/oneaccess/permission_management.md b/docs/specs/oneaccess/permission_management.md deleted file mode 100644 index 7580d0e..0000000 --- a/docs/specs/oneaccess/permission_management.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Permission Management" -type: OpenSpec -status: Draft -domain: OneAccess ---- - -# Permission Management - -## Requirement Definition -The Permission Management module is used to maintain Access Rights Groups. It defines: -1. Which modules and functions can be accessed by users in a group. -2. Which applicable actions (Add, Change, View, Delete, Approve/Reject, Copy, View History, Save as Template) can be performed by users in each function within each module. - -## Process Flow - -### Trigger -- A new user group is defined, requiring permission assignment. - -### Pre-Conditions -- Users must have access rights to the Permission Management module to view, add, or edit permission records. - -## Business Rules -- The system checks and displays available modules/functions for each user based on: - - **A**: Permissions assigned directly to the user. - - **B**: Permissions assigned to the user's permission group. - - **Total User Permission (C)** = Combination of A and B. - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Role | The unique identifier of the permission group. | String (10) | Required. | -| Role Name | Text describing the Permission Group Name. | String (100) | Required. | -| Permission Type | The type of permission assignment. | Enum | Required. Values: Particular User, User Group. | -| User | Select one or more users for this role. | Array of User IDs | Required if Permission Type is "Particular User". | -| User Group | Select one group for this role. | String (User Group ID) | Required if Permission Type is "User Group". | -| Description | Text describing the Role. | String (200) | Optional. | - -#### Module Permissions -*A hierarchy of modules containing the list of available functions (Top-level and Second-level modules).* - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| View | Allows viewing data available in the function. | Boolean | | -| Create | Allows creating data in the function. (Includes "Save as draft" implicitly). | Boolean | | -| Edit | Allows updating data in the function. | Boolean | | -| Delete | Allows deleting data in the function. | Boolean | | -| Copy | Allows copying available data in the function. | Boolean | | -| Approve | Allows approving/rejecting data in the function. | Boolean | | -| History | Allows viewing data history (activity log). | Boolean | | -| Template | Allows saving records as a template. | Boolean | | - -#### Access Rights Fields (Field-Level Permissions) -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| View | Allows viewing the specific field on the screen. | Boolean | | -| Editable | Allows modifying the value of the specific field. | Boolean | | - -## Post-Conditions -- Records are automated for approval upon creation/modification. - -## Exception Flow -- If input data fails validation, the action is canceled, and the operation fails. diff --git a/docs/specs/oneaccess/user_group.md b/docs/specs/oneaccess/user_group.md deleted file mode 100644 index 7902cb1..0000000 --- a/docs/specs/oneaccess/user_group.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "User Group" -type: OpenSpec -status: Draft -domain: OneAccess ---- - -# User Group - -## Requirement Definition -The User Group module is utilized to categorize users who share identical permissions within OLS. It defines the group to be assigned to a particular user or group of users. - -## Process Flow - -### Trigger -- A new user group needs to be defined. -- An existing user group needs to be modified, or a user needs to review the existing group. - -### Pre-Conditions -- Users must have access rights to the User Group module to view, add, or edit user group records. - -## Business Rules -- The user group ID must be a unique value. - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| User Group ID | The identity of the user group. | String (10) | Required. Must be unique. | -| User Group Name | The name of the user group. | String (100) | Required. | -| Description | Description for the user group. | String (200) | Optional. | - -#### Group Users (View Only) -*Lists all active User Profile records assigned to this group.* - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| User ID | The identity of the user belonging to the chosen group. | String | Read-only | -| User Name | The name of the user. | String | Read-only | -| Email | Email address of the user. | String | Read-only | - -## Post-Conditions -- The data is updated in the database and related screens. - -## Exception Flow -- If input data fails validation, the action is canceled, and the operation fails. diff --git a/docs/specs/oneaccess/user_profile.md b/docs/specs/oneaccess/user_profile.md deleted file mode 100644 index a7150f3..0000000 --- a/docs/specs/oneaccess/user_profile.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "User Profile" -type: OpenSpec -status: Draft -domain: OneAccess ---- - -# User Profile - -## Requirement Definition -The User Profile defines user attributes and sets the date and time allowing user access to system functions. It is used for login. Upon logging in, users can view a list of functions with specific operations set in the permission management section. - -## Process Flow - -### Trigger -- A new account needs to be defined. -- Information of an existing account needs to be updated. - -### Pre-Conditions -- Users must have access rights to the User Profile module to view, add, or edit User Profile records. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| User ID | Unique user identifier. | String (10) | Required. Must be unique. | -| User Name | Name of the user associated with the User ID. | String (50) | Required. | -| Password | User password. | String (50) | Required for new users. Must meet strong password policies. | -| Re-enter Password | Confirmation of the password. | String (50) | Must match Password. | -| Email | User's email address. Can be used for login and password resets. | String (100) | Required. Must be unique. | -| Default Language | Determines the language for screen labels. | Enum | Required. | - -#### Access Detail -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Access Day | Indicates the days of the week the user has access to the system. | Array of Enums | Required. (e.g., Monday-Sunday) | -| Access Time | The time on and after which the user has access to the system on allowed days. | Time | Required. | -| User Profile Effective From Date | Date on and after which the User Profile is effective. | Date | Required. | -| User Profile Effective End Date | Date on and before which the User Profile is effective. | Date | Required. | -| User Group | The selected group determining the functions the user can access. | String (User Group ID) | Required. | -| Report Access Right | Determines which report(s) the user has access to. | String (Report Group ID) | Optional. | -| User Status | Status of the user account. | Enum | Required. Values: Active, Blocked. | - -#### User Permission (View Only) -*Displays all permissions applicable for the chosen user across top-level and second-level modules.* - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Module Name | The name of the module. | String | Read-only | -| Permissions | Available actions (View, Create, Edit, Delete, Copy, Approve, History, Template). | Boolean per action | Read-only | - -## Post-Conditions -- When creating a new record, the user account is successfully created. -- The new user receives an email notification with login instructions and a temporary password. -- When the password is reset, an email notification is sent to the user's email with the new password. - -## Exception Flow -- No specific exception flow defined. diff --git a/docs/specs/oneadmin/framework_behavior.md b/docs/specs/oneadmin/framework_behavior.md deleted file mode 100644 index 423100c..0000000 --- a/docs/specs/oneadmin/framework_behavior.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "OneAdmin Framework Behavior" -type: OpenSpec -status: Draft -domain: OneAdmin ---- - -# OneAdmin Framework Behavior - -## Requirement Definition -OneAdmin is the application framework upon which all OLS administration functions are built. It defines the standard behavior for data maintenance, record lifecycle states, search capabilities, and audit trailing across all modules (e.g., Campaign Management, Customer Management, Catalogue). - -## Business Rules - -### Maintenance Actions -The framework supports the following standard maintenance actions across modules: -- **Add**: Creates a new record in a Pending state. -- **Edit**: Modifies an existing record. The modifications are saved as a new version in a Pending state, leaving the original active record unchanged until approval. -- **Copy**: Duplicates an existing record, prompting the user to update unique key values. -- **Delete**: Marks a record for deletion (Inactive). The deletion request creates a Pending state version. -- **Approve**: Transitions a Pending record to Active state. The approving user must have appropriate approval rights and cannot be the user who submitted the change. -- **Reject**: Transitions a Pending record to a Rejected state for follow-up. -- **Save as Draft**: Temporarily saves the record without publishing it to a Pending state. -- **Save as Template**: Saves the record details to be reused as a template. -- **History**: Retrieves previous versions of a record. - -### Record State Transitions -1. **Pending**: When a new record is added, edited, or deleted, the action results in a Pending state. -2. **Active**: Upon approval, a Pending record becomes Active. Only Active records are considered during transaction processing. -3. **Rejected**: If an approver rejects a Pending record, its state becomes Rejected. -4. **Inactive**: An approved deletion sets the record to Inactive, blocking it from further use. - -### Search and Filtering Capabilities -- **Quick Search**: Keyword-based search applied to all character columns using a case-insensitive "Contains" operator. -- **Advanced Filter**: Allows compound criteria using AND logic. Supported operators vary by data type: - - **Character**: Equal, Not Equal, Empty, Not Empty, Contains, Not Contains, In, Not In. - - **Number**: Equal, Not Equal, Greater Than, Less Than, Greater Than Or Equal To, Less Than Or Equal To, Between. - - **Boolean**: Equal. - - **DateTime**: Equal, Not Equal, Greater Than Or Equal To, Less Than Or Equal To, Between. - -### Audit Logging -Every record update or approval is logged. The following audit fields are maintained for all records: -- **Last Updated By**: User ID (or Batch ID) that last updated the record. -- **Last Updated Date**: Date and time of the last update. -- **Last Approved By**: User ID that last approved the record. -- **Last Approved Date**: Date and time of the last approval. - -## Post-Conditions -- All updates are reflected in the database immediately upon approval. -- Concurrent edits and approvals are strictly logged and version-controlled. diff --git a/docs/specs/onecatalogue/catalogue.md b/docs/specs/onecatalogue/catalogue.md deleted file mode 100644 index dbc7d8e..0000000 --- a/docs/specs/onecatalogue/catalogue.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: "Catalogue" -type: OpenSpec -status: Draft -domain: OneCatalogue ---- - -# Catalogue - -## Requirement Definition -A Catalogue groups items for online redemptions (e.g., Cash-back rebates, frequent flyer miles, merchant vouchers). All items included in the Catalogue must be tagged with a specific Catalogue Code. The system supports multiple concurrent catalogues, each with its own Item Master records. - -## Process Flow - -### Pre-Conditions -- Users must have access rights to the "Catalogue" screen under the "OneCatalogue" module. -- Depending on access rights, users can view, add, edit, or approve catalogue records. - -## Business Rules -- Each Catalogue operates within a Start / End date range. -- Items are only presented to customers if the current date falls within the Catalogue's effective date range. - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Catalogue Code | User-specified code identifying the catalogue. Used by front-end systems. | String (10) | Required. | -| Description | A description of this catalogue. | String (50) | Required. Default description if no specific language is chosen. | -| Effective From Date | Date from which the catalogue is effective. | Date | Required. | -| Effective To Date | Date until which the catalogue is effective. | Date | Required. | -| Icon | Icon of the catalogue. | Image | Optional. | - -#### Content Configuration -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Language | Selected language for specific description setup. | String (Lookup) | Required. | -| Description | Description of the catalogue in the chosen language. | String (100) | Required. | - -## Post-Conditions -- The Catalogue information is returned to the front-end during Item Enquiry responses for searching. - -## Exception Flow -- None specified. diff --git a/docs/specs/onecatalogue/category.md b/docs/specs/onecatalogue/category.md deleted file mode 100644 index bd27b76..0000000 --- a/docs/specs/onecatalogue/category.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Category" -type: OpenSpec -status: Draft -domain: OneCatalogue ---- - -# Category - -## Requirement Definition -A Category is a logical group within a catalog that organizes items. Multiple Categories can be linked to form a hierarchy, which is utilized on the Member site. - -## Process Flow - -### Pre-Conditions -- Users must have access rights to the "Category" screen under the "OneCatalogue" module. -- Depending on access rights, users can view, add, edit, or approve category records. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Category Code | User-specified code identifying the category. | String (10) | Required. | -| Description | Default description of this category. | String (100) | Required. | -| Effective From Date | Date from which the category is effective. | Date | Optional. If empty, non-expiring. | -| Effective To Date | Date until which the category is effective. | Date | Optional. | -| Parent Category | Identifies the parent category to form a hierarchy. | String (Lookup) | Optional. | -| Display Ordering | Ordering sequence on the Member Site. | Integer | Optional. | -| Icon | Icon of the category. | Image | Optional. | -| Image Group | Selected image group. | String (Lookup) | Optional. | -| Image | Selected image from Image Stock. | String (Lookup) | Required if Image Group is selected. | - -#### Content Configuration -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Language | Selected language for specific description setup. | String (Lookup) | Required. | -| Description | Description of the category in the chosen language. | String (100) | Required. | diff --git a/docs/specs/onecatalogue/item_master.md b/docs/specs/onecatalogue/item_master.md deleted file mode 100644 index a8dc9ae..0000000 --- a/docs/specs/onecatalogue/item_master.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Item Master" -type: OpenSpec -status: Draft -domain: OneCatalogue ---- - -# Item Master - -## Requirement Definition -Item Master defines details about a particular item, such as prices, quantities, availability dates, terms, and conditions. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Item Master" screen under the "OneCatalogue" module. -- Depending on access rights, users can view, add, edit, or approve Item Master records. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Catalogue Code | The Catalogue for which this item is configured. | String (Lookup) | Required. | -| Category | Category under which this item is tagged. | Array of Strings (Lookup) | Optional. | -| Item Code | Identifier for the item to be added. | String (10) | Required. | -| Item Name | Short description used by customer-facing application. | String (50) | Required. | -| Redemption From Date | Date from which the item is available for redemption. | Date | Required. Must fall within Catalogue/Category date range. | -| Redemption To Date | Date until which the item is available. | Date | Required. Must fall within Catalogue/Category date range. | -| Redemption Store | Supplier/merchant of this item. | String (Lookup) | Optional. | -| Redemption Transaction Code | OLS TC used for redemption processing. | String (Lookup) | Required. | -| Award Transaction Code | OLS TC used to locate award campaign rules upon redemption. | String (Lookup) | Optional. | -| Item Type | Type of item. | Enum | Required. Values: Miles, Physical, eVoucher, Donation, Cash rebate, Other. | -| Voucher Code | Selected voucher code. | String (Lookup) | Required if Item Type is eVoucher. | -| Face Value | Value of the cash rebate/voucher/miles that customer receives. | Decimal (14,2) | Required for Cash rebate/eVoucher/Miles. Must be positive. | -| Display on Member Site | Determines if the item is displayed on the member site. | Boolean | Default: True. | -| Hot Item | Indicates if this is a hot item. | Boolean | Active only if Display on Member Site is True. Default: False. | -| Display Ordering | Ordering sequence to display on member site. | Integer | Must be > 0. Active only if Display on Member Site is True. | -| Track Quantity on Hand | Enables inventory control. | Boolean | Default: False. Forced to True if item is a Voucher Code. | -| Initialize Quantity of Stocks | Initial stock quantity. | Integer | Required if Track Quantity on Hand is True. Read-only if item has been redeemed. | - -#### Item Detail (Localization) -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Language | Selected language. | String (Lookup) | Required. | -| Item Name | Specific item name in the chosen language. | String (50) | Required. | -| Item Description | Specific item description. | String (100) | Optional. | -| Item Content | Detailed content/information. | String (2000) | Optional. | -| How to use | Instructions on how to use the item. | String (2000) | Optional. | -| Term and Condition | Free text for Terms and Conditions. | String (2000) | Optional. | - -#### Contact and Address Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| City | City where the item can be used. | String (Lookup) | Required. | -| Address | Detailed address. | String (200) | Optional. | -| Email | Contact email. | String (100) | Optional. | -| Phone | Contact phone number. | String (20) | Optional. | - -## Post-Conditions -- The newly created item should have all required fields populated with valid data. -- System adds/updates items in the database. -- Other screens looking up the item screen can use the new item. diff --git a/docs/specs/onecatalogue/item_price.md b/docs/specs/onecatalogue/item_price.md deleted file mode 100644 index 45db9a8..0000000 --- a/docs/specs/onecatalogue/item_price.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Item Price" -type: OpenSpec -status: Draft -domain: OneCatalogue ---- - -# Item Price - -## Requirement Definition -Item Price specifies the conversion rate between reward points and redemption quantity, defining pricing tiers based on account types, redemption channels, or specific criteria. It manages redemption options (points only vs. cash and points). - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Item Master" and "Item Price" screens under the "OneCatalogue" module. -- Depending on access rights, users can view, add, edit, or approve Item Price records. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Item Code | The item being configured. | String (Lookup) | Required. | -| Price Code | Identifier of the item price. | String (10) | Required. | -| Price Name | Default name of the price. | String (100) | Required. | -| Effective Start Date | Start date of the price validity. | Date | Required. | -| Effective End Date | End date of the price validity. | Date | Required. | -| Redemption Channel | Channel applicable for this price (e.g., Call Center, Mobile App). | String (Lookup) | Required. | -| Account Type Group | Account Type Group this price applies to. | Array of Strings (Lookup) | Optional. Mutually exclusive with Account Level/Type. | -| Product Account Level | Account Level this price applies to. | String (Lookup) | Optional. Mutually exclusive with Account Type Group. | -| Product Account Type | Account Type this price applies to. | Array of Strings (Lookup) | Optional. Mutually exclusive with Account Type Group. | -| Redemption Pool | Pool from which to deduct points. | String (Lookup) | Required. | -| Use Only Points from Selected PA Type | Restrict points usage to the selected Account Type/Group. | Boolean | Default: False. | -| Face Value | The value the customer receives upon redemption. | Decimal (12,2) | Must be > 0. | -| Price in Point | Price if paid fully in points. | Decimal (12,2) | Must be > 0. | -| Original Price | The original price of the item (for reference). | Decimal (12,2) | Must be > 0. | -| Partial Redemption Allowed | Allows a mix of points and cash for redemption. | Boolean | Default: False. | -| Minimum Partial Redeem Points | Minimum points customer must use for partial redemption. | Decimal (12,2) | Required if Partial Redemption is Allowed. Must be >= 0. | -| Cash per Point | Cash amount required to substitute one point during partial redemption. | Decimal (12,2) | Required if Partial Redemption is Allowed. Must be > 0. | -| Applicable Taxes | Tax rate applicable. | String (Lookup) | Optional. | - -#### Price Detail (Localization) -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Language | Selected language. | String (Lookup) | Required. | -| Item Price Name | Specific name of chosen language. | String (100) | Required. | -| Description | Description of the price. | String (500) | Optional. | - -#### Item Criteria -- Utilizes the Query Builder logic. Criteria groups can be combined using logical OR/AND operators. -- Applicable criteria are tagged specifically for the "Item Price" module. diff --git a/docs/specs/onecatalogue/voucher_code.md b/docs/specs/onecatalogue/voucher_code.md deleted file mode 100644 index 64b8591..0000000 --- a/docs/specs/onecatalogue/voucher_code.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Voucher Code" -type: OpenSpec -status: Draft -domain: OneCatalogue ---- - -# Voucher Code - -## Requirement Definition -Voucher Codes manage external partner vouchers distributed to customers. Vouchers are imported or generated with specific codes, valid periods, and serial numbers. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Voucher Management" screen under the "OneCatalogue" module. -- Depending on access rights, users can view, add, edit, or approve Voucher records. - -## Business Rules -- Voucher codes cannot be deleted if any associated voucher serial number has been redeemed. - -### Data Schema - -#### Voucher Statistic (View Only) -| Field Name | Description | Logic Type | -|---|---|---| -| Total Voucher | Total serial numbers under this voucher code. | Integer | -| Available Vouchers | Total valid, non-expired, ready-to-use vouchers. | Integer | -| Redeemed Vouchers | Total successfully redeemed vouchers. | Integer | -| Cancelled Vouchers | Total failed redemptions canceled by customers/system. | Integer | -| Expired Vouchers | Total expired vouchers not redeemed. | Integer | - -#### Voucher Code Detail -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Voucher Code | Identifier of the voucher. | String (10) | Required. | -| Description | Description of the voucher. | String (100) | Optional. | -| Supplier | Partner issuing the voucher. | String (Lookup) | Optional. | -| Expiry Policy | Determines how the voucher expires. | Enum | Required. Values: Fixed Date, N days from Transaction Date, N days from Post Date, N Months from Transaction Date, N months from Post Date. | -| Expiry Date | The absolute expiry date. | Date | Required if Expiry Policy is "Fixed Date". | -| N Param | Parameter N for relative expiry policies. | Integer | Required if Expiry Policy requires N parameter. Must be >= 0. | -| Generate Voucher | Indicates if OLS generates the voucher (instead of partner upload). | Boolean | Default: False. Read-only if voucher is redeemed. | -| Quantity | Number of voucher codes to generate. | Integer | Required if Generate Voucher is True. Read-only if voucher is redeemed. | -| This is a promo code | Indicates if this is a promo code. | Boolean | Default: False. | -| Promotion Type | Type of discount. | Enum | Required if This is a promo code is True. Values: Fixed Percentage Discount, Fixed Monetary Value Discount, Cashback Voucher, Gift Voucher. | -| Value | The specific value of the discount. | Decimal (14,2) | Required if Promotion Type is Fixed Monetary Value or Fixed Percentage. Must be > 0. | - -#### Voucher Detail (View Only) -*Displays specific serial numbers assigned to the Voucher Code.* - -| Field Name | Description | Logic Type | -|---|---|---| -| Voucher Code | The associated voucher code. | String | -| Voucher No | The serial voucher number. | String | -| Redemption Date | Date when voucher is redeemed. | Date | -| Expiry Date | Expiry date of the serial number. | Date | -| Redemption Indicator | Yes or No. | Boolean | -| Fulfillment Status | New, Issued, Fulfilled, Cancelled, Rejected. | Enum | diff --git a/docs/specs/onemarketing/ab_testing.md b/docs/specs/onemarketing/ab_testing.md deleted file mode 100644 index ec9e166..0000000 --- a/docs/specs/onemarketing/ab_testing.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "A/Bn Testing" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# A/Bn Testing - -## Requirement Definition -Evaluates and optimizes marketing elements (content or target customers) to identify better performing campaigns. Supports A/Bn Content testing (same target, different messages) and A/Bn Target Customer testing (same message, different targets). - -## Process Flow - -### Pre-Conditions -- Third-party data/results must be available for OLS to collect and analyze. -- Users must have access rights in the "A/Bn Testing" module. - -## Business Rules - -### Data Schema (A/Bn Message Content Testing) - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Unique identifier. | String (20) | Required. No special characters. | -| Campaign Description | Description. | String (100) | Optional. | -| Effective Date From | Start date. | Date | Optional. | -| Effective End date | End date. | Date | Required. | -| Message Channel | SMS, Email, Push. | Enum | Required. | -| Target Customer | OMR Criteria setup for targeting. | Rule | Required. | -| Variant Content | Multiple variants (A, B, N) defining content based on channel. | Array of Messages | Required. Must be unique within the campaign. | -| Run Schedule | Schedule parameters. | Complex | Required. | - -### Data Schema (A/Bn Target Customer Testing) - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Unique identifier. | String (20) | Required. No special characters. | -| Campaign Description | Description. | String (100) | Optional. | -| Effective Date From | Start date. | Date | Optional. | -| Effective End date | End date. | Date | Required. | -| Variant Target Customer | Multiple variants (A, B, N) defining OMR Criteria. | Array of Rules | Required. Must be unique within the campaign. | -| Run Schedule | Schedule parameters. | Complex | Required. | - -### Execution -- ABn batch job triggers effective testing requests based on schedule. -- For content testing, sends variant messages to the same subset of targets. Tracks open rates, click-through rates. -- For target testing, evaluates which criteria setup reaches the most/best customers. - -## Post-Conditions -- Results are reported back to the user to make data-driven decisions on campaign rollout. diff --git a/docs/specs/onemarketing/blacklist.md b/docs/specs/onemarketing/blacklist.md deleted file mode 100644 index 3013f8e..0000000 --- a/docs/specs/onemarketing/blacklist.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Blacklist" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# Blacklist - -## Requirement Definition -A list of customers excluded from marketing campaigns for strategic reasons (e.g., fraud). - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Black List" module. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| ID | Blacklist identifier. | String (10) | Required. | -| Name List | Name of the blacklist. | String (50) | Required. | -| Description | Description. | String (200) | Optional. | -| Input Type | Input from screen or Upload file. | Enum | Required. | -| Customer List | List of selected CIF numbers. | Array of Strings (Lookup) | Required if Input Type is "Input from screen". Requires >= 4 digits to search. | -| Upload File | Uploaded CSV/XLS file. | File | Required if Input Type is "Upload file". Max 50MB. | - -### Execution -- Users can review or download the customer list. -- Blacklisted customers are strictly blocked from receiving notifications from OMR. - -## Exception Flow -- Validation errors for file type/size during upload display an error message. diff --git a/docs/specs/onemarketing/frequency_capping.md b/docs/specs/onemarketing/frequency_capping.md deleted file mode 100644 index bede0b3..0000000 --- a/docs/specs/onemarketing/frequency_capping.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "Marketing Frequency Cap" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# Marketing Frequency Cap - -## Requirement Definition -Controls the frequency and volume of notifications delivered to customers to prevent overwhelming them. Caps can be set daily, weekly, or monthly per customer across different channels. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Frequency Capping" module. - -## Business Rules - -### Data Schema - -#### Edit Mode Configuration -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Frequency Cap Id | Record identifier. | String (10) | Required. | -| Notification Channel | SMS, Email, or Push Notifications. | Enum | Required. | -| Effective Date From | Start date of the cap. | Date | Required. Only one effective cap per channel at any given time. | -| Effective Date To | End date of the cap. | Date | Required. | -| Capping Period | Daily, Weekly, or Monthly. | Enum | Required. Each period must have only one cap value. | -| Maximum number | Max messages per unique customer. | Integer (12) | Required. | -| Include Whitelist | Disallows/allows whitelist customers to receive more notifications. | Boolean | Default: False. | -| Customer list | Selected whitelist customers to ignore rules. | Array of Strings (Lookup) | Required if Include Whitelist is True. | -| Description | Description of the capping. | String (100) | Optional. | - -### Execution -- Frequency Capping is applied to all marketing campaigns at the customer level. -- System automatically tracks notification counts per customer per channel and period unit. -- If the customer reaches the cap, further notifications are blocked. -- Whitelisted customers are excluded from the frequency cap unless explicitly included. - -## Post-Conditions -- System enforces defined limits during OMR batch processing. diff --git a/docs/specs/onemarketing/marketing_campaign.md b/docs/specs/onemarketing/marketing_campaign.md deleted file mode 100644 index e866b6c..0000000 --- a/docs/specs/onemarketing/marketing_campaign.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Marketing Campaign (OneMarketing Request)" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# Marketing Campaign (OneMarketing Request) - -## Requirement Definition -Filters target customers that satisfy specific marketing criteria. Triggers either notification messages or reward campaigns (via OLS Transaction Code) for the target customers. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Marketing Request" module. -- Depending on rights, users can view, add, edit, or approve requests. -- All OMR criteria must be defined as attributes. - -## Business Rules - -### OMR Criteria Logic -- Uses Query Builder for marketing criteria. -- Criteria can be dragged/dropped from the right panel. -- Supports AND/OR conditions between criteria groups. -- Introduces NOT toggle for exclusion criteria. - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Request ID | Unique identifier. | String (20) | Required. No special characters. | -| Description | Description. | String (100) | Required. | -| Effective Date From | Start date. | Date | Required. | -| Effective Date To | End date. | Date | Required. | -| Marketing Function | Notification [N] or Trigger Campaign Rule [TCR]. | Enum | Required. | - -#### Run Schedule and Message Content -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Trigger Method | Schedule or Event trigger. | Enum | Required. | -| Run Schedule | Once Time [O], Daily [D], Weekly [W], Monthly [M], Annually [A]. | Enum | Required if Trigger Method is Schedule. | -| Schedule Details | Specific details (e.g., Repeat every, Fixed Date, Time of day). | Complex | Required based on Run Schedule. | -| Business Event | Specific event triggering the request. | Array of Strings (Lookup) | Required if Trigger Method is Event trigger. | -| Message Template | The marketing message to send. | String (Lookup) | Required if Marketing Function is Notification. | -| OLS Transaction Code | TC used to trigger campaign rule. | String (Lookup) | Required if Marketing Function is Trigger Campaign Rule. | - -#### Targeting -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Trigger Method | OMR Criteria or Upload file. | Enum | Required. | -| Targeting Data | The selected OMR criteria setup or the uploaded file. | Rule / File | Required based on Trigger Method. | - -### Batch Job Processing -- OMR job checks effective requests based on processing date. -- Finds valid jobs based on schedule. -- Creates notifications or extracts transactions based on criteria. -- Stops sending when frequency capping limits are reached. - -## Post-Conditions -- Marketing content is sent to target customers, or target customers trigger a Campaign Rule. diff --git a/docs/specs/onemarketing/marketing_message.md b/docs/specs/onemarketing/marketing_message.md deleted file mode 100644 index 9ac4461..0000000 --- a/docs/specs/onemarketing/marketing_message.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Marketing Message" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# Marketing Message - -## Requirement Definition -Manages (CRUD) all message templates used in the system. A Message Template can be built for different channels (SMS, Push Notification, Email). The message can be based on pre-defined parameters or HTML files. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Marketing Message" module. -- Depending on rights, users can view, add, edit, or approve message templates manually. -- OMR criteria must be defined as attributes available in the right panel for drag-and-drop setup. - -## Business Rules - -### Data Schema (SMS Message) - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Message ID | Unique identifier. | String (10) | Required. No special characters. | -| Message Description | Description. | String (100) | Required. | -| SMS Type | Promotion/Marketing or Transaction. | String (Lookup) | Required. | -| Effective Date From | Start date of the effective period. | Date | Required. | -| Effective End Date | End date of the effective period. | Date | Required. | -| SMS Brand Name | Select SMS Sender. | String (Lookup) | Required. | -| Message | Message content. Supports drag/drop parameters. | String (5000) | Required. Unicode (non-GSM). No images, subject, or attachments. | - -### Data Schema (Email Message) - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Message ID | Unique identifier. | String (10) | Required. No special characters. | -| Message Description | Description. | String (100) | Required. | -| Email Type | Promotion/Marketing or Transaction. | String (Lookup) | Required. | -| Effective Date From | Start date of the effective period. | Date | Required. | -| Effective End Date | End date of the effective period. | Date | Required. | -| Use Type | Use Message or Upload Template. | Enum | Required. | -| Sender Name | Name of sender. | String (100) | Required. | -| From Email | Configured email address. | String (100) | Required. | -| Subject | Subject of email. | String (100) | Required. | -| Preview Text | Preheader of Email. | String (100) | Optional. Defaults to first line of content if not provided. | -| Message / Upload File | HTML content or uploaded template file. | String / File | Required based on Use Type. | - -### Data Schema (Push Notification) - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Message ID | Unique identifier. | String (10) | Required. No special characters. | -| Message Description | Description. | String (100) | Required. | -| Notification Type | Promotion/Marketing or Transaction. | String (Lookup) | Required. | -| Effective Date From | Start date of the effective period. | Date | Required. | -| Effective End Date | End date of the effective period. | Date | Required. | -| Message Title | Primary text at the top. | String (50) | Required. | -| Message | Main content. Supports drag/drop parameters. | String | Required. | -| Image Type | Single (No image), Richer (1 image), Carousel (>1 images). | Enum | Required. | -| Upload Image | Images for Richer or Carousel push. | Image / URL | Required if Image Type is not Single. | -| Link URL | URL to navigate to. | String (100) | Required. | - -### Testing Message -- A "Send sample" function exists for all channel types to test the message rendering using a sample phone number, email, or CIF number. - -## Post-Conditions -- All configured messages are available for use in Marketing Request, Campaign Rule, and Item Master. diff --git a/docs/specs/onemarketing/whitelist.md b/docs/specs/onemarketing/whitelist.md deleted file mode 100644 index 8970bf7..0000000 --- a/docs/specs/onemarketing/whitelist.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Whitelist" -type: OpenSpec -status: Draft -domain: OneMarketing ---- - -# Whitelist - -## Requirement Definition -A list of customers who have given consent or shown strong interest and are excluded from standard frequency cap rules, ensuring they receive all communications without limit. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Whitelist" module. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| ID | Whitelist identifier. | String (10) | Required. | -| Name List | Name of the whitelist. | String (50) | Required. | -| Description | Description. | String (200) | Optional. | -| Input Type | Input from screen or Upload file. | Enum | Required. | -| Customer List | List of selected CIF numbers. | Array of Strings (Lookup) | Required if Input Type is "Input from screen". Requires >= 4 digits to search. | -| Upload File | Uploaded CSV/XLS file. | File | Required if Input Type is "Upload file". Max 50MB. | - -### Execution -- Users can review or download the customer list. -- Whitelisted customers bypass frequency capping restrictions by default, unless a specific frequency cap explicitly opts to "Include Whitelist". - -## Exception Flow -- Validation errors for file type/size during upload display an error message. diff --git a/docs/specs/onetargeting/audience_upload.md b/docs/specs/onetargeting/audience_upload.md deleted file mode 100644 index daa96cc..0000000 --- a/docs/specs/onetargeting/audience_upload.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Audience Upload" -type: OpenSpec -status: Draft -domain: OneTargeting ---- - -# Audience Upload - -## Requirement Definition -Provides a module for marketers to manage audience uploads, enabling them to upload customer data for targeted marketing campaigns via file uploads. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the "Audience Upload" module. -- Depending on access rights, users can view, add, edit, or manually approve. - -## Business Rules -- Users can upload customer data for targeted marketing campaigns via file upload (CSV, Excel spreadsheets). -- The system allows users to map data from source files to required platform fields. -- The system validates the uploaded data to ensure all required fields are present and in the correct format. - -### Data Schema - -| Field Name | Description | Data Type | Constraints / Rules | -|---|---|---|---| -| Audience Name | The name of the audience | String (50) | Required. Must be unique in the system. | -| Description | Audience description | String (200) | Optional. | -| File ID | Audience identifier | String (10) | Required. Internal system reference. | -| File Size | The file size of the upload | Numeric | System generated. | -| Upload File | The uploaded file data | File/Binary | Required. Allowed extensions: CSV, XLS, XLSX. Max size: <= 50 MB. | diff --git a/docs/specs/onetargeting/customer_audience.md b/docs/specs/onetargeting/customer_audience.md deleted file mode 100644 index 31c6399..0000000 --- a/docs/specs/onetargeting/customer_audience.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Customer Audience" -type: OpenSpec -status: Draft -domain: OneTargeting ---- - -# Customer Audience - -## Requirement Definition -No requirements defined yet. - -## Business Rules -No business rules defined yet. diff --git a/docs/specs/onetargeting/segmentation.md b/docs/specs/onetargeting/segmentation.md deleted file mode 100644 index 2322c00..0000000 --- a/docs/specs/onetargeting/segmentation.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Segmentation" -type: OpenSpec -status: Draft -domain: OneTargeting ---- - -# Segmentation - -## Requirement Definition -Segmentation is a process to divide a customer base into smaller groups, providing a way to narrow down the target audience based on the types of products or services the customers have previously purchased. This allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. -In the system, a segment is a combination of one or more criteria. The same criteria set may be reused multiple times, allowing an efficient way to set up targeted customers. - -## Process Flow - -### Trigger -- User accesses the OneTargeting Module to create or update a new segment. - -### Pre-Conditions -- Users must have access rights in the Segmentation module. -- Depending on access rights, users can view, add, edit, or manually approve. -- All criteria are defined as attributes and are available for setup. - -## Business Rules -- The OLS system uses Query Builder to build queries for segmentation. -- Business segments target customers using the following criteria combinations: - -### Criteria Matrix - -| Segment Group | Criteria Group | Combination by Following Criteria | Segment Example | -|---|---|---|---| -| Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children (0-14), Youth (15-24), Adults (24-64), Seniors (65+) | -| Demographic Segmentation | Customer Profile | Last Name | | -| Demographic Segmentation | Customer Profile | First Name | | -| Demographic Segmentation | Customer Profile | Income | Income segment: High-Income, Middle-Income, Low-Income | -| Demographic Segmentation | Customer Profile | Gender | Male, Female | -| Demographic Segmentation | Customer Profile | Marital Status | Single, Married | -| Demographic Segmentation | Customer Profile | DOB | Generation segment: Gen Z (1997-2012), Gen Y (1981-1996), Gen X (1965-1980), Gen W (1946-1964) | -| Demographic Segmentation | Customer Profile | Location (Country/State/City/Zip Code) | Geography segment: International, Urban, Suburban, Mountain | -| Demographic Segmentation | Customer Profile | Customer's Tenure | Customer Tenure Segment (based on Registration): New (<1 yr), Early-tenured (1-2 yrs), Mid-Tenured (2-5 yrs), Long-tenured (>5 yrs) | -| Demographic Segmentation | Customer Profile | Account's Tenure | Account Tenure Segment (based on AOD): New (<1 yr), Early-tenured (1-2 yrs), Mid-Tenured (2-5 yrs), Long-tenured (>5 yrs) | -| Demographic Segmentation | Customer Profile | Account's Status | | -| Demographic Segmentation | Customer Profile | Next AOD | | -| Demographic Segmentation | Customer Profile | Customer's status | | -| Behavior Segmentation | Transaction | Last transaction / Integration | Churned customer: Last transaction > 6 months ago and status is active | -| Behavior Segmentation | Transaction | Transaction Frequency | Total number of transactions or Average transaction frequency in a specific period (day/week/month/quarter/year). Segment: High-Value, Medium-Value, Low-Value | -| Behavior Segmentation | Transaction | Customer Recency | When was the last transaction/integration | -| Behavior Segmentation | Transaction | Total spending value | Total net transaction amount | -| Behavior Segmentation | Transaction | Transaction Date | Peak-Time customer (special day, weekend, midnight). Consistent-Time Customers (first day of month). Flexible-Time Customers (specific day) | -| Behavior Segmentation | Transaction | Transaction Time | | -| Behavior Segmentation | Transaction | Merchant (Corporation/Chain/Store/MCC) | Used with another criteria or alone to create specific segments | -| Behavior Segmentation | Transaction | Merchant Group | | -| Behavior Segmentation | Transaction | Transaction Description | | -| Behavior Segmentation | Transaction | Transaction Category | | -| Behavior Segmentation | Transaction | Transaction Gross Amount | | -| Behavior Segmentation | Transaction | Transaction Nett Amount | | -| Flexible Segment | Attribute | Attribute Criteria | | -| Psychographic Segmentation | Item | Favorite Category | Life Style segment, Interest segment, Opinion segment | -| Psychographic Segmentation | Item | Favorite Item | | - -Note: Psychographic segmentation data will be collected from surveys upon OneDisplay implementation. - -## Post-Conditions -- Each segment is used to define the targeting customer in the marketing module. diff --git a/docs/specs/reference/change_history.md b/docs/specs/reference/change_history.md deleted file mode 100644 index 35705b0..0000000 --- a/docs/specs/reference/change_history.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Change History" -type: OpenSpec -status: Draft -domain: Reference ---- - -# Change History - -| Version | Date | Updated By | Change Description | -|---|---|---|---| -| 1.0 | 14/12/2023 | Trangdth, Maivt | The first version including: Customer Management, Campaign Management, Draft OMR module | -| 1.1 | 18/12/2023 | Trangdth | Customer 360: Add more detail for Account/Card information.
Section 5.1: Add filter, Add/update some fields in the screen.
Section 5.5 Card: Update description and logical.
Section 5.9 and 5.10: Update label | -| 1.2 | 20/12/2023 | Trangdth | Update the Pool Conversion Rate module.
Update data type DD/MM/YYYY into "Date" to respect the date time configuration format.
Update the Card logically: Add more detail when updating the card.
Update customer Management module section 5: an update based on Sang's requirement (Customer/Account/dashboard/transaction history/attribute/counter).
Update Vietnamese fields and some cosmetic issues | -| 1.3 | 27/12/2023 | Trangdth | Update customer block data type from X(20) into X(10).
Section 5.4 update the card activation date from mandatory to optional.
Section 5.2.6: Update the logic of most items.
Section 4.7- Pool Conversion Rate: update field name and logic for pool conversion rate.
Section 4.12 Campaign Rule Criteria: Correction some typos and add more detail for txncat criteria.
Pool Definition: remove the item code field (move to Rule setup). Add some validations(red line).
Add CEP rule type | -| 1.4 | 02/01/2024 | Trangdth | Add REP Rule.
Update Pool Definition Screen: screen and logical.
Update Counter Defintion to match with PMS and add more detail. | -| 1.5 | 10/01/2024 | Trangdth | Update API information for REP rule.
Update API information for CEP Rule.
Add document for Formula (UI+ Logical) | -| 1.6 | 16/01/2024 | Trangdth | Add Section 5.15 Awward Transaction Entry Screen.
Update Section 4.8 Counter Definition: Add Late txn posting option. Update logical on post-condition.
Update Pool Defintion: add more detail for ATG field.
CEP/REP: Update API for run schedule | -| 1.7 | 24/01/2024 | Trangdth | Counter definition: Update: Active "First start date is fixed" for "Days from COD" period unit.
Pool conversion rate: Update code from X(03) into X(05).
Card - Update data type and logic for Old Card number. Update the relationship of Account type and Account number.
Add Campaign : Add description for CP module | -| 1.8 | 25/01/2024 | Trangdth | Add section 4.12 Campaign Rule logical for Award/redem/Adjust rule type.
Add section 4.9 Transaction Category module | -| 1.9 | 30/01/2024 | Trangdth | Campaign: change data type and add alidation for Campaign type.
CEP: Update data type for Run schedule and change the sequence order in Layout.
REP: Update data type for Run schedule and change the sequence order in Layout | -| 1.10 | 19/02/2024 | Trangdth | Section 4.17 : CEP : Update API information of following fields: - Account with blocked Card - Post Transactions under PA Account selected based on | -| 1.11 | 21/02/2024 | Trangdth | Section 4.12.6 : Campaign Rule/Business Rule : Update validation of "Apply after Cap value " field | -| 1.12 | 05/03/2024 | Trangdth | Correction typo.
Section 4.13: Rule criteria: Update more detail and req.
Section 5.11 Adjustment : Add field and update logical of quick view | -| 1.13 | 07/03/2024 | Trangdth | Correction typo.
Section 5.11 Adjustment: Update Vietnamese label and correction logical.
Section 5.12 Transfer Balance: Add fields, Update logical, Add User Stories and Accepted Criterions.
Section 5.13 Re-instatement : Add fields, Update logical , Add User Stories and Accepted Criterions | -| 1.14 | 11/03/2024 | Trangdth | 5.2.6.3: Account/Card information: Update logical and data entities.
5.11 Adjust: Add US and AC.
5.12 Award Transaction: Add fields, Update logical , Add User Stories and Accepted Criterions.
5.5 Pool Balance Detail: Correction and Add User Stories and Accepted Criterions | -| 1.15 | 12/03/2024 | Trangdth | Section 4.15 contributor setting: Update data type of "Contributor Percentage" field.
Section 4.14 Campaign Rule formula: Remove validation of F5/Multiplier | -| 1.16 | 20/03/2024 | Trangdth | Section 7: Added OneCatelogue module, including: Item master/ Catalogue/Category/Voucher management.
Section 4.12 Campaign Rule: Added Post-condition for Amount to Use feature (Transaction Processing with Amount to use).
Secttion 4.6 Pool Definition: Remove CP Rule name and change data for "List Of Campaign" listing page. | -| 1.17 | 25/03/2024 | Trangdth | Add section 7.5: Item Price.
Update section 5.14 Item redemption to match onecatalogue logical.
Update quick view of Adjust/transfer balance/Re-instatement/Award. Take note that I just remove redundant information and update the description to be more clearly. The logical is not changed. | -| 1.18 | 03/04/2024 | Trangdth | Added section 2 (2.1/ 2.2/2.3/2.4) OneAccess module, including Overview, User Group, Permission Management and User Profile.
4.6 Pool Definition: Correction typo.
4.13 Rule Criteria: Correct index of operator on each data type.
4.14 Campaign Formula : Update Formula logical on TP sides | -| 1.19 | 12/04/2024 | Trangdth | Correction typo.
Section 4.13 Rule Criteria: Update logical of String data type (TP sides only) | -| 1.20 | 15/04/2024 | Trangdth | Section 5.6 Transaction History: Update sketch, Update US and AC, update Business rule.
Section 5.11 Adjustment: Update sketch. Update US and AC, update business rule.
Section 5.15 Award : Update US and AC | -| 1.21 | 16/04/2024 | Trangdth | Section 4.18 Added Item Redemption Rule Type | -| 1.22 | 19/04/2024 | Trangdth | Section 7: OneCatalogue: Typ0 correction and update section 7.6 Voucher Code module.
Section 4.12.7 CP rule : Add Award limit use case in FSD | -| 1.23 | 26/04/2024 | Trangdth | Section 5.6 Transaction History: Added "Pool Unit Amount" on Award quick view.
Section 5.15 Item Redemption: update business req/ Flow and post condition.
Section 7.5 Item Price Update flow/ post condition / add effective date | -| 1.24 | 02/05/2024 | Trangdth | Section 4.6 Pool Definition : Add validation for Card entity level field.
Section 4.13 Campaign Rule Criteria : Correction description of filter value of Number data type.
Section 5.14 Item Redemption : Correction Wireframe and update business rule.
Section 7.3 Item master: Add Face value and correction typo | -| 1.25 | 06/05/2024 | Trangdth | Addded description to clear "Balance detail" quick view of Award and Adjustment Transaction Screen.
Section 5.14 Item redemption : Added User Stories and Acceptance criteria | -| 1.26 | 09/05/2024 | Trangdth | Section 4.13 Campaign Rule Criteria: Update String data type: Use Input tag instead of delimiter in case there are many filter value if input type as "value" | -| 1.27 | 20/05/2024 | Trangdth | Section 4.13 Campaign Rule Criteria: Add more description for Date Data type.
Section 4.12 Campaign Rule: Add new fields/validation to handle Evoucher Pool and Adjust Rule Type. | -| 1.28 | 24/05/2024 | Trangdth | Section 4.6: Pool Definition: Add validation for Precision of Pool.
Section 7.6: Voucher code: Change field name from Voucher type into Promotion Type.
Section OneAdmin Overview: Update and correction section 3.1/3.2/3.3.
Section 7.5 Item price: Add item code to avoid confuse.
Customer Profile: Add "Address Type: field.
Section 5.6 Item redemption Entry: Remove redudant field and add validation | -| 1.29 | 30/05/2024 | Trangdth | Counter Definition: Add validation for "Bucket period Unit".
Campaign rule: Remove API of master data filed Remove Voucher code Add item code | -| 1.30 | 17/06/2024 | Trangdth | Section 5.9/5.10: Attribute/Counter: Correction and update more detail.
Section 5.6: Transaction History: Remove Deleted field, correction typo and update detail for quick view.
Section 5.11/5.12: Adjustment /Transfer balance: Correction process flow and business.
Section 5.15: Award transaction: Update process flow on TP side.
Other section: Update and correct to match with the system | -| 1.31 | 19/06/2024 | Trangdth | All sections: Add more description for number field if needed | -| 1.32 | 24/06/2024 | Trangdth | Campaign formula /Business rule : Update validation for "Amount " field (F4/F6).
Section 5.2.6.2: Customer's rewards statistic : Remove total spending, Update logical for Points/Cash back | -| 1.33 | 12/07/2024 | Trangdth | Add section 3: Oneadmin: Overview about the OLS system : Search/Filter/Add/View/Edit/Approve/History.
Add Section 4: Application Parameter.
Update section 6.2.6: Customer 360=>Business Rule: Correct typo. Add more detail for pool balance information and most redeemed item | -| 1.34 | 11/11/2024 | Trangdth | Correction typos | diff --git a/docs/specs/reference/document_references.md b/docs/specs/reference/document_references.md deleted file mode 100644 index 43e86d0..0000000 --- a/docs/specs/reference/document_references.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Document References" -type: OpenSpec -status: Draft -domain: Reference ---- - -# Document References - -| Ref# | Description / File Name | -|---|---| -| R01 | | -| R02 | | -| R03 | | -| R04 | | diff --git a/docs/specs/reward_campaign/account_type_group.md b/docs/specs/reward_campaign/account_type_group.md deleted file mode 100644 index 8bd3b92..0000000 --- a/docs/specs/reward_campaign/account_type_group.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "Account Type Group" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Account Type Group (ATG) - -## Requirement Definition -Groups Account Types (Product Account Level + Type) and orders them in priority sequence. ATGs are assigned to Reward Pools to restrict which accounts can earn into the pool, and to define the priority sequence for deducting points during redemptions at Customer-level pools. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. -- Account Types must exist in OLS. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Account Type Group Id | Identifier. | String (10) | Required. Unique. | -| Description | Description. | String (100) | Required. | - -#### Account Type Sequence -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Product Account Level | PAL. | Enum (Lookup) | Required. | -| Product Account Type | PAT. | Enum (Lookup) | Required. | -| Sequence No | Priority sequence (lowest is highest priority). | Integer | Required. | - -### Execution -- **Redemption Priority**: When redeeming from a Customer pool, buckets with the same expiry date are deducted in ascending order of the Account Type's Sequence No in the pool's ATG. Account types NOT in the ATG have highest priority. -- **Posting Priority**: If a transaction arrives with only a CIF Number (no Account Number), the system uses the ATG to find eligible accounts for that CIF. If multiple exist, the one with the lowest Sequence No in the ATG is selected for the transaction. -- **Validation**: Incoming transactions must map to an Account Type that is within the Pool's ATG. If the intersection of Customer's Accounts and the Pool's ATG is null, the transaction is rejected. - -## Exception Flow -- TP validation failures reject the transaction. diff --git a/docs/specs/reward_campaign/campaign_insight.md b/docs/specs/reward_campaign/campaign_insight.md deleted file mode 100644 index 29582b3..0000000 --- a/docs/specs/reward_campaign/campaign_insight.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Campaign Insight" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Campaign Insight - -## Requirement Definition -Combines data from across multiple data sources into charts to track and display customer and campaign activities, providing a high-level performance overview. - -## Process Flow - -### Pre-Conditions -- Users must have access rights to the Campaign Insight module. - -## Business Rules - -### Data Schema - -#### Key Metrics Displayed -- Total Redeemed Points. -- Total Members (Active vs Inactive). -- Total Partners. -- Total Active Reward Campaigns. - -#### Charts & Visualizations -- **Campaign Performance**: Displays the Top N Campaigns by awarded points, comparing "Target Avg Transaction Value" vs actual awards. -- **Top Channels**: Breakdown of transactions by entry channel (e.g., EDC, Web, Call Center). -- **Points Awarded vs Redeemed**: Time-series comparison of point inflows vs outflows over a period. - -### Execution -- **View-only dashboard.** -- Real-time or near-real-time aggregation depending on batch job configuration for analytics. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/campaign_rule_contributor.md b/docs/specs/reward_campaign/campaign_rule_contributor.md deleted file mode 100644 index b5fc6eb..0000000 --- a/docs/specs/reward_campaign/campaign_rule_contributor.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: "Campaign Rule - Contributor Settings" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Campaign Rule - Contributor Settings - -## Requirement Definition -Configures funding contributors for a reward. If a reward is funded by entities other than the transacting merchant (or split between them), Contributors define the split percentage. - -## Process Flow - -### Pre-Conditions -- Rule must be created. -- Contributing merchants (Chains) must exist in OLS. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Contributor | The Chain funding the reward. | Enum (Lookup) | Required. Unique per rule. | -| Contributor Percentage | Percentage of cost to fund. | Decimal | Required. > 0. | -| Absorb Remainder | Absorbs rounding remainders. | Boolean | Required. Exactly one must be true. | - -### Execution -- Total contribution must equal 100%. -- Transaction processing splits the awarded value across Contributors based on percentages. -- If no contributors are configured, the transacting Merchant (Chain) absorbs 100% of the cost. - -## Exception Flow -- Validation failures block saving. diff --git a/docs/specs/reward_campaign/campaign_rule_criteria.md b/docs/specs/reward_campaign/campaign_rule_criteria.md deleted file mode 100644 index bb90b61..0000000 --- a/docs/specs/reward_campaign/campaign_rule_criteria.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Campaign Rule Criteria" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Campaign Rule Criteria - -## Requirement Definition -Defines the conditions a transaction must meet to trigger a Campaign Rule. Built using a drag-and-drop Query Builder interface. - -## Process Flow - -### Pre-Conditions -- Rule must be created. - -## Business Rules - -### Data Schema -Criteria are categorized into: Customer, Account, Transaction, Attribute, Counter, Merchant. - -#### Operators -| Data Type | Operators | Logic Type / Details | -|---|---|---| -| String / Lookup | Is in, Is not in, Contains, Equal to, Not equal to, Starts with, Ends with, Is null, Is not null. | Validates against provided text or list of values. | -| Number | Equal, Not equal, Less than, Less/equal, Greater, Greater/equal, Between, Null, Not null. | Standard numerical comparison. | -| Date | On or before, On or after, Fixed date, Between date range, Between period from N. | Complex date logic (e.g. comparing Day/Month regardless of year, comparing "3 months ago"). | -| Day of week | Is the day of week. | Monday-Sunday. | -| Time | Is between. | Time-of-day comparison (00:00 - 23:59). | -| Boolean | Is. | True / False. | - -### Execution -- Supports AND and OR logic grouping. -- A single rule can have multiple groups, but inter-group logic must be consistent (all ANDs or all ORs). -- NOT toggles support exclusion. -- All criteria defined in the rule must evaluate to true (for AND) or at least one (for OR) to trigger the Formula execution. - -## Exception Flow -- Validation failure means the rule is not triggered (proceeds to next rule in Execution Sequence). diff --git a/docs/specs/reward_campaign/campaign_rule_formula.md b/docs/specs/reward_campaign/campaign_rule_formula.md deleted file mode 100644 index 3527ab2..0000000 --- a/docs/specs/reward_campaign/campaign_rule_formula.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Campaign Rule Formula" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Campaign Rule Formula - -## Requirement Definition -Configures the mathematical formula used to calculate the reward, redemption value, or counter increment for a given Rule. - -## Process Flow - -### Pre-Conditions -- Rule must be created. - -## Business Rules - -### Execution -- Formulas act on the "Amount to Use (A)" defined in the Rule Header. -- Support mathematical operations (e.g., A * 0.05, A + 10). -- Formulas can be assigned to different tiers based on criteria. -- Formulas can be used to update Pool Balances, or simply update a Counter / Attribute without impacting a Pool. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/campaign_structure.md b/docs/specs/reward_campaign/campaign_structure.md deleted file mode 100644 index ebbfbb9..0000000 --- a/docs/specs/reward_campaign/campaign_structure.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Campaign Structure" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Campaign Structure - -## Requirement Definition -Defines the conceptual structure and mechanics of how reward campaigns operate in OLS, managing the issuance and redemption of various reward types (Points, Cash Rebates, eCoupons, Lucky Draw chances). - -## Process Flow - -### Pre-Conditions -- N/A (Core concepts) - -## Business Rules - -### Types of Campaign Mechanics -1. **Award on Every Transaction**: Rewards are determined and given at the time the transaction is processed (real-time or batch). -2. **Accumulate Then Award**: Rewards depend on cumulative criteria (e.g., total spend over a month). Transactions update Counters, and at the end of the period, a separate process extracts the Counter value to determine the award. -3. **Auto-redemption Campaigns**: Awarded quantities (e.g., Cash Rebates) are immediately "redeemed" and sent to an external system (like a Core Banking system) to credit the customer's account. - -### Reward Pool Structure & Deduction -- Earnings are tracked in "Pools" by reward type. -- Pools belong to Loyalty Accounts (or specific Accounts/Cards). -- Stored value is tracked in Buckets segregated by Expiry Date and Account Type. -- **Redemption Sequence**: - - Deducted in ascending Expiry Date (earliest expiring first). - - If identical expiry dates, sorted by a pre-configured Account Type priority sequence. - -### Counters -- A Counter tracks a quantity (e.g., spend amount, transaction frequency) over a defined time period (Bucket). -- Entities tracked: Customer, Account, Card, Store, Chain, etc. -- Quantities tracked: Gross Amount, Nett Amount, Points, Transaction Count, Custom Quantities. -- Counter Periods: Days, Weeks, Months, Quarters, Years, Fixed Date, No Expiry, Days/Months/Quarters from Account Open Date. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/cep_rule.md b/docs/specs/reward_campaign/cep_rule.md deleted file mode 100644 index c3e2db8..0000000 --- a/docs/specs/reward_campaign/cep_rule.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Counter Extract & Process (CEP) Rule" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Counter Extract & Process (CEP) Rule - -## Requirement Definition -Extracts values accumulated in a Counter at the end of a defined period and generates a transaction to trigger an Award/Redeem rule based on that accumulated total. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. -- A Counter tracking the required metric must exist. - -## Business Rules - -### Data Schema - -#### General & Extraction Settings -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Rule Type | CEP. | Enum | Required. | -| Counter to Extract | Counter containing the value. | Enum (Lookup) | Required. | -| Bucket to Extract | Current, Previous, Period Before Last. | Enum | Required. | -| Rule type to process | Rule type of the destination rule. | Enum (Lookup) | Required. | -| Transaction Code | TC used to post the extracted transaction. | Enum (Lookup) | Required. | -| -ve Bal. Adjust. TC | TC for negative extracted values. | Enum (Lookup) | Optional. | -| Account with blocked Card | Include or Exclude blocked cards. | Boolean | Conditional (if Acct/Card entity). | -| Run schedule | Day, Month, Annual, N days AOD, Stmt Cycle. | Enum (Lookup) | Required. Defines execution frequency. | - -### Execution -- Evaluated by the CEP Batch scheduled at end-of-day. -- The extracted Counter Bucket value becomes the `Amount A` for the destination Rule. -- State of Counter Buckets is updated based on Counter Definition (e.g., closed after extraction) to prevent double-processing. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/counter_definition.md b/docs/specs/reward_campaign/counter_definition.md deleted file mode 100644 index bd0be45..0000000 --- a/docs/specs/reward_campaign/counter_definition.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "Counter Definition" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Counter Definition - -## Requirement Definition -Defines conceptual entities that track quantities (spend amount, transactions, points) over defined periods of time. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Counter Id | Unique identifier. | String (10) | Required. | -| Counter Name | Descriptive name. | String (50) | Required. | -| Effective From Date | Start date of counter effectiveness. | Date | Required. | -| Effective To Date | End date of counter effectiveness. | Date | Required. | -| Entity | Level of tracking (Cust, Acct, Card, Store, etc).| Enum (Lookup) | Required. | -| Bucket Period Unit | Time period for buckets (Day, Month, etc). | Enum (Lookup) | Required. | -| Bucket End Date | Used if Unit is Fixed Date. | Date | Conditional. | -| Bucket Period Duration(N)| Length of the period unit. | Integer | Conditional. | -| What to count | Entity to track (Gross Amt, Txns, Points, etc). | Enum (Lookup) | Required. | -| Reset type | Reset to 0, or keep remainder. | Enum (Lookup) | Required. | -| Reset Value | Threshold at which counter resets and new bucket starts. | Decimal | Required. Default 999999999. | -| First Start Date Is Fixed| Boolean flag. | Boolean | Conditional. | -| First Start Date | Starting date for the first bucket. | Date | Conditional. | -| Update State When | When to close bucket (On extract, On award). | Enum (Lookup) | Required. | -| Late Posting Option | Update late value vs Current bucket. | Enum | Required. | - -### Execution -- If counter ID has existing values in `counter_stock`, definition cannot be changed (except Name/Desc/End Date). -- Late Posting determines how transactions with backdated post dates update counters (update the "Late Counter Value" or force update into the currently active time bucket). - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/external_transaction_code.md b/docs/specs/reward_campaign/external_transaction_code.md deleted file mode 100644 index 44fb39f..0000000 --- a/docs/specs/reward_campaign/external_transaction_code.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: "External Transaction Code" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# External Transaction Code - -## Requirement Definition -Maps incoming transaction codes from external systems (e.g., Card System) to OLS Transaction Codes. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the module. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| External Transaction Code | Source System Transaction Code. | String (10) | Required. | -| Description | Description for reference. | String (30) | Required. | - -### Execution -- An External System TC is the first key used to locate the corresponding OLS TC for processing. -- Each External TC must be mapped to an OLS TC. -- Supports Maker-Checker approval workflow (Pending -> Active). - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/item_redemption_rule.md b/docs/specs/reward_campaign/item_redemption_rule.md deleted file mode 100644 index baeab15..0000000 --- a/docs/specs/reward_campaign/item_redemption_rule.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Item Redemption Rule" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Item Redemption Rule - -## Requirement Definition -Evaluates item redemption transactions (e.g. redeeming an eVoucher or physical item from a catalog). - -## Process Flow - -### Pre-Conditions -- Users must have access rights. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Rule Type | Item Redemption (ITRD). | Enum | Required. | -| Message Template ID | SMS/Email template if rule hit. | Enum (Lookup) | Optional. | -| Transaction Code | TC used to post the redemption. | Enum (Lookup) | Required. | - -### Execution -- Same criteria evaluation approach as Award rules. -- There is NO reward pool, formula, or contributor attached to this rule type. -- The redemption pool to deduct from is configured separately in the Item Price configuration. -- To post an item redemption, the transaction must pass the validation criteria of the Item Redemption Rule linked to the redemption TC. - -## Exception Flow -- Criteria failure blocks the item redemption transaction. diff --git a/docs/specs/reward_campaign/ols_transaction_code.md b/docs/specs/reward_campaign/ols_transaction_code.md deleted file mode 100644 index ef28ccf..0000000 --- a/docs/specs/reward_campaign/ols_transaction_code.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "OLS Transaction Code" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# OLS Transaction Code - -## Requirement Definition -Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC). It acts as the primary key to locate relevant Campaign Rules. - -## Process Flow - -### Pre-Conditions -- Users must have access rights in the module. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| OLS Transaction Code | The internal transaction code. | String (10) | Required. | -| Description | Description of the code. | String (30) | Required. | -| External Transaction Code | The mapped external TCs. | List of Strings | Optional. Many External TCs can map to one OLS TC. | -| Reversal Indicator | Indicates if this is a reversal. | Boolean | Default False. | - -### Execution -- Supports internal transactions (e.g., CEP Batch generated) that do not have an External TC. -- Supports Maker-Checker approval workflow (Pending -> Active). - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/pool_definition.md b/docs/specs/reward_campaign/pool_definition.md deleted file mode 100644 index a6662c8..0000000 --- a/docs/specs/reward_campaign/pool_definition.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Pool Definition" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Pool Definition - -## Requirement Definition -Defines Reward Pools which track stored values (Points, Cash Rebates, Lucky Draw chances, eVouchers). Pools dictate expiry policies, entity tracking levels (Customer, Account, Card), and velocity controls. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. -- Pool Conversion Rate must be active. -- Account Type Groups (if applicable) must be active. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Pool Id | System-generated identifier. | String (10) | Required. | -| Pool Name | Name of the pool. | String (30) | Required. | -| Pool Type | Points, Cash Rebate, Lucky Draw, eVoucher. | Enum | Required. | -| Expiry Policy | Method to calculate expiry date. | Enum (Lookup) | Required (except eVoucher). | -| Policy Parameter N | Numeric parameter for Expiry Policy. | Integer | Conditional based on policy. | -| Expiry Date | Fixed expiry date. | Date | Conditional (if policy is Fixed Date). | -| Ripening Period | Days before reward is redeemable. | Integer | Conditional. Default 0. | -| Conversion Rate Code | Currency representing a unit of reward. | Enum (Lookup) | Conditional. | -| Allow Negative Balance | Allow pool to go negative on adjust/cancel. | Boolean | Conditional. Default False. | -| Precision | Number of decimal places. | Enum (Lookup) | Conditional. Default 2. | -| Account Type Group | Restricts earning to specific accounts. | Enum (Lookup) | Optional. | -| Grace Period | Months to keep expired buckets before forfeit. | Integer | Optional. | -| Entity Level | Tracks balance at Customer, Account, Card. | Enum | Required. | - -#### Product Specific Policy -Overrides general expiry policy for specific Account Types. -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Product Account Level | PAL. | Enum (Lookup) | Required. | -| Product Account Type | PAT. | Enum (Lookup) | Required. Unique per row. | -| Expiry Policy | Specific expiry policy. | Enum (Lookup) | Required. | - -#### Velocity Control -Defines thresholds for sending alerts (Exception Alert Reports). -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Maximum | Threshold limit. | Decimal | Required. | -| Transaction Type | Award, Redeem, Adjust. | Enum | Required. | -| Units | Per Pool Units or Per Transaction. | Enum | Required. | -| Per Entity 1 | Customer, Account, Card. | Enum | Optional (System-wide if null). | -| Per Entity 2 | Corporation, Chain, Store, Terminal. | Enum | Optional. | -| Per Period | Quarter, Month, Week, Day. | Enum | Required. | -| Alert Template | Message template for alert. | Enum | Required. | -| Alert Group | Recipient group (SMS/Email). | Enum | Required. | - -### Execution -- Precision cannot be reduced after transactions are posted. -- Entity Level cannot be moved downwards (e.g., Customer to Card) after transactions are posted. -- Evoucher pools have No Expiry, no Precision, and no Negative Balances. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/rep_rule.md b/docs/specs/reward_campaign/rep_rule.md deleted file mode 100644 index 8400950..0000000 --- a/docs/specs/reward_campaign/rep_rule.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "Redemption Extract & Process (REP) Rule" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Redemption Extract & Process (REP) Rule - -## Requirement Definition -Extracts reward pool balances to automatically output them as Cash Rebates or Partner Points to an external destination system (like a Core Banking system or Airline Partner). - -## Process Flow - -### Pre-Conditions -- Users must have access rights. - -## Business Rules - -### Data Schema - -#### Extraction Settings -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Rule Type | REP. | Enum | Required. | -| Pool to Extract | Pool containing the balance. | Enum (Lookup) | Required. | -| Minimum Pool Balance | Threshold before extraction. | Decimal | Optional. | -| Trigger Campaign rule | Validates criteria before extraction. | Boolean | Default False. | -| Redeem TC | TC used to post the redemption. | Enum (Lookup) | Required. | -| Output Redemption As | Format/System of output (e.g. Cash Rebate file).| Enum (Lookup) | Required. | -| Run schedule | Day, Month, Annual, Stmt Cycle, N days AOD. | Enum (Lookup) | Required. Defines execution frequency. | - -### Execution -- Evaluated by the REP Batch scheduled at end-of-day. -- The full eligible amount of the Pool balance is deducted and output to a file (e.g., `OLSCRTXN`). -- If `Trigger Campaign rule` is true, an intermediate Redeem rule evaluates criteria, and the extracted amount is the minimum of (Available Balance, Formula Result). - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/reward_campaign.md b/docs/specs/reward_campaign/reward_campaign.md deleted file mode 100644 index d648c43..0000000 --- a/docs/specs/reward_campaign/reward_campaign.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Reward Campaign" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Reward Campaign - -## Requirement Definition -Acts as the parent container for Business Rules (Campaign Rules) controlling rewards and redemptions. Campaigns can be "Base" (core product) or "Tactical" (short-term objectives). - -## Process Flow - -### Pre-Conditions -- Users must have access rights. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Identifier. | String (10) | Required. | -| Campaign Name | Name of the campaign. | String (50) | Required. >= 10 chars. | -| Campaign Owner | Owner reference. | String (50) | Optional. | -| Campaign Description | Description. | String (500) | Optional. | -| Campaign Type | Base or Tactical. | Enum (Lookup) | Required. | -| Target Active Customer Count | Expected participant count. | Integer | Optional. Insight metric. | -| Target Avg Transaction Value | Expected spend value. | Decimal | Optional. Insight metric. | -| Campaign Period | Earliest Rule start to latest Rule end. | Date Range | Read-only based on Rules. | - -### Execution -- Campaigns simply group Rules logically. The actual execution logic is defined in the child Campaign Rules. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/reward_campaign_rule.md b/docs/specs/reward_campaign/reward_campaign_rule.md deleted file mode 100644 index 2cd000c..0000000 --- a/docs/specs/reward_campaign/reward_campaign_rule.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Reward Campaign Rule" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Reward Campaign Rule - -## Requirement Definition -Campaign Rules define the business rules for giving a reward, defining conditions for redemption, or triggering batch updates (CEP/REP). This spec covers standard Award, Redeem, and Adjust rules. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. - -## Business Rules - -### Data Schema - -#### General Information -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Campaign ID | Parent campaign. | Enum (Lookup) | Required. | -| Campaign Rule ID | System-generated identifier. | String (10) | Required. | -| Campaign Rule Name | Name of the rule. | String (50) | Required. | -| Rule Type | Award, Redeem, Adjust. | Enum (Lookup) | Required. | -| Effective Date From | Start of effective period. | Date | Required. | -| Effective Date To | End of effective period. | Date | Required. | - -#### Rule Setting -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Effective Period is Based On| Transaction Date vs Post Date. | Enum | Required. | -| Pool | Reward pool applied to this rule. | Enum (Lookup) | Required. | -| Item Code | eVoucher item if Pool Type is eVoucher. | Enum (Lookup) | Conditional. | -| Message Template ID | SMS/Email template if rule hit. | Enum (Lookup) | Optional. | -| Stop if criteria met | If true, halts further rule evaluation for this TC. | Boolean | Default False. | -| Do not update pool | Rule updates Counters/Attributes but not the pool. | Boolean | Default False. | - -#### Transaction Code Linkage -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Transaction Code | TC that triggers this rule. | Enum (Lookup) | Required. | -| Execution Sequence | Priority order of execution. | Integer | Required. Unique per Rule Type + TC combo. | - -#### Formula Setting (If Rule Type requires formula) -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Amount to Use (A) | Derived amount (from tx data or counter). | Enum | Required. | -| Cap A not more than | Caps the input 'A'. | Decimal | Optional. | -| Formula Result is rounded | Down, Nearest, Up. | Enum | Required. | -| Award Limit (At Least) | Minimum guaranteed result. | Decimal | Optional. | -| Award Limit (No More Than) | Max limit (can be tied to a Counter). | Decimal | Optional. | - -### Execution -- An incoming transaction's TC is matched against Rules. -- Rules linked to the TC are evaluated in Execution Sequence order. -- If Rule Criteria (defined separately) pass, the Formula (defined separately) calculates the reward. -- If "Stop if criteria met" is true, processing halts. - -## Exception Flow -- N/A diff --git a/docs/specs/reward_campaign/transaction_category.md b/docs/specs/reward_campaign/transaction_category.md deleted file mode 100644 index 7a4ea1f..0000000 --- a/docs/specs/reward_campaign/transaction_category.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Transaction Category" -type: OpenSpec -status: Draft -domain: Reward Campaign Management ---- - -# Transaction Category - -## Requirement Definition -A reusable group of conditions/criteria that define a specific category of transactions (e.g., "Dining transactions in Foreign Currency"). Allows efficient and reusable setup of Campaign Rule Criteria without needing multiple duplicated rules. - -## Process Flow - -### Pre-Conditions -- Users must have access rights. -- Criteria attributes must exist in the system. - -## Business Rules - -### Data Schema - -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Transaction Category Code | Unique identifier. | String (5) | Required. | -| Transaction Category Name | Name of category. | String (50) | Required. | -| Description | Description for reference. | String (100) | Optional. | -| Configuration | Groupings of criteria (AND/OR). | Rule Builder | Required. Same structure as Rule Criteria. | - -### Execution -- Built using the Query Builder UI. -- Supports nested AND/OR logic. -- Includes NOT operators for exclusions. -- A Transaction Category acts as a single virtual criterion when configuring a Campaign Rule. - -## Exception Flow -- N/A diff --git a/docs/specs/system_management/application_parameter.md b/docs/specs/system_management/application_parameter.md deleted file mode 100644 index 6dc57f1..0000000 --- a/docs/specs/system_management/application_parameter.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Application Parameter" -type: OpenSpec -status: Draft -domain: System Management ---- - -# Application Parameter - -## Requirement Definition -The "Application Parameters" module provides a means to maintain a set of application control parameters that define system behavior in relation to user authentication and display formats. This includes password policy parameters, session time-outs, and system display formats. - -## Process Flow - -### Trigger -- User accesses the Application Parameters module under System Management. - -### Pre-Conditions -- Users must have access rights to the Application Parameters module. -- Depending on access rights, users can view, add, or edit parameters. - -## Business Rules -- All parameters are pre-defined by the system with default values. -- Users with appropriate rights can modify these parameter values. - -### Data Schema - -#### Access Control Parameters -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Same User Cannot Approve | Allow/Disallow the user to approve/reject the record they created. | Boolean | Default: False | -| Same User Cannot Modify Own Profile | Allow/Disallow the user to change their profile in the system. | Boolean | Default: False | -| User Session Inactivity Time-out | The user session ends if there are no user actions for N minutes. Alert message required on timeout. | Integer | Default: 30 | -| Maximum Failed Forgotten Password Attempts | User ID is blocked from further log-ins and profile suspended until reset if invalid passwords exceed this limit consecutively. | Integer | Default: 5 | -| Inactivate User Id after N days of no log-ins | User status is automatically set to inactive until reset if not logged in for the specified number of days. | Integer | Default: 30 | -| Remind User to Change password N Days Before | System notifies the user to change the password N days before expiration upon login. | Integer | Default: 5 | -| Password expiration (days) | Number of days after which a new password expires. Account is locked post-expiration until admin unlocks. | Integer | Default: 180 | -| Disallow re-use of the last N passwords | System restricts re-using the last N passwords to ensure regular updates. | Integer | Default: 2 | -| Maximum password length | Maximum length of a new password. | Integer | Default: 50 | -| Minimum password length | Minimum length of a new password. | Integer | Default: 8 | -| Password must at least N numeric digit | Minimum numeric digits required in a password. | Integer | Default: 1 | -| Password must have at least N upper case alphabet | Minimum uppercase letters required in a password. | Integer | Default: 1 | -| Password must have at least N lower case alphabet | Minimum lowercase letters required in a password. | Integer | Default: 1 | -| Password must have at least N special character | Minimum special characters required in a password. | Integer | Default: 1 | - -#### Display Setting Parameters -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Date format | Determines how dates are displayed throughout the system. | String | Enum: DD/MM/YYYY, DD-MM-YYYY, DDMMYYYY, MM/DD/YYYY, MM-DD-YYYY, YYYY/MM/DD, YYYY-MM-DD, DD,MM,YYYY. Default: DD/MM/YYYY | -| Time format | Determines how times are displayed throughout the system. | String | Enum: HH:mm:ss, HHmmss, HH,mm,ss, HH;mm;ss, HH/mm/ss. Default: HH:mm:ss | -| Amount display format | Determines how amounts are displayed throughout the system. | String | Enum: American (999,999.99), European (999.999,99) | - -#### Functionality Parameters -| Field Name | Description | Logic Type | Constraints / Rules | -|---|---|---|---| -| Processing Date | The date on which a transaction is processed. Used for testing only. If empty, the system date is used. | Date | Default: Empty | -| Allow Cross Function Update | Allows or disallows cross-updates between data created by different users. Applies to Customer, Account, and Card data. | Boolean | Default: True | - -## Post-Conditions -- The application uses the updated parameter configuration. -- Application parameter management is maintainable and scalable with other systems. - -## Exception Flow -No exceptions defined. diff --git a/docs/staging/MANIFEST.md b/docs/staging/MANIFEST.md new file mode 100644 index 0000000..30811fa --- /dev/null +++ b/docs/staging/MANIFEST.md @@ -0,0 +1,49 @@ +# Knowledge Pipeline Manifest + +> Single source of truth cho toàn bộ pipeline status. +> Mỗi source file có 1 section riêng với trạng thái từng stage. + +--- + +## Source: FSD_P1 + +- **File**: FSD P1_Finnal Version.docx +- **Added**: 2026-07-25 +- **Stages**: + +| Stage | Status | Items | Notes | +|---|---|---|---| +| prep | ✅ DONE | 1 file | Raw + Clean completed | +| structure | ✅ DONE | 30 specs (8 campaign, 10 customer, 4 catalogue, 5 marketing, 1 targeting, 1 system) + UI discarded | 6 domains | +| transform | ✅ DONE | 30 cards (10/10 QC) | All domains | +| reference | ✅ DONE | 9 refs (P0: 4, P1: 5) | | +| validate | ✅ DONE | 30 pass, 0 error | | + +- **Cards**: + - campaign/reward_campaign, campaign/campaign_rule, campaign/special_rule_types, campaign/transaction_codes, campaign/pool_definition, campaign/pool_conversion_rate, campaign/counter_definition, campaign/account_type_group, campaign/cep_request, campaign/rep_rule, campaign/item_redemption_rule + - customer/customer_overview, customer/account, customer/card, customer/pool_balance, customer/transaction_history, customer/no_hit_transaction, customer/statement, customer/attribute_counter, customer/operations_adjustment, customer/operations_transaction + - catalogue/catalogue_category, catalogue/item_master, catalogue/item_price, catalogue/voucher_code + - marketing/marketing_campaign, marketing/marketing_message, marketing/ab_testing, marketing/frequency_capping, marketing/audience_filter + - targeting/segmentation + - system/application_parameter + +- **Refs**: campaign/criteria_operators, campaign/formula_calculation, campaign/expiry_policies, customer/adjustment_deduction_logic, campaign/batch_rule_processing, campaign/velocity_control_detail, catalogue/fulfillment_lifecycle, catalogue/redemption_pricing_detail, marketing/omr_execution_flow + +--- + +## Source: Formula_Pack + +- **Files**: Formula.docx, Formula validation.docx +- **Added**: 2026-07-26 +- **Merged into**: campaign/campaign_rule (incremental update) +- **Stages**: + +| Stage | Status | Items | Notes | +|---|---|---|---| +| prep | ✅ DONE | 2 files | Raw + Clean completed | +| structure | ✅ DONE | Merged into campaign/campaign_rule, campaign/formula_validation | | +| transform | ✅ DONE | 0 new cards (incremental on campaign/campaign_rule) | | +| reference | ✅ DONE | Covered by existing refs | | +| validate | ✅ DONE | Included in FSD_P1 validation | | + +- **Cards**: (merged into FSD_P1 cards — no new standalone cards) diff --git a/docs/staging/clean/formula.md b/docs/staging/clean/formula.md new file mode 100644 index 0000000..ac3eb34 --- /dev/null +++ b/docs/staging/clean/formula.md @@ -0,0 +1,123 @@ +--- +title: "Formula" +source: "docs/Formula.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula + +## Formula 1 + +**Enter # of Pool Units (N)**] is the number of pool units to add to Result for every D units of Amount in the **[Enter Block Size (D)]** input field. E.g. if N = 5, D=50: + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Amount** | $60 | $65 | $119 | $160 | $210 | +| **Result =** | 5 | 5 | 10 | 15 | 20 | + +**Result = [Round Down to Integer for (Transaction Amount / D)] \* N** + +Then apply precision and rounding type handling to the formula 1 result. + +**Finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +**Example 1:** + +Txn Amt = 52.87, N=1, D =1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 1)] \* 1 = [Round Down to Integer for (52.87)] \*1 = 52\* 1 = 52 + +Then apply precision and rounding type handling to the formula 1 result = 52 + +**Example 2:** + +Txn Amt = 52.87, N=0.1, D =0.1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 0.1)] \* 0.1 = [Round Down to Integer for (528.7)] \* 0.1 = 528 \* 0.1 = 52.8 + +Then apply precision and rounding type handling to the formula 1 result = 53. + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 2 + + +“N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. + +## ~~Formula 3~~ + +~~~~ + +~~The Result is multiplied by “M” if transaction date matches the selected Event Date(s). Event Date(s) is a multi-select field.~~ + +## Formula 4 + + +Selects one of two calculation algorithms as the Award Basis: + +A. “Highest Tier in Which Amount Falls” + +B. “Each Tier, applied to the part of Amount that Falls within that Tier” + +- If Award Basis “A” is selected, and AF is a Percentage, then the AF in the highest Tier in which Amount falls is applied to the whole Amount, i.e. Result = AF x Amount, where AF is the AF of the highest Tier where Amount is greater than the lower bound but less than the upper bound). + +- If “B” is selected, and if AF is a Percentage, then the AF for each Tier is applied to the part of Amount that falls within that Tier (AF x amount in Tier = D), and Result is the sum of D from all the applicable Tiers. + +- If “A” is selected and AF is “Pool Units”, then the number of Pool Units awarded is AF as specified in the highest Tier in which Amount falls is applied to the whole Amount. + +- If “B” is selected, and AF is “Pool Units”, then AF Pool Units are awarded for each Tier whose upper bound is less than Amount, i.e. Result = Sum AF of all Tiers with upper bound less than Amount. + + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 5 + + +1. Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with: + +- Amount (spend counter) + +- Formula Result (points counter) or + +- Incremented by one (frequency counter), depending on the counter method selected in Counter Definition. + +-The first input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. + +Conclude: If transaction hit F5 then Counter value is updated: + +Normal transaction: New counter value = Counter value + (F5 result \* multiplier), except multiplier is 0 + +Reversal transaction: new counter value = Counter value - (F5 result \* multiplier), except multiplier is 0 + +2. For point counter and point amount counter then: + +Just update point counter/point counter value with the point /point amount form that Rule only. If there is no point but have F5 to update point counter then throw message to reject transaction. + +## Formula 6 + + +Formula 6 is for computation on a tiered basis, similar to Formula 4, but Formula 6 is different in that the tier is determined not by the Amount (as is the case in Formula 4), but instead it is by the value of a separately selected Counter. + +“Decide Tier based in value in” is a drop-down to select all of 3 counter buckets: Current bucket/ Previous bucket/ before last bucket of each counter (in the next phase should support N bucket with N is configurable value by user). Based on “Effective Period Is Based On” of rule to determine counter value of Selected counter bucket. + + +## Formula 9 + +Update counter state + + +1. “Counter” is drop-down list to select the counter to update counter state if transaction trigger CP rule. +2. “Select state” is drop-down list to select the state to be updated. + +There is 2 options to select “Next state” or “Previous State”. Depended in reversal indicator of transaction to process as following: + +* Next State non reversal --> look for oldest C and update to A +* Next State reversal --> look for newest A and update to C +* Previous State non-reversal --> look for newest A and update to C +* Previous State reversal --> oldest C and update to A + + +## Formula 8 + +Update attribute value conditionally =tbd= \ No newline at end of file diff --git a/docs/staging/clean/formula_validation.md b/docs/staging/clean/formula_validation.md new file mode 100644 index 0000000..7b74e58 --- /dev/null +++ b/docs/staging/clean/formula_validation.md @@ -0,0 +1,50 @@ +--- +title: "Formula Validation" +source: "docs/Formula validation.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula Validation + +| | | | +| --- | --- | --- | +| **Field** | **Description** | **Data type** | +| Right panel | List all active formula on the system. In the right panel, the list to selects a Formula to use. Each formula derives a Result which is used as the award quantity or the redemption quantity, depending on the Rule Type selected in the Rule Header. The supported formulae for deriving Result are:  Formula 1 – Add “P” to Result for every D of Amount  Formula 2 – Result = “P” (a fixed amount)  Formula 4 – Derive Result based on Amount Tier and a parameter “P”  Formula 5 – Update selected Counter  Formula 6 – Derive Result based on Counter Tier and a parameter “P”  Formula 7 – Derive Result based on Rate table  Formula 8 – Update Attributes  Formula 9 – Update State of selected Counter | View only | +| Drag/Drop formula | Allow user drag/drop the formula from right panel to set up rule. Drag the selected Formula will be added as a panel for the edit and displaying the Formula parameters below the Formula part. A Formula panel can be removed by clicking on the exit icon (X) in the panel header. | Action | +| Formula order | Formula Executing Seq. It defaults to the ascending ordering sequence. User can re-arrange it if needed. For example. If user select F1 and F5 then the default formula order must be F1=> F5 and user can re-arrange into F5=>F1. The formula list is getting from “Code_Management”table where code type is “formula-list”. Refer “Get-by-code-type” API under Master data. | Action | +| **Formula 1: Add [ N ] to Result for Every [ D ] Unit(s) of Transaction Amount, where Transaction Amount is the Gross Transaction Amount or Nett Transaction Amount as selected in Amount-To-Use, in Base Currency Units.** **Only one formula 1 allow to configure on each campaign rule** | | | +| **If “Apply After Cap Value” button is on OFF** | | | +| N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical ) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| D | The block size of transaction Amount before cap. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| **If “Apply After Cap Value” button is on ON** | | | +| Before Amount Cap N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. | 9(14,2) Allow positive value only | +| D | The block size of transaction Amount before cap. | 9(14,2) Allow positive value only | +| After Amount Cap N | N result apply for after Cap value This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| D | The block size of transaction amount after cap. This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| **Formula 2: Add [ N ] to Result** **Only one formula 2 allow to configure on each campaign rule** | | | +| N\* | “N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. | 9(14,2) | +| **Formula 4: Tiered Calculation. Select Factor from row where Transaction Amount A is between [Start]-[End] in that row. If Percent is chosen in the corresponding drop-down box, then add (Factor XA) to Result. If Points is selected, then add Factor to Result** | | | +| Factor Type is \*/Loại hệ số | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Factor per Block or Full Amount\*/Hệ số theo mỗi khối hay trên toàn bộ giá trị | Selects one of two calculation algorithms as the Award Basis: A. “Highest Tier in Which Amount Falls” B. “Each Tier, applied to the part of Amount that Falls within that Tier | Drop-down Select one Lookup value from “Code_Management” table where code type is “f4-factor-option”. Refer “get-by-code-type” API under master data | +| Add tier | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. 1. If “Apply After Cap Value” button is on OFF mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Should be greater than or equal 0. For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number specifying AF. | 9(14,2) Positive value only | 1. If “Apply After Cap Value” button is on ON mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | **Before Cap** | | | | Before Cap | The label is only active when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | **After cap: This row is active on each tier when Apply after cap only** | | | | After cap | The label is only active only when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | Button | +| **Formula 5** | | | +| Multiplier\*/Hệ số nhân | Input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. | 9(14,2) ~~Should be greater than or equal 0~~ | +| Counter ID \*/Bộ đếm | The input field is a drop-down for selecting the Counter to update. Note that Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with * Amount (spend counter) * Formula Result (points counter) or * Incremented by one (frequency counter), depend on the counter method selected in Counter Definition. **Each counter is assigned to only one F5 per each campaign rule.** | Drop-down Select one Refer “Counter Definition” API under Campaign management | +| Add counter | After the fields in this row have been filled in, the “+ Add counter” icon is active, and when it is clicked will add the details from the input fields in the display area as a new row. | Button | +| **Formula 6** | | | +| Factor Type is \*/ Loại hệ số là | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Decide Tier based on value in\*/ | The input box is a drop-down for selection of a Counter to be used for determining the AF to use in deriving Result. This drop-down allow to select all of 3 counter buckets: Current bucket/ Previous bucket/ Before last bucket of each counter. E.g : Current -Counter Name [Counter ID] Previous – Counter Name [Counter ID] Before last – Counter Name [Counter ID] | Drop-down Select one Lookup value from “Counter_Definition” table Refer “get-by-code-type” API under master data | +| Add Tier /Thêm | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | The first input field is a number field to enter the lower bound of a Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number fields to enter the upper bound of a Tier | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number field specifying the value of AF, which is either the number of Pool Units to award or the percentage of Amount to award in Pool Units | 9(14,2) Positive value only | | Button | +| **Formula 9** **Allow Only one formula 9 per each campaign rule** | | | +| Counter Id\*/ Bộ đếm | The “Counter” drop-down field lists all valid Counters as defined in Counter Definition. | Drop-down Select one Lookup value from “Counter_Definition” table. Refer “Campaign Counter Definition” API under Campaign management. | +| Select State \*/Chọn trạng thái | The “Next State” drop-down provides the following choices: “Next State” , which will update the State as follows: If the State before update is “C”, the State will be updated to “A” If the State before update is “A”, the State will be updated to “O” If the State before update is “O”, no action is taken (Counter State is not changed) | Drop-down Select one Lookup value from “Code_Management” table where code type is “f9-counter-sate”. Refer “get-by-code-type” API under master data. | +| **Formula 8: Please consider and advise to change UI/UX for this** **Following items are explained for existing version** | | | +| Attribute group/Nhóm thuộc tính | Group of attribute | Drop- down Select one | +| Attribute ID\*/ Thuôc tính | Attribute ID to update attribute value/expire date If Attribute group is selected then just list all attribute of selected atrribute group If attribute group is not selected then list all active attribute on the system. | Drop-down Select one Lookup value “Attribute_Definition” table. Refer “Attribute Definition” API under Code Maintenance | +| Condition | After an Attribute has been selected, depending on the data type of the Attribute, condition appear to allow input of the conditional arguments as illustrated in the following figures Bellow image shows the a Date Attribute has been selected in the selection row : Bellow image shows a boolean attribtue has been selected in the seclection row: Bellow image show a character attribute has been selected in the selection row Bellow image show a character attribute has been selected in the selection row | | +| Set \* | Attribute ID need to be updated attribute value | Drop-down Select one Lookup value from “Attribute_Definition” table. Refer “Atrribute Defintion” API under code maitenance | +| Set to value | Value is depened on selected "Data type": * if "Boolean" data type is selected then swith button true/false is actived for default value field. Default False. * If "Character" datatype is selected then a textbox is actived for default value. * If " Date" datatype is selected hen a Date field is actived for default value field. * If "Number" datatype is selected then a Numberic filed (double data type) is actived for default value fied. | | +| Expiring | 2 choices for user: 1) User can enter a fixed date (1st input field) (Expiring ) or 2) user can enter N followed by the drop-down choice of "End of Month" or "End of Quarter" (Set Expiry Date to). if user enters a Fixed Date, we update the Expiry Date = value (Fixed Date) entered if user select period we update the expire date into selected period 1. Admin screen allows only choice of FIXED DATE or N [Period Unit]. If Expiring is provided then “Set Expire Date to “ is inactived and vice versa. 2. If “Set Expire Date To “ is selected and “Period is not No Expire / Post Date “ then “N” field is actived. 3. Have to choose at least one option: Fixed or period type | | +| Set Expire Date to | Drop -down Select one Refer “get-by-code-type” API under master data with code type is “ | +| N | 9(2) | \ No newline at end of file diff --git a/docs/staging/clean/fsd_p1_finnal_version.md b/docs/staging/clean/fsd_p1_finnal_version.md new file mode 100644 index 0000000..720fe0b --- /dev/null +++ b/docs/staging/clean/fsd_p1_finnal_version.md @@ -0,0 +1,5269 @@ +--- +title: "Fsd P1 Finnal Version" +source: "docs/FSD P1_Finnal Version.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# OLS Loyalty Marketing System FSD + +## Reference + +| Ref# | Description / File Name | +| --- | --- | +| R01 | | +| R02 | | +| R03 | | +| R04 | | +| | | + +Change History + +| **Version** | **Change Description** | **Date** | **Updated by** | +| --- | --- | --- | --- | +| | The first version including: Customer Management Campaign Management Draft OMR module | 14/12/2023 | Trangdth Maivt | +| | 1. Customer 360: Add more detail for Account/Card information 2 Section 5.1 Add filter, Add/update some fields in the screen Section 5.5 Card: Update description and logical Section 5.9 and 5.10: Update label | 18/12/2023 | Trangdth | +| | 1. Update the Pool Conversion Rate module 2. Update data type DD/MM/YYYY into "Date" to respect the date time configuration format 3. Update the Card logically: Add more detail when updating the card 4. **Update customer Management module section 5: an update based on Sang's requirement (Customer/Account/dashboard/transaction history/attribute/counter)** Update Vietnamese fields and some cosmetic issues | 20/12/2023 | Trangdth | +| | 1. Update customer block data type from X(20) into X(10) 2. Section 5.4 update the card activation date from mandatory to optional 3. Section 5.2.6: Update the logic of most items 4. Section 4.7- Pool Conversion Rate: update field name and logic for pool conversion rate 5. Section 4.12 Campaign Rule Criteria: Correction some typos and add more detail for txncat criteria 6. Pool Definition: remove the item code field (move to Rule setup). Add some validations(red line) 7. Add CEP rule type | 27/12/2023 | Trangdth | +| | 1. Add REP Rule 2. Update Pool Definition Screen: screen and logical 3. Update Counter Defintion to match with PMS and add more detail. | 02/01/2024 | Trangdth | +| | 1. Update API information for REP rule 2. Update API information for CEP Rule 3. Add document for Formula (UI+ Logical) | 10/01/2024 | Trangdth | +| | 1. Add Section 5.15 Awward Transaction Entry Screen 2. Update Section 4.8 Counter Definition: Add Late txn posting option. Update logical on post-condition 3. Update Pool Defintion: add more detail for ATG field 4. CEP/REP: Update API for run schedule | 16/01/2024 | Trangdth | +| | 1. Counter definition: Update: Active "First start date is fixed" for "Days from COD" period unit 2. Pool conversion rate: Update code from X(03) into X(05) 3. Card - Update data type and logic for Old Card number - Update the relationship of Account type and Account number 4. Add Campaign : Add description for CP module | 24/01/2024 | Trangdth | +| | 1. Add section 4.12 Campaign Rule logical for Award/redem/Adjust rule type 2. Add section 4.9 Transaction Category module | 25/01/2024 | Trangdth | +| | 1. Campaign: change data type and add alidation for Campaign type 2. CEP: Update data type for Run schedule and change the sequence order in Layout 3. REP: Update data type for Run schedule and change the sequence order in Layout | 30/01/2024 | Trangdth | +| | Section 4.17 : CEP : Update API information of following fields: - Account with blocked Card - Post Transactions under PA Account selected based on | 19/02/2024 | Trangdth | +| | Section 4.12.6 : Campaign Rule/Business Rule : Update validation of "Apply after Cap value " field | 21/02/2024 | Trangdth | +| | 1. Correction typo 2. Section 4.13: Rule criteria: Update more detail and req 3. Section 5.11 Adjustment : Add field and update logical of quick view | 05/03/2024 | Trangdth | +| | 1. Correction typo 2. Section 5.11 Adjustment: Update Vietnamese label and correction logical 3. Section 5.12 Transfer Balance: Add fields, Update logical, Add User Stories and Accepted Criterions 4. Section 5.13 Re-instatement : Add fields, Update logical , Add User Stories and Accepted Criterions | 07/03/2024 | Trangdth | +| | 1. 5.2.6.3: Account/Card information: Update logical and data entities 2. 5.11 Adjust: Add US and AC 3. 5.12 Award Transaction: Add fields, Update logical , Add User Stories and Accepted Criterions 4 5.5 Pool Balance Detail: Correction and Add User Stories and Accepted Criterions | 11/03/2024 | Trangdth | +| | 1. Section 4.15 contributor setting: Update data type of "Contributor Percentage" field 2. Section 4.14 Campaign Rule formula: Remove validation of F5/Multiplier | 12/03/2024 | Trangdth | +| | 1. Section 7: Added OneCatelogue module, including: Item master/ Catalogue/Category/Voucher management 2. Section 4.12 Campaign Rule: Added Post-condition for Amount to Use feature (Transaction Processing with Amount to use). 3. Secttion 4.6 Pool Definition: Remove CP Rule name and change data for "List Of Campaign" listing page. | 20/03/2024 | Trangdth | +| | 1. Add section 7.5: Item Price 2. Update section 5.14 Item redemption to match onecatalogue logical 3. Update quick view of Adjust/transfer balance/Re-instatement/Award. Take note that I just remove redundant information and update the description to be more clearly. The logical is not changed. | 25/03/2024 | Trangdth | +| | 1. Added section 2 (2.1/ 2.2/2.3/2.4) OneAccess module, including Overview, User Group, Permission Management and User Profile 2. 4.6 Pool Definition: Correction typo 3. 4.13 Rule Criteria: Correct index of operator on each data type 4. 4.14 Campaign Formula : Update Formula logical on TP sides | 03/04/2024 | Trangdth | +| | 1. Correction typo 2. Section 4.13 Rule Criteria: Update logical of String data type (TP sides only) (change in red text) | 12/04/2024 | Trangdth | +| | 1. Section 5.6 Transaction History: Update sketch, Update US and AC, update Business rule 2. Section 5.11 Adjustment: Update sketch. Update US and AC, update business rule 3. Section 5.15 Award : Update US and AC | 15/04/2024 | Trangdth | +| | 1. Section 4.18 Added Item Redemption Rule Type | 16/04/2024 | Trangdth | +| | 1. Section 7: OneCatalogue: Typ0 correction and update section 7.6 Voucher Code module 2. Section 4.12.7 CP rule : Add Award limit use case in FSD | 19/04/2024 | Trangdth | +| | 1. Section 5.6 Transaction History: Added "Pool Unit Amount" on Award quick view. 2. Section 5.15 Item Redemption: update business req/ Flow and post condition 3. Section 7.5 Item Price Update flow/ post condition / add effective date | 26/04/2024 | Trangdth | +| | 1. Section 4.6 Pool Definition : Add validation for Card entity level field 2. Section 4.13 Campaign Rule Criteria : Correction description of filter value of Number data type 3. Section 5.14 Item Redemption : Correction Wireframe and update business rule 4. Section 7.3 Item master: Add Face value and correction typo | 02/05/2024 | Trangdth | +| | 1. Addded description to clear "Balance detail" quick view of Award and Adjustment Transaction Screen (in red text). 2. Section 5.14 Item redemption : Added User Stories and Acceptance criteria | 06/05/2024 | Trangdth | +| | 1. Section 4.13 Campaign Rule Criteria: Update String data type: Use Input tag instead of delimiter in case there are many filter value if input type as "value" | 09/05/2024 | Trangdth | +| | 1. Section 4.13 Campaign Rule Criteria: Add more description for Date Data type. 2. Section 4.12 Campaign Rule: Add new fields/validation to handle Evoucher Pool and Adjust Rule Type. ( Change in red) | 20/05/2024 | Trangdth | +| | 1. Section 4.6: Pool Definition: Add validation for Precision of Pool 2. Section 7.6: Voucher code: Change field name from Voucher type into Promotion Type 3. Section OneAdmin Overview: Update and correction section 3.1/3.2/3.3 4. Section 7.5 Item price: Add item code to avoid confuse 5. Customer Profile: Add "Address Type: field 6. Section 5.6 Item redemption Entry: Remove redudant field and add validation (Change in red text) | 24/05/2024 | Trangdth | +| | 1. Counter Definition: Add validation for "Bucket period Unit" 2. Campaign rule: Remove API of master data filed Remove Voucher code Add item code | 30/05/2024 | Trangdth | +| | 1. Section 5.9/5.10: Attribute/Counter: Correction and update more detail 2. Section 5.6: Transaction History: Remove Deleted field, correction typo and update detail for quick view 3. Section 5.11/5.12: Adjustment /Transfer balance: Correction process flow and business 4, Section 5.15: Award transaction: Update process flow on TP side 5. Other section: Update and correct to match with the system | 17/06/2024 | Trangdth | +| | All sections: Add more description for number field if needed | 19/06/2024 | Trangdth | +| | 1. Campaign formula /Business rule : Update validation for "Amount " field (F4/F6) 2. Section 5.2.6.2: Customer’s rewards statistic : Remove total spending, Update logical for Points/Cash back All change in red text | 24/06/2024 | Trangdth | +| | 1. Add section 3: Oneadmin: Overview about the OLS system : Search/Filter/Add/View/Edit/Approve/History 2. Add Section 4: Application Parameter 3. Update section 6.2.6: Customer 360=>Business Rule: Correct typo. Add more detail for pool balance information and most redeemed item | 12/07/2024 | Trangdth | +| | Correction typos | 11/11/2024 | Trangdth | + +## Introduction + +### Scope of Document + +### Terminology + +1. The following sets out the definition of terms which are used in this document: + +| | **Term** | **Definition** | +| --- | --- | --- | +| | Amount vs Quantity | * In OLS, “Amount” is used in connection with monetary amounts – i.e. when the unit of measure is an actual currency such as Dollars, Pesos, and Indonesian Rupiah etc. For example, “Transaction Amount” is the most frequently encountered “amount” entity. * Quantity is used to refer to the number of units of an entity, but not to monetary value. For example, the number of points awarded is typically referred to as the “Award Quantity”, and the number of points redeemed is the “Redeem Quantity”, whereas the value of the award is the “Award Amount” and the value of the redemption is the “Redeem Amount” | +| | Pool Blance Bucket (Bucket) | * It is used in the context of a Reward Pool Bucket, per bucket: based on pool entity level and expiring date to determine a pool balance bucket. | +| | Bucket Expiry Date | * If used in the context of a Counter, see Counter. * If used in the context of a Reward Pool Bucket, see Pool. | +| | Campaign Rule (Rule) | * A Rule is a business rule defining the conditions under which a reward will be given, including the type and quantity of reward. * The Rule includes a set of “**Rule Criteria**” that defines the conditions to be met in order that the quantity of rewards to be calculated with the formula and parameters that are defined in the “**Rule Formula**” is to be given to the customer. | +| | CEP | * “Counter Extract & Process” is a module for setting up job requests to extract a specified counter based on criteria set up in the request, and using the counter value as transaction amount, to form a transaction to process against Campaign Rules linked to the transaction through a Transaction Code and other Rule Criteria. * The module includes the corresponding batch processes to execute the requests. | +| | Contributor | * Identifies an entity which funds the rewards given under a given Rule. * One or more Contributors can be set up for rewards of each Rule. * If there is more than one Contributor for a Rule, the “**Rule Contributor Settings**” function is used to define the percentage of reward to be billed to each Contributor. The total contribution percentage must be 100%. * If the business entity with which the customer is transacting is the only Contributor for the rewards, then no setting has to be done in the “**Rule Contributor Settings**”, as BLP will consider the transacting entity as the default Contributor. * The Contributor setting is used in the end-of-day Contributor settlement report to calculate the amount due from each Contributor, for each reward transaction. | +| | Counter | * Counters are used to track customer’s transaction statistics. * Counters can be defined on demand to track a spend frequency or spend total for a given set of criteria. * For example, a Counter can be configured to track the number of transactions done by each customer in a specific Merchant Category Code or MCC. * If the count to be tracked is periodic – e.g. monthly – then the Counter can be configured to track the count for each period in a separate “**Counter Bucket**”, where each Counter Bucket has a “**Counter Bucket Date**” equal to the end date of the month. * What is tracked depends on which “**Counter Method**” is selected. * Counters are identified by “Counter Ids”. | +| | Effective Period | * Many parameters have a Start Date and End Date range during which the parameter is effective. * The general rule is that the Start Date starts on and after 00:00:00 hours and the End Date ends at 23:59:59. * Note that in BLP, time is considered a discrete quantity in seconds. * This definition applies for all cases where we have the “Start Date” and “End Date” parameters – e.g. campaign rules, currency rates, item price schedules, etc, where the corresponding start and end times are not specified. | +| | Expiry Policy | * See more on the Pool Definition section | +| | Formula | * This part of the Rule defines the calculation formula or formulae to be used for calculating the quantity (number of units in the Reward Pool – e.g. number of points, number of coupons) of reward to be given for a given transaction if the conditions set in the Rule Criteria are fulfilled. * The Formula comprises 2 parts: the Formula Header and the Formula Detail. * “**Formula Header**” defines a set of parameters to be adopted by all formulas selected in the Formula Detail – e.g. the maximum amount of reward to be given, the rounding rule (round down, round up, etc), the quantity to use for calculation (whether the Gross Amount or Nett Amount). * “**Formula Detail**” defines the details of the formula to be used in the calculations. Each Formula Detail can have one or more Formula. * **Execution Sequence**. A Rule has one or more Formula Details. Each Formula Detail is assigned an Execution Sequence number that determines the order in which the Formula is executed during transaction processing. The higher the numbers are executed first. | +| | Gross Amount | * See Transaction Amount. | +| | Pool | * Each type of reward – e.g. points or coupons, is tracked in a “**Pool**” or “**Reward Pool”**. * Each Reward Pool is associated with a “**Pool Expiry Policy**”, also referred to as “**Expiry Policy**”. * The Pool Expiry Policy selected for the Pool determines how the reward earned in that Pool is expired. * An example of a Pool Expiry Policy is “Expire 2 calendar quarters after earning”. * This would cause all the rewards earned in a given calendar quarter to be put in a Pool Bucket with an Bucket Expiry Date set to the end date 2 calendar quarters from the quarter in which the rewards were earned. * Rewards that expire on a given date are tracked in a separate “**Pool Bucket**”. * Example, if **Expiry Policy** for a Reward Pool is “Expire rewards 6 months from month of earning”, then all the points earned in each month will be stored in a separate bucket, each “Pool Bucket” having its own **Bucket Expiry Date**. * To meet the requirements of UNIRMs, new policy based on Card Types will be provided. For details of this, see “Expiry Policy” definition. | +| | REP | * “Redeem, Extract and Process” is a module for setting up a request to redeem a specified Pool, subject to criteria set up as part of the request, and to then output the redemption transaction details according to the selection set up in the request. | +| | Rule Criteria | * See Campaign Rule Criteria | +| | Rule Pool | * The Rule Pool is a Reward Pool which is updated with the results of the Rule Formula or Formulae. * Each Rule is associated with one Rule Pool. | +| | Transaction Amount | * Each transaction record in OLS for award processing has a mandatory column identified as the Transaction Amount. The Transaction Amount is used as the principal quantity for reward calculation in the Formula. * If the transaction is a payment transaction: + The Transaction Amount is the payment amount + If the transaction request includes a request to offset the payment amount by redeeming any available rewards, the amount remaining after deducting the available rewards value from the payment amount is referred to as the “**Nett Amount**”. + The payment amount before the deduction is the “**Gross Amount**”. * The Transaction Amount is always logged in OLS as the “Gross Amount”. | +| | OLS Transaction Code (TC) | * Each transaction record received in OLS for award processing has a column identified as the Transaction Code or TC. * The TC is used as the key to locate applicable Rules. * If no Rule is linked to TC, no reward calculation is done for that transaction. * TC is user-defined but it must be set up in the Transaction Code look-up table. | + +### Structure of Document + +The rest of this document is made up of the following sections: + +1. Introduction +2. OneAcess +3. Customer Management +4. Campaign Management +5. OneCatalouge +6. OneMarketing +7. OneTargeting + +## OneAccess + +### Overview + +1. OneAccess™ is the module for managing user access rights to OLS administration functions. +2. The Access control Management functions are comprised of: + +* User Group definition +* User Profile set-up (defining user IDs for logging into the system). +* Permission Management setup 2 permission type: Particular user/ User Group. + +1. Report permission + +* To identify reports each Permission Group is allowed to access. + +1. View filter Management + +Every screen can be configured with a filter based on the value of fields in the screen (View Filter). The View Filter restricts which fields in which screens are displayed to users in a User Group. The View Filter can also be used to block the entire view from the users in a User Group. + +**In phase 1, we are focusing on item #1 first and allow automation to approve when user/edit record.** + +### User Group + +#### Business Requirement + +1. The User Group module is utilized to categorize users who share identical permissions within OLS. +2. Use this screen to define the group to be assigned to a particular user or group of users. When adding a new user to the system, select this group for that user. + +#### Process Flow + +=TBD= + +#### Trigger + +1. A new user group needs to be defined. +2. An existing user group needs to be modified or the user needs to review the existing group to make any decision. + +#### Post –Condition + +1. Users have to have the access right on this screen to access this screen. +2. Depending on the user’s access rights, they can view/add/edit user group records. + +#### Wireframe + +Please refer to the wireframe on the Figma. + +#### Business Rule + +* + - * 1. The user group ID must be a unique value. + 2. If the required user group has not been defined, click on the User group icon in the Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_18) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for User Group is illustrated in section [Wireframe](#_Wireframe_18). + 4. Screen description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Genneral information** | | | | +| | User Group ID\*/ Id nhóm người dùng | The identify of user group | ~~X(20)~~ X(10) | +| | User group Name\*/ Tên nhóm người dung | The name of the user group For reference only | X(100) | +| | Description /Mô tả | Description for user group | X(200) | +| **Group users: List all active User Profile record are assigned to this group.** **This part is display when user click to view any active record only** | | | | +| | User ID\* / ID người dùng | The identify of the user who be long to the chosen group | Display | +| | User name\*/Tên người dung | The name of the user | Display | +| | Email \*/Địa chỉ email | Email | Display | + +#### Post –Condition + +* 1. The data is updated in the DB and relation screen (if needed). + +#### Exception Flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Permission Management + +#### Business requirement + +1. The Permission Management module is used to maintain Access Rights Groups – i.e. to define: + 1. Which modules and functions can be accessed by users in a group, and + 2. Which of the applicable actions can be performed by the users in each of the functions within each of the modules in the group: + +| | | | +| --- | --- | --- | +| * + 1. Add | * + 1. Change | * + 1. View | +| * + 1. Delete | * + 1. Approve (or Reject) | * + 1. Copy | +| * + 1. View History | h. Save as Template | | + +#### Process flow + +TBD + +#### Trigger + +* + 1. New user group to be defined then need to add permission to this group. + +#### Post-condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on the user’s access rights, they can view/add/edit Permission Management records. + +#### Wireframe + +Please refer to the wireframe on the Figma. + +#### Business rule + +* + - * 1. If permission required has not been defined, click on the Permission Management icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_19) + 2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Permission Management is illustrated in the section [Wireframe](#_Wireframe_19). + 3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1\*: General information/Thông tin Chung** | | | | +| | Role \*/Quyền | The unique identifier of the permission group. | ~~X(20)~~ X(10) | +| | Role Name\*/Tên nhóm quyền | Text describing the Permission Group Name, for user reference | X(100) | +| | Permission Type \*/Loại quyền | Drop down to select the following permission type: *Particular User* *User Group* | Drop-down Select one | +| | User/Người dùng | Condition field Drop-down list to select one or more users who can be accessed on all functions of this role. This field is only active and required when "Particular User" is selected in the previous step. | Drop-down Multiple select | +| | User group/ Nhóm người dung | Condition field Drop-down list to select only one group and all users under this group can be accessed on all functions of this role. This field is only active and required when this role is applicable to the user group type. | Drop-down Select one | +| | Description/ Mô tả | Text describing the Role, for user reference | X(200) | +| **Step 2**\*: **Permission Management** /Quản lí quyền | | | | +| | **Select Modules** A hierarchy of modules contains the list of functions available. Top-level module: The modules group Second level module: The specific module for each group. Allow the user to search the modules by entering the module name | | | +| | Select All/Chọn tất cả | Check/Uncheck to drag/drop all modules in the system into the permission part to configure the specific permission of the role. | Check box | +| | “Module Name” | Check/Uncheck to drag/drop this module permission part to configure the specific permission of the role. Checked/Unchecked on top level then all second level modules will be applicable as well. | Check box | +| | Search /Tìm kiếm | Users input their search keyword(s) into a designated search bar to find the module they're looking for. | Search feature | +| | **Permission /Quyền** **A list contains all selected modules in the previous step and the permission list applicable for each module.** **Note that: N/A =**Not Applicable will be defined in the master data and the user can’t check/uncheck to allow/disallow the permission if this permission is not applicable. **The system allows the user to quickly add/delete one permission to all modules per each module group.** **Besides the system allows** to allow/disallow all available permissions for all modules that appeared in the “Permission” part | | | +| | Selected all/Chọn tất cả | Check/Uncheck to allow/disallow all available permissions for all modules that appeared in the “Permission” part. | Check box | +| | “Top-level module name” E.g: Customer Management | The name of the top-level selected module. Check/uncheck to allow/disallow all available permission for all second-level modules belonging to this module | Check box | +| | “Second level Module name” E.g: Card | The name of the second level selected module. Check/uncheck to allow/disallow all available permissions for the chosen module. | Check box | +| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup to define the permission of each field on the each screen. See more on “Acccess Right Fields” | Hyperlink | +| | View /Xem | This column contains one checkbox in each row corresponding to a function to which the View action is applicable. If checked, users in this role can view the data available in this function | Check box | +| | Create/Thêm mới | This column contains one checkbox in each row corresponding to a function to which the Create action is applicable. If checked, users in this role can create data in this function. If user have created permisson then user will have "Save as draft" role also | Check box | +| | Edit /Sửa | This column contains one checkbox in each row corresponding to a function to which the Edit action is applicable. If checked, users in this role can do "update" action in this function. | Check box | +| | Delete/Xóa | This column contains one checkbox in each row corresponding to a function to which the Delete action is applicable. If checked, users in this role can do "delete" action in this function. | Check box | +| | Copy /Sao chép | This column contains one checkbox in each row corresponding to a function to which the Copy action is applicable. If checked, users in this Role can coppy available data in this function | Check box | +| | Approve /Phê duyệt | This column contains one checkbox in each row corresponding to a function to which the Approve/Reject action are applicable. If checked, users in this role can do " approve/reject" action in this function | Check box | +| | History/Xem lịch sử | This column contains one checkbox in each row corresponding to a function to which the History action (i.e. to view earlier versions of the data in the activity log) is applicable. If checked, users in this role can view data history in this function. | Check box | +| | Template/Tạo biểu mẫu | This column contains one checkbox in each row corresponding to a function to which the "Save As Tempalte"action is applicable. If checked, users in this role can save record as a template and able to access to "template" tab in listing page | Check box | +| **Access rights field /Phần quyền chi tiết trường thông tin** | | | | +| | Access permission | The list available fields of chosen module | Display | +| | View/Xem | This column contains one checkbox in the each row corresponding to a function to which the “view” action is applicable. If checked, user in this role can view the field in the screen. | Check box | +| | Editable/Cho phép chỉnh sửa | This column contains one checkbox in the each row corresponding to a function to which the “Editable” action is applicable. If checked, user in this role can modify the value of this field in the screen. | Checkbox | + +* When viewing any record, the system displays only the available permissions for this group. + +#### Post-Condition + +Record is automation approval. + +Based on the permission the system will check and display available module/function of each user as following: + +A = Set of Permission of role which are assigned directly to user + +B= Set of Permission of Role which are assigned to permission group and user are in these permission group. + +**Therefore: C= User permission = Combination of A and B.** + +#### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### User Profile + +#### Business requirement + +The user profile defines user attributes and sets the date and time for allowing user access to system functions. User profile created will be used for login, and users, upon logging in, will be able to view a list of functions with specific operations set in the permission management section and will be associated with users through this function screen. + +#### Process flow + +N/A + +#### Trigger + +* + 1. New account need to be defined. + 2. Need to update information of any existing account in the system. + +#### Post-codition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit User Profile records. + +#### Wireframe + +Please refer to the wireframe in the Figma. + +#### Business rule + +* + - * 1. If the permission required has not been defined, click on the User Profile icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_20). + 2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the User Profile is illustrated in the section [Wireframe](#_Wireframe_20). + 3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | User ID\*/ ID người dùng | Unique user identifier, assigned by the user | X(10) | +| | User Name\*/Tên người dùng | Name of the user associated with the User ID | X(50) | +| | Password/Mật khẩu | Condition field This field is only active and required when creating a new user. The password must be strong enough. | X(50) | +| | Re-enter password/Nhập lại mật khẩu | Condition filed This field is only active and required when viewing any record. The re-enter password must be matched with the password. | X(50) | +| | Reset Password | Condition field This field is only active and required when updating the user profile record. Click to reset the password in case the user forgot the password. See more on “ Reset password” | Hyperlink | +| | Email \*/Email | User’s email address. A password reset link can be sent to this address if the system is configured to do so. User can use this email to log in in the system instead. The email must be unique value | X(100) | +| | Default Language\* /Ngôn ngữ mặc định | Determines the language in which the screen labels are displayed. | Drop-down Select one | +| **Access Detail** | | | | +| | Access Day \*/Ngày truy cập | Seven checkboxes, each of which indicates the day of week on which the user has (checked) or has no (unchecked) access to the system. | Check box Allow to check more than one value | +| | Access time \*/Thời gian truy cập | On days when user has access, the Access Time is the time on and after which user has access to the system – i.e. is able to log in to the system | Time | +| | User Profile Effective From Date \*/Tài khoản có hiệu lực từ ngày | Date on and after which this User Profile is effective and the user can log in to the system | Date | +| | User Profile Effective End Date\*/Tài khoản hết hạn sau ngày | Date on and before which this User Profile is effective and the user can log in to the system After this day user can no longer log in to the system | Date | +| | User Group\*/Nhóm người dùng | A drop-down listing the available User groups. The selected group determines the functions to which the user that this user profile is defined for has access. | Drop-down Select one | +| | Report Access Right/ Quyền truy cập báo cáo | Drop-down listing the Report Access Rights groups. The selected Report Access Rights group determines which report(s) the user has access to. | Drop-down Select one | +| | User Status\*/Trạng thái người dùng | Drop-down to select following user status: Active Blocked If account is blocked then user can no longer login into the system. | Drop-down Select one | +| **Reset Password** A pop-up will be appeared when user click to Reset password | | | | +| | New Password\*/ Mật khẩu mới | Enter new password Password must be strong enough. | X(50) | +| | Re-enter Password\*/Nhập lại mật khẩu | Enters their new password again to confirm | X(50) | +| | Save /Lưu | Click to accept the change | Button | +| | Cancel /Hủy | Click to cancel the change | Button | +| **User Permission / Quyền người dùng** **Display for any active User Profile records** **The list contains all permission which applicable for the chosen user** | | | | +| | “Top level module name” E.g: Customer Management | The name of top-level module. | Display | +| | “Second level Module name” E.g: Card | The name of the seconde level selected module. | Display | +| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup show the access rights fields of chosen module. | Hyperlink | +| | View /Xem | Checked if allow Unchecked if disallow N/A if not applicable this action to that module | Display | +| | Create/Thêm mới | Display | +| | Edit /Sửa | Display | +| | Delete/Xóa | Display | +| | Copy /Sao chép | Display | +| | Approve /Phê duyệt | Display | +| | History/Xem lịch sử | Display | +| | Template/Tạo biểu mẫu | Display | + +#### Post-Condition + +When create new record then the new user account is successfully created in the system. + +The new user receives an email notification with login instructions and temporary password. + +When password is resetted then an email notification will send into user’s email with new password to user can login into the system again. + +#### Exception flow + +## OneAdmin™ + +### Overview + +1. OneAdmin™ is a browser-based application framework based on which all OLS administration screen functions are implemented. +2. This section describes the admin screen functions in general. +3. OneAdmin™ provides the screen functions such as the following for users to administer OLS: + +| | | +| --- | --- | +| * 1. Application parameters and campaign management | * 1. Creating and reviewing customer information through menus | +| * 1. Viewing and Posting of transactions for award, redeems and adjusts | * 1. Requesting for generation and viewing of reports. | +| * 1. Creating and reviewing catalogue information. | * 1. Generic Ledger management | +| * 1. Creating and reviewing merchant information | * 1. Posting of transaction testing for award, redeem and adjusts. | + +1. Maintenance actions supported include: + 1. “**Add**”, to add a new record in the module or function. See section 3.6 for an illustration of the [Add](#_Add_Form) form for adding a record. + 2. “**Edit**”, to modify an existing record on the module or function. See section [Edit](#_Edit_Form) for an illustration of the Edit form for editing a record. + 3. “**Copy**”, where user can add a new record with the contents of a currently selected record: user will be prompted to change key values which are not allowed to be replicated across records. See section [Record Copy](#_Record_Copy) for an illustration of the record copy screen. + 4. “**History**” tab brings up a display of previous versions of this record. See section [History](#_Record_History) for an illustration of the History screen. + 5. “**Save**” will save the record displayed in the edit form to the database (whether it’s a new record or changes made to an existing record). + 6. “**Cancel**” will cancel the action. + 7. “**Approve**”, to accept the change of the record in the module or function. + 8. “**Reject**”, to reject the change of the record in the modue or function. + 9. “**Save as Draft**”, to temporary save the record in the module or function without publishing it. + 10. “**Save as Template**”, to save the record displayed in the form to re-use in the furture as a template. +2. When first “saved”, the record is stored with its Status set to “Pending”. +3. It has to be selected (by click on the “Pending” tab to locate records with Status = “Pending”), then clicking on the record to view and/or approve it. +4. Upon approval, the record status is set to “Active”. +5. See section [Approve](#_Approve_Pending_Record) for the process to “**Approve**” pending records. +6. “**Delete**” marks the record being displayed as deleted or “inactive”. +7. The record will be copied into a new record with its status set to “Pending”, and the original record will be left intact. +8. A user with the necessary “Approval” rights must approve the deletion for the record to be deleted and blocked from further use. +9. All updates posted through OneAdmin™ are reflected in the database immediately on approval. + +### Types of Screen Layouts + +1. OLS admin screen functions are generally made up of 3 types of screen layouts, each corresponding to the screen function +2. The first is the **Home Page** – there is only one of this. This screen is displayed after a successful log in. +3. The second is the **Listing** **Page**: + 1. This class of screens is displayed when module in the navigation panel (Menu) is clicked. + 2. It generally displays a default list of records that can be accessed through the module. +4. The third type of screens is the “**Details Page**” layout: + 1. This is the page displayed after a record in the Summary Listing page has been selected. + 2. It shows the details of the selected record at the field level + 3. In some cases, access to child records of the record on display is provided as tabs in the screen. +5. The general features of each type of screen layout are described in the following sub-sections. + +### Home Page + +1. The following figure illustrates the Home Page screen: + +Main Menu + +1. The left panel (navigation panel) lists the module and functions to which user has access. The actual functions available in the navigation panel vary depending on the access rights of the user id that is used to log into the system. Only the functions to which the user has access will be displayed. +2. The main display area shows charts of key statistics, pre-configured at time of deployment. +3. Each of the listed modules in the navigation panel expands when clicked to show the functions available under that module. + +![](data:image/png;base64...) + +Figure: The “Campaign Managemetn” module in illustrates this expanded view. + +This module has 07 functions – “Campaign Insight”, “Campaign”, “Campaign Rule”, “Pool Definition”, “Pool Conversion Rate”, “Counter Definition”, and “Account Type Group”. + +The total number of pending records on each module is displayed on the right side of the module name. + +1. Clicking on a function will bring up the summary listing page for that function: see section 3.4. + +### Summary Listing Screens + +1. When a function in the navigation menu is clicked, the main display area will typically show the summary listing page for that function. +2. The typical layout is illustrated in the following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML37ebbf0.PNG](data:image/png;base64...) + +Sample Summary Listing Screen Layout + +1. In the following table, the row numbers correspond to the display areas enclosed in red boxes with the same number: + +| Box | Description | +| --- | --- | +| | The name and the path of the function are displayed at the top left corner of the main display area, in this case “Campaign Management > Pool List” – i.e. the function for maintaining “Pool Definition” records. | +| | The top right conner of the screen displays the language, with an icon of the language and language name. To change the display language, click on the icon to choose another language. | +| | The top right corner of the screen displays the user id and an icon of the user, with a description of the user’s access rights, i.e. the actions to which the user has access. To leave this screen simply click on the destination module and function in the navigation menu. | +| | The module name | +| | The area labelled in red displays the quick search form. It contains input boxes for filtering the records to be displayed. There are two modes of search – the **Quick search** mode and **Filter** mode: * The **Quick Search** mode search involves searching by key word: + Provides users with a fast and efficient way to access search functionality without navigating through multiple pages with the selection record status in the area 7. + Entering keyword on the text box. + By click on the ![](data:image/png;base64...) icon or press “Enter” key to get result. The system will display the list of records where the keyword is found in any column on the listing page except date time data type coulmn, in the area labeled as box number 9. + The search uses the "Contains" operator in a case-insensitive manner to find the matching record | +| | The area labelled 4 in red displays the link to the advanced filter form where multiple fields can be set up as part of the search/filter criteria. * The advanced mode involves clicking on the “**Filter**” link. * When click on the “Filter” button the advanced filter form that appears is illustrated as following: ![](data:image/png;base64...) Figure 1 – Example of the Advanced Filter Form * When click to “Add” button the form that appears as illustrated in red box in area 2 as following: ![](data:image/png;base64...) Figure 2 – Example of the Advanced Filter when add any filter In the red box, which represents the Advance Filter form (area 2): * + Three purple boxes appear in the adjacent areas: area 4, area 5, and area 6. + In the area 4, there is the “Search Field” drop-down a data field name by which to search. The system list all available **field in the listing page by the default, except “Action” and “Status” field.** * Some specific modules will need include custom filter field, that are not displayed on the listing page such as: “Customer Profile” and “Transacion History” screen. See more on its section. * Users can choose from the available data fields to narrow down their search. + In the area 5, there is the “Search Operator”. For each data type‘s search filed then the system provides a set of “Operator” options that users can apply. These operator allow the user to specific how the field should be applied to the selected filter field. All available operator according on each data type’s search field are described on the following table: | | | | | --- | --- | --- | | **Index** | **Data Type** | **Operator** | | | Character | A drop dow to select following values: * Equal * Not Equal * Empty * Not Empty * Contains * Not Contains * In * Not In | | | Number | A drop dow to select following values: * Equal * Not Equal * Greater Than * Less Than * Greater than Or Equal to * Less than or Equal to * Between | | | Boolean | A drop dow to select following values: * Equal | | | Datetime | A drop down to select following values: * Equal * Not Equal * Greather Than or Equal To * Less than or Equal to * Between | * + In the area 6, there is the “Value Field”. This field can be of two types: Text box or Drop-Down. The type of value fields (text box or drop-down) displayed to users depends on the selected operator and searched field as following: * “Empty” and “Not Empty” operator should not require a value input field. * “Between” operator of Date/Time search field should require 2 value input fields with date/ time picker to allow the users to specific the range of date /time to be used in the filter query. * “Between” operator of number search field should require 2 text boxes with number format to allow user to specific the range of number to be used in the filter query. * “In” /”Not In” operator of character search field may present a drop-down list when search field is a lookup value field on that screen, meaning it is a field that fetches data from other tables in the system . The drop-donw list all active records of the search field and allow user select multiple value to be used in the filter query. * “In”/”Not In” operator of character search field may present a text box when search field is not a lookup value field on that screen. This text box should allow the user to enter multiple values, separated by input tag. * “Contain”/”Not Contain” operator of character search field shoud present a text box. This text box should allow the user to enter multiple values, separated by input tag. They system uses “\*” to match zero or more occurrences of the preceding subexpression. * All remaining operators may present a text box input filed to allow the users to enter a filter value. The system should validate the user-entered value based on the data type of the search field. * There is no sensitive case for character search fields. * All selected fields are used in an “AND” search. * On clicking the “Adanced Search” button, the list of records found to have the matching value would be displayed in area in box number 9. * Searching by “Filter” and “Status” be done together as an AND condition. * On clicking the “Reset” button, the system delete all filter field and return all records by the slection status. | +| | This are contains three distinct tabs, each representing a different record status: Active, Pending and Rejected. On the “Pending” tab the system show the total number of pending records next to the tab label. | +| | This area contains the pagination control links – to page forward, backward or to navigate directly to a numbered page with the number of records displayed and the number of record in total. | +| | This is the main display area listing the first N records within the function selected, where N defaults to a system parameter. N can be changed in drop-down box in area 8. The top row contains the column headings, with up to N numbered rows below it. The right-most column in are 10, inclues the actions for viewing, editing, deleting and approval the record in each row. | +| | This area shows the number of records displayed and the number of record in total. | +| | This is the Add button which when clicked brings up the edit form described in section 3.6, for adding a new record in the system. | + +### Detail View + +1. When the View icon for a row is clicked in the Summary List page as described in section 3.4, the details of the record in that row is displayed as illustrated in the following: + +![](data:image/png;base64...) + +Figure 3 – Sample Record View Screen with Labelled Areas + +![](data:image/png;base64...) + +Figure 4 – Sample Record History + +| | | +| --- | --- | +| Box | Description (Refer to figure 3 and figure 4) | +| | * This area display the name of the module with the record status and record primary key. | +| | * Clicking on the “Copy” button brings up the view described in section 3.10. This feature provides a convenient means by which to create new records by changing existing records. The “Copy” feature is provided only for selected functions where a “Copy” action is practical. * Clicking on the “Edit” button, the fields are displayed with details of the record in that row, awaiting user input to amend the details. * Clicking on the “Delete” button brings up the pop-up to user confirm the deleted action. | +| | * The function accessed is displayed as a tab. * If the function has data which can be categorised separately in a logical way, each category is displayed as a different tab. * This area shows the tabs available and clicking on the tab brings up the display for that category of data. | +| | * This area shows the details of the record. | +| | * The panel on the right/bottom displays supplementary data relating to the record in the main display area (area 5). The details in the right panel vary depending on the function. | +| 7 | * Clicking on the “Back” button brings the view back to the Summary Listing page. | +| 8 | This area shows when the record was last changed, and by whom. * Every time a record is updated or approved, the user id that last made the change and the user id that last approved a change are logged with the record, together with the date and time of the action. * This information is always shown at the bottom of the record details screen display. * Only records with Status = “A” for Active are taken into account during transaction processing: if a record status is not active it will not be taken into account for any transaction processing. * The “Last Updated By” field shows the user id of the user who last updated this record. If the record is updated by a batch process, this field will contain the Batch Id. * The “Last Updated Date” field shows the date and time when the record was last updated. * The “Last Approved By” field shows the user id of the user who last approved this record. For updates by programs (batch processes and online transactions), this field is empty. * The “Last Approved Date” field shows the date and time when the record was last Approved. For updates by programs (batch processes and online transactions), this field is empty. | +| 9 | This area shows when the action records may can be changed * Clicking on the “History” records will bring up the display described as in area 4. * By choose the 2 version and clicking the “Compare” button will bring up the display described in section 3.8: Record History. Feature allows for easy browsing of the changes made to the record | + +### Add/ Edit Screen + +1. When the Edit /add for a row is clicked in the Summary List page, the details of the record in that row is displayed in the edit form for editing, as illustrated in the following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML4d96c81.PNG](data:image/png;base64...) + +Figure 3 – Sample Record Edit Form with Labelled Areas + +1. Each row in the following describes the correspondingly numbered area in Figure 3: + +| | | +| --- | --- | +| Box | Description (Refer to Figure 3) | +| | This area shows the function for which the edit form is being displayed. | +| | This is the main edit form. * Mandatory input fields have a coloured border on the left. * If the edit form is displayed as a result of the “Add” button being clicked in the previous screen, the fields will be displayed empty, awaiting user input * If the edit form is displayed as a result of the “Edit” button being clicked in the previous screen, the fields are displayed with details of the record in that row, awaiting user input to amend the details. | +| | * The “Create”/”Update” button will save the changes or in the case of the “Add” action, the input data, in the database as a new record with record Status = “Pending”. Note that the record being changed (“original record”) will remain unchanged. | +| | * The Cancel button causes any input or change made to be discarded and the display will return to the previous summary listing page. | + +### Approve Pending Record + +1. When a new record is first added, or when an existing record is “Changed” or “Deleted”, the new or modified record is inserted in the database with a Status set to “Pending”. +2. The original record remains active. +3. The “Pending” records must first be “Approved” by a user who has the rights to the “Approve” action for that function before the change becomes effective. +4. To “Approve” a record, the record must first be located by clicking for records with the “Pending ” tab as illustrated here: + +![](data:image/png;base64...) + +Figure 4 – Search for Pending Records + +![](data:image/png;base64...) + +Figure 5– Pending Record Listing + +1. In change mode, the record values with and without the change are both displayed for comparison.The previous value (before change) and the modified value,that pending approval are displayed side by side, with modified fields displayed in a font of a different color, as illustrated: + +* Red text highlights changes of the active record, ~~Red text~~ highlight with strikethrough effect for the deteled data. +* Green text highlights changes of the pending record. +* **Black text** denotes unchanged information in both record versions. + +![](data:image/png;base64...) + +Figure 6 – Pending Record Displayed Side-by-side with Currently “Active” Record + +1. At this point, it is possible to click on the Modify button to edit the record and save it back into the Pending list. The user who edits the record will not be able to “Approve” the change. +2. Click on the “Approve” button to put the record into active use. +3. Click on the “Reject” button to return the record to the Reject list for follow-up and correction. +4. Users can “Approve/Reject” record from detail view mode or by clicking on the “Approve/Reject” button from listing page. + +### Record History + +1. The “History” feature is for scanning through historical versions of a record. +2. When in the Record Detail view, clicking on the “History” Tab will bring up the all version of the record. +3. When the “Compare” button is clicked, the display will show details of two chosen version as following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML50b76fd.PNG](data:image/png;base64...) + +Figure 7 – Sample Display of a Record’s History + +| | | +| --- | --- | +| Box | Description (Figure 7) | +| | Drop-down lisitng all history version inclues currently version. Users can change version to compare by select the verion to compare. | +| | Details displayed in the change history of two selected versions by the version in the drop-down list in area 1. * Red text highlights changes of the record in the red drop-down in the area 1. * Green text highlights changes of the redcoed in the green drop-down in the area 1. * **Black text** denotes unchanged information in both record versions. | + +## Application Parameter + +### Requirement Definition + +* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. + +### Process Flow + +### Wireframe + +* + 1. Access control + +![](data:image/png;base64...) + +* + 1. Display setting + +![](data:image/png;base64...) + +* + 1. Functionality + +![](data:image/png;base64...) + +### Trigger + +### Pre-condition + +* Users have to have access right on this screen in order to access this screen. +* Depending on the user’s access rights, they can view/add/edit/ + +### Business Rule + +* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: + +![](data:image/png;base64...) + +1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. +2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. +3. Application parameters list detail: + +| Label (EN/VN) | Parameter | Data Type | +| --- | --- | --- | +| **Access *Control*** | | | +| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | +| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | +| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | +| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | +| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | +| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | +| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | +| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | +| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | +| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | +| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | +| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | +| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | +| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | +| **Display Setting** | | | +| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | +| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | +| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | +| **Functionality** | | | +| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | +| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | + +### Post-Condition + +* The application now uses the new, standardized parameter format. +* All existing parameter settings have been successfully migrated to the new format. +* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. +* The application's parameter management is more maintainable, scalable with other systems. + +### Exception flow + +## Reward Campaign Management + +### Highlights + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. +3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: + +Customer + +Account # 1 + +Account # 2 + +Account # 3 + +Smart$ + +Cash Rebates + +UNIRM + +Product Holdings + +Reward Pools PoolsBalances + +Account # 4 + +* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type + +Loyalty Account Acct + +Figure 9 – Customer View + +1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. + 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. + 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. +2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. +3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. +4. A single transaction can trigger multiple concurrent award programs. +5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. +7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. +8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. + 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: + 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) + 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. + 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically + 5. Instant discounts (specific to SKU codes i.e. purchased item codes). +9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. +10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). +11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. +12. Practically unlimited number of reward campaign rules can be run concurrently. +13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: + 1. Demographic attributes: Age group, Gender, etc. + 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week + 3. Location of transaction + 4. Instant transaction amount + 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) + 6. Transaction count (number of transactions in a period + 7. Average balance over a specified period, period-end balance over a specified period + 8. Card type (product account type) + 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) + 10. User-defined attributes associated with customer and / or product accounts, etc. +14. Rewards can be tracked at + 1. Customer level: single reward balance for customer + 2. Product level: rewards tracked as a separate balance per Product Account. +15. Customer can redeem their incentives and rewards through any of the following: + +| | | +| --- | --- | +| * 1. EDC terminals at partner outlets | * 1. Call center | +| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | + +### Structure of a Campaign (HAVE TO BE ADJUSTED) + +#### Types of Campaign Mechanics + +1. Reward campaigns can be broadly divided into two types or models: + 1. Those that award on every transaction (“Award on Every Transaction”) and + 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward +2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. + +#### Award on Every Transaction + +1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: + 1. The reward is determined at the time the transaction is processed in BLP. + 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: + +![](data:image/png;base64...) + +Figure 10 – Process Flow for Award Per Transaction + +1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules + 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. + 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems +2. Campaign Rules are set up as described in the rest of this section 4. +3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. + +#### Accumulate Then Award + +1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. + 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. + 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P + 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters + 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. + 3. The structure and mechanism of how Counters work are described in section 4.2.6. + 3. The Campaign structure of such a Campaign is broadly outlined in the following: + +![](data:image/png;base64...) + +Figure 11 – Structure of “Accumulate Then Award” Campaigns. + +1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules +2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. + +#### Auto-redemption Campaigns + +1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. + +#### Reward Pool Structure & Bucket Deduction Sequence + +1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. +2. Pools belong to “Loyalty Accounts” or LAs. +3. One LA is created per Customer (per unique CIF Number). +4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. +7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): + +| | | | | +| --- | --- | --- | --- | +| UNIRM Pool | Account Type | Expiry Date | Balance | +| A | 31-Mar-2015 | 100 | +| B | 31-Mar-2015 | 50 | +| A | 30-Jun-2015 | 110 | +| B | 30-Jun-2015 | 510 | +| A | 31-Sep-2015 | 140 | +| C | No Expiry | 215 | +| TOTAL BALANCE | | 1,125 | + +1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. +2. When customer redeems: + 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. + 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. +3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. + +#### Counters – Structure and Mechanics + +1. A Counter is a conceptual entity that tracks a quantity over a defined period of time +2. For example, a Counter may track: + 1. Customer’s total spend per month + 1. Use Case example: to award customers who spend more than 1,000 a month + 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. + 2. The total points earned by an Account in the entire Campaign + 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign ![](data:image/png;base64...) + 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. + 3. The number transactions awarded at individual merchants (Store Ids) per month + 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign + 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. +3. The key data entities making up Counter are defined in the following table: + +| | | | | | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | **Data Entity** | | **Description** | | | | | | | | | | | +| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | +| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | +| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | +| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | +| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | +| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | +| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | +| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | +| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | +| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | +| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | +| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | +| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | +| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | +| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | +| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | +| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | +| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | +| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | +| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | +| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | +| | | | DY | | SD = FSD | | | | | | | | | +| | | | MN | | SD = Start of Month of FSD | | | | | | | | | +| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | +| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | +| | Reset Value | 9(16,2) | | | | | | | | | | | | +| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | + +### About Loyalty Marketing Campaigns (HAVE TO BE ADDED) + +### External Transaction Code + +#### Requirement Definition + +* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. + 2. The External System TC is the first key is located OLS TC for processing the transaction. + 3. The TC values will be agreed with users at the time of setting up the system. + 4. Each External Transaction Code must have an OLS Transaction Code associated with it. + +For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. New transaction code coming from external system then user have to define new external TC in OLS. + 2. Some description should be adjusted then user have to modify. + 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. + +#### Pre-Condition + +* 1. Users have to have the access right on this screen in order to accesss this screen. + 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Detail view + 2. Detail view + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | +| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | + +1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/Edited. + +#### Post-condition + +1. User able to proceed to OLS Transaction Code screen. See in section 4.5 + +#### Exception flow + +1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. + +### OLS Transaction Code + +#### Requirement Definition + +1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. +2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. +3. For example: + 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New transaction code coming from external system then the user has to define new OLS TC also. +2. New OLS transaction coming from internal transaction. +3. Some detailed information should be adjusted then the user has to modify it. +4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. +3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Summary listing page + +![](data:image/png;base64...) + +Figure 2 – Filer and quick search + +1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status ( History) + +![](data:image/png;base64...) + +1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | +| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | +| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | +| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | + +1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/edited. + +#### Post-condition + +1. User able to proceed to Campaign Rule Set-up. See section>>>>> + +#### Exception flow + +1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. + +### Pool Definition + +#### Requirement Definition + +1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. +2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. +3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. +4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. +5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). +6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Reward pool is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to view/update or approve these records. +2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). +3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). +4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1- Empty page + +![](data:image/png;base64...) + +Figure 2- Listing page + +![](data:image/png;base64...) + +Figure 3- Filter + +1. Detail view + 1. Pool detail + +![](data:image/png;base64...) + +* 1. Record history + +![](data:image/png;base64...) + +* 1. Pending record + +![](data:image/png;base64...) + +1. Create/Edit form + 1. General information + +![](data:image/png;base64...) + +* 1. Product Specific Expiry + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Velocity Control + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| Seq | Field (EN /VN) | Description | | Type | +| --- | --- | --- | --- | --- | +| **Statistic information** | | | | | +| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | +| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | +| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | +| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| **Step 1: General information** | | | | | +| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | +| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | +| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | +| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | +| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool_Conversion_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | +| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | +| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | +| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account_Type_Group table). Refer “Account Type Group” API under “Campaign Management” | +| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | +| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | +| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product_Account_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | +| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product_Account_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | +| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | +| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | +| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | +| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | +| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | +| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | +| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | +| **Effected Campaign Rule listing linked this reward pool** ![](data:image/png;base64...) | | | | | +| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN_TC_LINKAGE table | +| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | +| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | + +1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each reward pools to be added/edited. + +#### Post-condition + +1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. +2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. +3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. +4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). + +#### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Pool Conversion Rate + +#### Requirement Definition + +1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. +2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. +2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +1. Detail view + 1. Detai view + +![](data:image/png;base64...) + +Figure 1 - Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +* 1. Record status + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +1. Create/Edit form + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2 – Currency Rate + +#### Business Rules + +1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. +3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 +4. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. +5. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | +| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | +| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | +| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | +| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | +| | Effective End Date\*/ Ngày kết thúc | + +#### Post-condition + +* 1. User able to proceed Pool Definition setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Definition + +#### Requirement Definition + +* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. +* The Counters can then be referenced in Campaign Rules are criteria. +* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. +* A Counter is structured + + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. + + The cut-over from one period to the next can be: + - 1. Automatic based on the Transaction Date or the Batch Date, or + 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” +* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. + + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. + + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” + + A new “current” bucket is automatically created by subsequent updates. +* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 + + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules + + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month + + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. + +#### Process flow + +![](data:image/png;base64...) + +#### Trigger + +* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. +* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 +* For example: + + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter + + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter + + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter + +#### Pre-Condition + +N/A + +#### Wireframe + +* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition_Grid.png](data:image/png;base64...) + +* Use the search filter to locate the counter required: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition- filter.png](data:image/png;base64...) + +* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition.png](data:image/png;base64...) + +* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail.png](data:image/png;base64...) + +* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail2.png](data:image/png;base64...) + +#### Business Rules + +The key data entities making up Counter are defined in the following table: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | +| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | +| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | +| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | +| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | +| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | +| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | +| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | +| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | +| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | +| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | +| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | +| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | +| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | +| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | +| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | +| **Validation:** - If the Counter Id already exists counter value (counter_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter_stock table. | | | | + +#### Post-condition + +* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: + +[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) + +1. Late counter transaction posting + +**When late transaction is comming:** + +If "Late Transaction Posting Option" = "Update Late Value" + +& State! = C then update + +Else if "Late Transaction Posting Option" = "Update Current Bucket" + +& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. + +**Scenario: ![](data:image/x-emf;base64...)** + +#### Exception flow + +### Transaction Category + +#### Requirement Definition + +* 1. Transaction Category help business can define each processed transaction under pre-defined category. + 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. + 3. **Business case:** + +3.1 Enrollment Program + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | +| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | +| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | +| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | +| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | + +If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. + +Therefore If the 4 conditions are are captured as transaction category then we have: + +TxCat1 = Dining txns, local currency + DCC + +TxCat2 = Entertainment txns, local currency + DCC + +TxCat3 = Dining txns, foreign currency + not DCC + +TxCat4 = Entertainment txns, foreign currency + DCC + +To archive this campaign, when define the transaction category we just need: + +* One counter under Account-TxnCat couter level +* One CEP rule to extract counter value to trigger award rule to get award points/cash back. +* One Campaing Rule using F6 to fulfilment this requirement. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup + +#### Sktech + +* + - 1. Create/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. +2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same category. +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **General information** | | | | +| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | +| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | +| | Description/Mô tả | Description for refer only | X(100) | +| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | + +#### Post-condition + +* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. + +#### Exception flow + +### Account Type Group + +#### Requirement Definition + +* + - 1. An account type is a combination of Product account level and product account type. + 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) + 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. + 4. There is no ATG checking for redemption and negative adjustment. + 5. An ATG Sequence number is assigned to each Account Type in an ATG. + 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New account type is coming then need to be added this account under ATG of reward pools. +2. Some points need to be corrected for existing ATG. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to can view/update or approve these records. +2. Account type which apply for ATG have to be actived on OLS. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Listing page + +![](data:image/png;base64...) + +Figure 2- Filter + +* + - * 1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status (history) + +![](data:image/png;base64...) + +* + - * 1. Create/Update form + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. + 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): + 4. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | +| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | +| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | +| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | +| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | +| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. ![](data:image/png;base64...) | | | | +| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool_Definition table where ATG of the pool is selected ATG. | +| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | +| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign_Rule table by specific pool Id | +| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign_Rule” table by specific Campaign Rule ID~~ | +| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign_Rule” table by specific Campaign Rule ID | + +#### Post-condition + +1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: + 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. + 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). + 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. + 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. + +* Example of an ATSP comprising 2 Account Types + +ATSP Id PA Level PA Type Sequence Number + +| 11 | | 830 550 | | 10 | + +| 11 | | 830 630 | | 20 | + +When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account + +*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. + +*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. + +1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: + +* A = set of all Acct Types of Cust +* B = set of Acct Type in ATG of Pool +* C = Intersection of A and B + +**Therefore**: + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. + +**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. + +1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. + +* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. +* If CIF number is provided only then TP base on following process to find eligible account to process: + +A = set of all Acct Types of Customer + +B = set of Acct Type in ATG of Award Pool + +C = Intersection of A and B + +**Therefore:** + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. + +**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. + +1. ATG is used to validate blocked transaction. +2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Reward Campaign + +#### Requirement Definition + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. +3. A single transaction can trigger multiple concurrent award programs. +4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +5. Type of campaign in OLS: + +* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: + +![](data:image/png;base64...) + +* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: + +![](data:image/png;base64...) + +1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. + +#### Wireframe + +Refer wireframe on figma. + +#### Business rules + +* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) + +1. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) +2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Create/Edit mode** | | | | +| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | +| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | +| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | +| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | +| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | +| | **Campaign Target** | | | +| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | +| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | +| **View mode: Display all field of create mode and add following fields:** | | | | +| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | +| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | +| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | + +#### Post-condition + +#### Exception flow + +### Reward Campaign Rule + +#### Requirement Definition + +* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. + 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. + 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. + 4. In this version we support following Campaign Rule type: +* Award +* Redeem +* Adjust +* Item Redemption +* Counter Extract and Process +* Redeem Extract and Process +* Transaction Extract and Process + 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust + +#### Process flow + +#### Trigger + +#### Pre-condition + +* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. + +#### Wirefame + +Refer to Figma. + +#### Business rule + +* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe + 3. Campaign Rule Screen can be display as a submodule of Campaing module as well + 4. **Screen description for Edit/Create mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Choose rule type to configurate campaign Rule** | | | | +| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool_Definition" table. Refer "Pool Definition" API under Campaign Management. | +| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | +| **Step 4: Formula setting** | | | | +| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | +| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code_Management" table where code type is "amt-to-use-formula" | +| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | +| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | +| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | +| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | +| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | +| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | +| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | +| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | +| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | +| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | +| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | + +#### Post-condition + +Amount to use feature with Transaction Processing. + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Exception flow + +### Campaign Rule Criteria + +#### Requirement Definition + +1. Rule criteria are divided into 5 categories for ease of maintenance: + +| | | | +| --- | --- | --- | +| Customer | Account | Transaction | +| Atttribute | Counter | Merchant | + +1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Exsiting Campaign require at least one campagin rule validate criterions. + +#### Pre-Condition + +1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== + +![](data:image/png;base64...) + +1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. + +#### Wireframe + +![](data:image/png;base64...) + +Figure 1 - Query builder + +![](data:image/png;base64...) + +Figure 1 – Rule criteria + +![](data:image/png;base64...) + +Figure 2- Drag criteria into Rule + +![](data:image/png;base64...) + +Figure 3 – Rule criteria screen after complete setup + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). +2. OLS system will use Query Builder to build query for Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same campaign rule. +4. **Screen description:** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | ![](data:image/png;base64...) | Click to add new criteria | Button | +| | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. ![](data:image/png;base64...) | Action | +| | ![](data:image/png;base64...) | Click to delete criteria | Button | +| | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | +| | Criteria | **Criteria Structure:** **![](data:image/png;base64...)** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | + +1. **Right panel** + +In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. + +Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== + +Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== + +**Some use case for each criteia group:** + +| | | | +| --- | --- | --- | +| **Index** | **Use case** | **Criteria group** | +| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | +| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | +| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | +| | MCC group Store group Chain group Corporation group | Transaction criteria | +| | ATG criteria | Account Criteria | +| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | + +1. **Query builder structure** + +*For example:* + +*+ Account type criteria has data type as string and filter value is account type list from PRODUCT_ACCOUNT_TABLE.* + +*+ Transaction description criteia has data type as string but filter value is enterted by user.* + +*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | +| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: ![](data:image/png;base64...) | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | +| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. ![](data:image/png;base64...) | +| | Is empty ( NULL) | This condition checks whether the comparison value is empty. ![](data:image/png;base64...) | MUST not display filter value field and input type | +| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. ![](data:image/png;base64...) | +| | Contains | This condition checks whether the comparison value contains the filter value. ![](data:image/png;base64...) | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example ![](data:image/png;base64...) | +| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. ![](data:image/png;base64...) | +| | Is in | This condition checks whether the comparison value is in one of the filter value. ![](data:image/png;base64...) | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example ![](data:image/png;base64...) 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | +| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. ![](data:image/png;base64...) | +| | Begins with | This conditon checks whether the comparison text begins with the filter value. ![](data:image/png;base64...) | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example ![](data:image/png;base64...) Should not be case sensitive | +| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. ![](data:image/png;base64...) | +| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. ![](data:image/png;base64...) | +| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. ![](data:image/png;base64...) | +| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. ![](data:image/png;base64...) | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. ![](data:image/png;base64...) | +| | Is less than (<) | This condition checks Comparison value is less than filter value. ![](data:image/png;base64...) | +| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. ![](data:image/png;base64...) | +| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. ![](data:image/png;base64...) | +| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. ![](data:image/png;base64...) | +| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) ![](data:image/png;base64...) | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* ![](data:image/png;base64...) *For example 2: Customer’s birthday from Jul 01 to Jul 15* ![](data:image/png;base64...) | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | +| | Is fixed date | This condition checks whether the comparison value is equal to filter value ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | +| | Is null | The comparison value must be null value | There is no filter value | +| | Is not null | The comparison value must be null value | +| | Is betweenperiod from N (min to max value). | ![](data:image/png;base64...) **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* ![](data:image/png;base64...) ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) ![](data:image/png;base64...) ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** ![](data:image/png;base64...) | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | +| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | +| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | +| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | + +#### Post-condition + +* 1. User able to proceed next step to complete campagin rule setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Campaign Rule Formula + +#### Requirement Definition + +1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. +2. Sometimes we was using campaing formula to update the counter value or attribute value as well. +3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +See more detail in attached file + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Post-condition + +#### Exception flow + +### Campaign Rule – Contributor Settings + +#### Requirement Definition + +1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. +2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Campaign require a list of Contributors configured for the Rule. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. +2. The merchant as a “contributor” of the award transaction should availble on OLS system. + +#### Wireframe + +* + 1. Contributor setting + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. + +1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Type** | +| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | +| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | +| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | +| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | +| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | +| | ![](data:image/png;base64...) | Clicking Click on the “![](data:image/png;base64...)” icon removes the Contributor row | Button | + +1. The total contribution must be 100%. +2. Contributor must be uinique on each campaign rule. +3. If contributors are configured then must have one and only one contributor is “absord remider”. +4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) + +#### Post-condition + +* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Extract & Process (CEP) Request + +#### Requirement Definition + +* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. +2. All drop-down value must avaiable in the system. + +#### Wireframe + +Please refer figma to get more detail. + +#### Business rules + +* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | +| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter_Definition" table. Refer "Counter Definition" API under Campaign Management | +| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | +| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | +| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | +| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | +| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | +| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | +| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: + 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== + 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== + 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== + +| | | | | +| --- | --- | --- | --- | +| | **Counter Bucket To Extract** | | | +| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | +| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | +| * Monthly on Day N of Month | +| * Statement Cycle Date | +| * N Days after AOD | +| * Annually, on Day N of Month M | + +* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run + 2. Counter state is update when CEP extract based on Counter definition setup : + + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. + + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. + + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. + +#### Exception flow + +N/A + +### Redemption Extract & Process (REP) Rule + +#### Requirement Definition + +1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. +2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. +3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. + +#### Process flow + +#### Trigger + +* + - 1. The campaigns require the system automation extract the pool balances. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +* + - 1. Please help to refer on the figma. + +#### Business rules + +* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool_Definition” table. Refer “Pool Definition”API under Campaign Management | +| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | +| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | +| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction_Code”table Refer “OLS Transaction Code” API under Campaign Management | +| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | +| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | +| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually/Hàng năm | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | +| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +REP batch job extract balance based on REP rule type configure. + +=tbd== + +#### Exception flow + +### Item Redemtion Rule Type (ITRD) + +#### Requirement Definition + +Item redemption Rule Type is used to to evaluate item redemption transactions. + +The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. + +Redemption pool which be used to redeem wil be configured in item price instead. + +#### Process flow + +Update later + +#### Trigger + +If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +Please refer Award Rule Type. + +#### Business rules + +* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". + 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | + +#### Post-condition + +To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Transaction Rule Analysis (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +### Campaign Insight + +#### Requirement Definition + +* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. + +#### Process flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. +2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. +3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. +4. OLS support following chart: + +##### Top 10 Best customer of the campaign + +* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter key** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | +| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | +| **Layout:** ![](data:image/png;base64...) | | | +| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | +| | View all | Use scroll bar to view full list top 10 best customer. | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | + +##### Number of enrrolled customers not - eligible because of criteria + +This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. + +Dashboard descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | +| **I: Layout 1** ![](data:image/png;base64...) | | | | +| **Filter key** | | | | +| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | +| | Period | | Last 12 months | +| **Layout description** | | | | +| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | +| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | +| **II : Layout 2** ![](data:image/png;base64...) | | | | +| **Filter** | | | | +| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | +| **Layout description** | | | | +| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | +| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last_update_date of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | + +##### Number of enrolled customers eligibe vs not- eligible because of criteria + +This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. + +1. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Descriptions** | +| **Filter** | | | +| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | +| | Period | Last 12 months | +| **Layout:** ![](data:image/png;base64...) | | | +| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | +| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | +| **Data source** | | | +| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS_ORPHAN_TXN_NO_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | + +##### Earned points Vs redemmed points + +* + 1. This chart used to compare total earned point with total redeemed point during each selected period. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | +| **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | +| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | +| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | + +##### Redemptions point on each channel + +* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Icon ![](data:image/png;base64...) | Icon for each channel: Item redemption Automation redemption Pay with Points. | +| | Total redemmed points and rate ![](data:image/png;base64...) | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | + +##### Redemption on each item type + +* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | +| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | +| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | + +##### Customer’s activities + +* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. + 2. **Dashboard descriptions** + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Month | Last 12 months | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | +| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | +| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | +| **Data source** | | | +| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last_update_date in OLS system to determine period. | | + +##### Campagin statistic + +* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter: Just use for detail listing only** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | +| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Campagin statistic ![](data:image/png;base64...) | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | +| | Detail listing ![](data:image/png;base64...) | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | +| **Data source** | | | +| | Get data from TRANSACTIONs table for number of customers/ total spending and awarded points Get data from CAMPAIGN table for target value. Use transaciton date to determine period. | | + +#### Post-condition + +* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. + +#### Exception flow + +N/A + +### One tester (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +## Customer management + +### Customer profile + +#### Requirement Definition + +1. OLS administration screens include a “Customer Profile” function to view Customer details. +2. Customer records are view-only, and can only be updated from source systems by batch ==TBD=== + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. User want to verify/ get customer’s information. + +#### Pre-Condition + +1. User have to have the access right on both “Customer Profile module under “Customer Mangement” Group. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + - * 1. Filter + +![](data:image/png;base64...) + +* + - * 1. Create/Edit mode + +1. ![](data:image/jpeg;base64...) + * + - 1. Detail view + +![](data:image/png;base64...) + +#### Business rules + +1. Click on Customer Profile icon in Main Menu to list customer records, as illustrated in the [wrireframe](#_Wireframe_13). +2. Use the filter to locate particular customer, which will be listed in the display. +3. Click on a row to view details of the customer record, as illustrated in the [wireframe](#_Wireframe_13). +4. Filter description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Filter** | | | | +| | Quick search | As common function, OLS allows find customer record by quick search function. Put and press enter any key related to these field to find data. | | +| | Gender / Giới tính | If Gender are provide then just get customer who have selected gender If gender are not provided then get all customer | Drop -down Allow multiple select | +| | Country Origin /Quốc gia | If Country are provide then just get customer who have selected Country Issused If Country are not provided then get all customer | Drop -down Allow multiple select | +| | Date of Birth/Ngày sinh | Find customer who have day of birth matched with selected date | Date Time picker | +| | Card number/ Số thẻ | Find customer who have the account of inputed Card number | Text box | +| | Account number/Số tài khoản | Find customer who have the inputed Account | Text box | + +1. **Screen description** + +Screen description at create/edit mode + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: Customer Profile / Hồ sơ khách hàng** | | | | +| | CIF number \* / Số CIF | Unique CIF Number assingn to each customer. | X(30) | +| | Frist Name \*/ Tên | Customer First Name | X(50) | +| | Last Name \* / Họ | Customer last name Frist Name + Last Name will be customer Name which will be stored in database for refering | X(50) | +| | Date of Birth\*/ Ngày sinh | Customer birth date | Date | +| | Registration Date/ Ngày đăng kí | The date customer open an account | Date | +| | Gender / Giới tính | Customer Gender | Drop-down Select one Lookup value from Code_Management table where code type is “gender”. Refer to “get-type-by-code”API under Master data | +| | Customer Status \*/Trạng thái khách hàng | Customer status | Drop-down Select one Lookup value from Code_Management table where code type is “customer-status”. Refer to “get-type-by-code”API under Master data | +| | Customer Block Code | Customer block code | X(10) | +| | Marital Status/ Tình trạng hôn nhân | Customer marital ima status | Drop-down Select one Lookup value from Code_Management table where code type is “marital-status”. Refer to “get-type-by-code”API under Master data | +| | ID Type/ Loại ID | ID Type of cardholder ID | Drop-down Select one Lookup value from Code_Management table where code type is “cardholder-idtype”. Refer to “get-type-by-code”API under Master data | +| | Cardholder ID/ Số ID | Cardholder ID Condition field. This field is required when Cardholder type is selected otherwise this will be optional field. | X(30) | +| | Country Origin/ Quốc gia | Customer country orgin | Drop-down Select one Lookup value from “Country” table. Refer “Country Code” API under Code Maintenance | +| | Customer Income/Thu nhập | Customer income | 9(14,2) Should be greater than or equal to 0 if provided | +| | Datetime of maitenance date/ Ngày cập nhật thông tin | The sysdate to create/update record via OA screen. The maintenance date from request if input via batch job | Datetime The date format must adhere to the configured format Display for view mode only | +| | Profile Picture /Ảnh hồ sơ | Drag or drop photo Or Browse file to upload image file | | +| **Step 2: Contact Detail/ Thông tin liên hệ** At least one contact detail record should be provided Each customer can have more than one contact detail information such as customer contact and guardian contact…. | | | | +| | Addess Type\*/ Loại địa chỉ | Adress type A drop-down list to select one of following address: Home Address Business Address Shipping Address Billing Address | Drop-down Select one Address type should be unique on each customer | +| | Phone number\*/ Số điện thoại | Phone number | X(30) | +| | Email Address\*/ Địa chỉ Email | Email Adress This field must be under email format | X(50) | +| | Address 1/ Địa chỉ 1 | The main address | X(100) | +| | Address 2/ Địa chỉ 2 | Other address | X(100) | +| | State/Tỉnh-Khu vực | State | Drop-down Select one Lookup value from “State_Code” table Refer to “State code” API under Code maintenance | +| | City/ Thành phố | City | Drop-down Select one Lookup value from “City_Code” table Refer to “City code” API under Code maintenance | +| | Zip Code/ Mã bưu điện | Zip code/postal code | Drop-down Select one Lookup value from “ZIP_CODE” table Refer to “Zip Code” API under Code Maintenance | + +* 1. **Processing** + + If a request is adding a record which whose CIF # locates an existing Client record in OLS with record Status = “A”, the incoming record will be rejected. + + If a request is updating or deleting a CIF # that does not locate an existing Client record with record Status = “A” in OLS, the request will be rejected. + + If a request is deleting a CIF# that locates a Client record that is linked to one or more Account that is still active in OLS, the request will be rejected. + + When new customer is added in OLS then: + ++ Customer record is added in both Client and Client_corr table. + ++ The corresponding LOYALTY_ACCOUNT is created. + +* + - When customer is deleted then: + ++ Logically delete the record by moving it to History table. + ++ Locate record in LOYALTY_ACCOUNT and move that to History table. + +* + - Records added thru this screen cannot be updated by records from the OLS batch. Record created/updated by OLSCUST batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + 1. **View mode of active record is display as customer 360 which is described** **in section 5.2.** + +#### Post -condition + +* + - * 1. Able to access submodule in customer management module which will be described more detail as following section. + +#### Exception flow + +N/A + +### Customer 360 + +#### Requirement Definition + +1. OLS administration screens include a “Customer 360” function to view Customer details. +2. Customer 360 contains key information about customer. User can use it as a strategy guide to creating personalized experiences. + +#### Process flow + +N/A + +#### Trigger + +N/A + +#### Pre-condition + +1. User need to have the access right in Customer Profile module in order to able to view this dashboard. +2. User must select a customer in customer profile listing page to bring up the customer dasboard. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business Rules + +1. Clicking on the chart icon at the top of the main Customer list page will toggle between the Customer list view and the Customer dashboard view. +2. Customer dashboard update constantly, giving user a real-time view of customer behavior and information. +3. Click any customer record in listing page to see the customer profile of each customer. +4. **OLS support following information:** + +##### Customer information + +![](data:image/png;base64...) + +* + 1. Click “See profile details” to see customer profile detail. The system bring up the screen as pop-up screen for customer profile as illustrated as following: + +![](data:image/jpeg;base64...) + +1. User can edit/delete customer from this screen. + +##### Customer’s rewards statistic + +![](data:image/png;base64...) + +* + 1. This part displays statistical indicators related to the customer's rewards. OLS introduces 2 indicators: + ++ Points: The customer’s total available points. Use sysdate to determine the balance bucket periods. + ++ Cash back: The customer’s total available cash back. Use sysdate to determine the balance bucket periods. + +##### Account / Card information + +* + 1. The Customer’s account holdings and all of the customer’s card are displayed, regardless of whether account or card number is used. + 2. **The Account/ Card information listing give user have a general overview of customer’s cards:** + +**+ A = Set of card list of all account in the selected customer** + +**+ B= Set of card lists for the specifically selected customer.** + +**Therefore C= Card in listing page = Distinct cards from the union of A and B** + +* + 1. **In case account there is no card is added then just show the account list of selected customer.** + 2. Quick shortcut to support adding new Card or new Account from this screen. + 3. Detail listing description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Filed** | **Description** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| | Account type\*/Loại tài khoản | The combination of Product Account Level and Prodcut Account Type of customer. All Customer’s account holding are displayed here. | Display | +| | Account Number\* /Số tài khoản | Product Account No. | Link Click on each Account number to bring up the Account Detail screen to see more about this account. See more on [Account](#_Account) section | +| | Card Number/Số thẻ | Card number | Link Click on each Card number to bring up the Card Detail screen to see more about this card. See more on [Card](#_Card) section. | +| | CIF Number\*/Số CIF | CIF number of card will be the same as selected CIF number for Principal card For supplement card then this is CIF number of Card instead CIF Number of Account. | Display | +| | Card Status/Trạng thái thẻ | Card status | Display Lookup value from Card table | +| | Card indicator/Chỉ thị thẻ | Card indicator | Display Lookup value from Card table | +| | Card block code/Mã chặn tài khoản | Card block code | Display Lookup value from Card table | +| | Card expiry date/Ngày hết hạn thẻ | Card expiry date | Display Lookup value from Card table | +| | Account block code/Mã chặn tài khoản | Account block code | Display Lookup value from Product_Account table | +| | Account status\*/Trạng thái tài khoản | Account status | Display Lookup value from Product_Account table | +| | Account Open Date\*/Ngày mở tài khoản | Account Open Date | Display Lookup value from Product_Account table | + +##### Transaciton statistic + +A combination of two charts is used to describe the transaction statistic for selected period of a customer. + +The line chart describes the fluctuations in a customer's balance for the selected pool over a specified period. + +The combo chart illustrates the relationship between the total number of transactions and the total number of transacted merchants for the selected pool over a specified period. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | | +| **Filter** ![](data:image/png;base64...) | | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months 4. Last 6 months Default as “This month” This filter is apply for both graph | | +| | Pool | Mandatory field Allow multiple select Lookup value from Pool Defintion Display Pool ID and Pool Name per each pool. This filter is applied for left graph only | | +| | Account type | Drop-down list to select combination of PAT and PAL. Allow multiple select. This filter is applied for right graph only | | +| | MCC | Drop-down list to select MCC of the transaction. Allow multiple select Display code and description per each MCC This filter is applied for right graph only | | +| **Line chart** **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Vertical axis | Total point each selected period/ selected pool Each line is assinged for one transaction type. | | +| | Horizontal axis | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. If Period “Last 6 months” is selected then horizontal axis is including last 6 months from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points/ adjusted points for the date range/time frame defined. | | +| **Data source** | | | | +| Get data from the TRANSACTION table with transaction type = “Award” for earned points/Transaction type = “Redeem” for redeemed points / Transaction type =’ Adjust” for Adjusted points during each selected month on the selected pool. The transaction should not be a cancellation transaction. Use the transaction date to determine the period. | | | | +| **Combo chart** Layout ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Left vertical axis | | Total number of transacted merchants during selected period of selected pool Use Bar chart to describe total number per each period | +| | Right vertical axis | | Total number of transaction during selected period of selected pool Use line chart to describe total number per each period | +| | Horizontal axis | | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of transaction for the each day/month Hover over the bar graph to view a count of transacted merchant for the each day/month | +| **Data source** | | | | +| | Lookup value from TRANSACTIONS table Use transaction date to determine period Use Store data as merchant to determine transacted merchant Each OLS Reference No should be one and only transaction. | | | + +##### Customer Activities + +* + - * 1. The all customer activites will be triggerd and displayed here. + 2. Some types of customer activities as following: + 1. Loyalty program + +All OLS transaction of customer such as: + +* + - Enrolling in and participating in OLS loyalty programs. + - Redeeming points + - Transfer points + - Earn points + 1. Feedback and Review + + Leaving customer’s feedback on the portal app. + 2. Email engagement + + Receive email from OMR + 3. Account management + +Refering to all bellow action in portal app such as: + +* + - Updating customer information, such as contact details, payment methods, and preferences. + - Password resets and login activity. + +1. Allow user filter data by time frame (Start date and End date). +2. Layout + +![](data:image/png;base64...) + +##### Customer Segmentation + +* + - 1. Deviding the customer base into segmentation groups based on specific characteristics, behaviors and demographics. + 2. Introduce the criteritions on each segmentation group and the conditons to meet each criterion. Based on this, OLS introduce a program to collect data and devide customers into each segment. + 3. Demographic segmentation includes following segment: + 1. Gender: Famale or Male + 2. Age: Teenager / Adult/ Middle- Aged person/ Senior Citizens: Based on criteria (Age’s range) to devide customer’s age. + 3. Matirial Status: Single or Married + 4. Income: Low / Medium / High: Based on criteria (customer’s income range) to devide icom segment. + 5. Layout + +![](data:image/png;base64...) + +1. Behaviors segmentation includes following segment: + 1. Frequency of purchase: Daily / Weekly/Montly..: Based on the frequency of the transaction to devide this segment. + 2. Membership class: Depending on the organization, business. Some common types of membership class: + * Basic membership + * Premium membership + * Platium membership + * Gold membership + * Daimon membership + * VIP membership + 3. Purchase channel: Categorizing customers based on customer’s preferred purchase channels, such as in-store, online, mobile app, or phone (Call to call center)… + 4. Hobby: Based on customer’s hobby to create siutable loyatly program. + +6. Layout + +![](data:image/png;base64...) + +##### Most Redemmed Items + +The top 10 (this value should be configurable value) redeemed items of the customer are displayed here. + +Just show top 5 item on each page. + +Each row contains a summary for an item, including the item code, the total redeemed quantity, and the redeemed points/cash amount to use for the specificed period. + +Shortcut to support quick add new item redemption transaction from this screen. + +Listing page description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| F**ilter** | | | | +| | Period | Period used to filter data. | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. Today 2. This month 3. Last month 4. Last 3 motnhs Default as “To day” | +| | Item type | Optional field The drop-down to select item type to get top N item. If item type is not provided then top N of all item type will be displayed. | Drop down Multiple select Default Evoucher type | +| **Listing page** | | | | +| | Item code/Mã vật phẩm | Item code | Display Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Item Name/Tên vật phẩm | Item Name | Display Lookup value from ITEM table | +| | Category/ | The categories are assigned to item | Display Lookup value from Item table Each item can be assinged more than one category | +| | Quantiy/Số lượng | Total redemmed quantity of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Redemmed points/ Điểm đã sử dụng | Total redemmed point of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Cash Amount used/Tiền đã sử dụng | Cash used to redeem | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| **Data source** | | | | +| | Lookup value from CAT_CATALOGUE_TRANS_DETAIL table Use Post_Date to determine period Order by quantity descending order. | | | + +##### Balance information + +1. The all customer’s pool balances are displayed here. +2. Each row contains the summary for a Pool: the total balance (sum of all buckets in a Pool), redeemable balance and the expiry date of the earliest expiring bucket. +3. Listing page descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| Layout ![](data:image/png;base64...) | | | | +| **Fitler** | | | | +| | Pool | Optional field A drop-down to select the reward pools, which quickly retrieves the customer's balance. If Pool is provided then the system display all balance of the selected pool of the customer. If pool is not provided then all pool balance of the customer are displayed. | Drop –down Default as empty Multiple select Lookup from pool definition screen Display only the pools with a non-zero balance. | +| **Listing page** | | | | +| | Pool ID/Mã pool | Pool ID | Link Click on the pool id to bring up the “[Pool Balance Enquiry](#_Balance_Detail_Enquiry) ” detail view of this pool. | +| | Pool Name/Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Balance/Số dư | Sum all balance buckets of a pool of customer. | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of a pool of customer. The bucket should have: Start date <= Processing date <= Expiry date | Display as number format Lookup value from LAB table | +| | Earliest Exp Bal and Date/ Số dư gần nhất | The earliest expiring bucket date for a pool, for non-0 balance buckets. And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | + +#### Post – condition + +* + 1. User can use it as a strategy guide to creating personalized experiences.. + +#### Exception flow + +N/A + +### Account + +#### Requirement Definition + +Account tab show all customer’s holding account. + +Account information means anything relating to customer’s holding acccount which sent from external system to OLS or Added by user via OLS system. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-condition + +1. Users have to have access rights in both “Customer Profile” and “Account” modules under “Customer Mangement” Group in order to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Account” tab. +3. An account type must be available in the OLS system before adding any account of that type. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +Add/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business Rules + +Account records are updated in the external system and then loaded into OLS. + +Account records can be added by adding functions in administration screens. + +Click on the Account tab in the Customer profile screen to bring up the Account listing as illustrated in the [wireframe](#_Wireframe_4). + +Use the filter to locate a particular Account, which will be listed in the display. + +Click on a row to view details of the Account record, as illustrated in the [wareframe](#_Wireframe_4). + +Screen description + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | | | **Data type** | +| | CIF numnber\* / Số CIF) | CIF number of selected customer | | | Display | +| | Product Account Level (PAL) \* /Hạng tài khoản | Product Account Level of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_LEVEL table Refer to “ Product Account Level” API under “Code Maintenance” | +| 2. | Product Account Type (PAT)\* /Loại tài khoản | Product account type which belongs to selected PAL that assigned to Account Combination PAL and PAT as Account Type of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_TYPE table where PAL as selected PAL Refer “ Product Account Type” API under “Code Maintenance” | +| 3 | Account Number\*/ Số tài khoản | Product Account Number | | | X(20) Combination Account Type + Account Number should be unique. An Combination Account No + Account Type is assigned to an ASN. ASN is unique in the OLS system | +| | Account Open Date \*/Ngày mở tài khoản | Product Account Open Date | | | Date The date format must adhere to the configured format | +| | Account Indicator\*/ Chỉ thị tài khoản | P- Personal account C- Corporate Account | | | Drop-down Select one Lookup value from “Code Management” table where type code is “Acct-indicator”. Refer “List-by-code-type” API under Master Data. | +| | Account block code/ Mã chặn tài khoản | The account block code is used to check block transaction via TP or on some MQ validation | | | X(10) | +| | Block code reason / Mã lí do chặn tài khoản | Reason to block account | | | X(100) | +| | Block code last update date/ Ngày chặn cuối cùng | The day to block account | | | Date The date format must adhere to the configured format | +| | Cycle / Ngày sao kê | Statement cycle date | | | 9(02) Should be greater than 0 if provided | +| | Account status\*/ Trạng thái tài khoản | Product account status The Account status is used to check block transaction via TP or on some MQ validation | | | Drop-down Select one Lookup value from “Account Status” screen (Account_status table). Refer “Account status” API under Code Maintenance | +| **Card information/Thông tin thẻ** When click to view any active account then this pannel is display to show the card of cards belong to selected account. The pannel includes following information: | | | | | | +| | Card number / Số Thẻ | | Card Number | Display Lookup value from Card_Product_Account_Rel table where account is selected account. Refer “Card” API under Customer Management | | +| | Card status/ Trạng thái thẻ | | Card Status Display both code and description of status | Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-status”. Refer “Card” API and “get-by-code-type” API | | +| | Card Indicator/Chỉ thị thẻ | | Card indicator Display both Code and description of indicator | Display Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-indicator”. Refer “Card” API and “get-by-code-type” API | | +| | Card Creation Date/ Ngày tạo thẻ | | Creation Date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card Expiry Date /Ngày hết hạn | | Expiring date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | CIF number/ Số CIF | | CIF number of Card | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card block code/Mã chặn thẻ | | Card block code | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | + +Each account is belong to only one Customer. OLS don’t support to change CIF number of account in this screen. If have to change CIF number of the account then it should be processed via CIF Merge batch if needed. + +Records added thru this screen cannot be updated by records from the OLSACCT batch. Record created/updated by OLSACCT batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + +When an account is added then: + +* If locate any exiting record with the same combination Account No+ Account Type in OLS (record status is “A”) then the record is rejected. +* If not then: + + - Account record is added in PRODUCT_ACCOUNT table. + - The corresponding LOYALTY_ACCOUNT_PRODUCT is created + +When an account is modified then : + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then update Product Account fields with the incoming field values accordingly. The original record is moved to his table after record is approved. +* Upgrade Account case :==tbd=== + +When account is deleted then: + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected +* If locates a Product Account record that has a Card record with record Status “A” linked to it, the incoming delete action is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then move record into history table. The corresponding LOYALTY_ACCOUNT_PRODUCT is moved to his table as well. + +#### Post – Codition + +* 1. Allow to add Card. + 2. Allow to post transaction with new account. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Card + +#### Requirement Definition + +Card tab show all customer’s card. + +Card information means anything relating to customer’s card which sent from external system to OLS or added by users on the OLS system. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Card” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Card” tab. +3. An account must be available in the OLS system before adding any card of that account. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Create/Edit view + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail record view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business rules + +Card records are updated in external system and then loaded into OLS, so OLS only provides view functions in administration screens for Card records. There is no further actions. + +Click on Card tab in Customer profile screen to brings up the Card listing as illustrated in the [wareframe](#_Wireframe_5). + +Use the filter to locate particular Card, which will be listed in the display. + +Click on a row to view details of the Card record, as illustrated in the [wareframe](#_Wireframe_5). + +Create/Edit screen description + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| | CIF number \*/Số CIF | CIF Number of Card | Drop-down Get data from Client table Default as CIF Number of selected customer but user can modify if Supplement Card is added. Support quick search CIF number by enterd al least 4 digits of CIF number. | +| | Account Type\*/ Loại tài khoản | Combination of Product Account Level and product account type PAT : Visa [001] PAL: Debit [830] Account type : 830-001 | Drop-down Lookup value from PRODUCT_ACCOUNT table where Account Type is Account type of select customer (Use CIF number which is selected from listing page). Refer to “Product account” API under “Customer Management”. | +| | Account number \*/ Số tài khoản | Product Account number | Drop-down All account of selected account type of selected customer. Refer to “Product account” API under “Customer Management” | +| 3 | Card number\* /Số thẻ | Card number | X(20) Must be unique value in whole system. | +| | Masked Card Number/ ==tbd== | Masked Card Number | X(20) | +| | Cardholder Name\*/ Tên chủ thẻ | Cardholder Name | X(50) | +| | Card Indicator\*/ Chỉ thị thẻ | Card indicator: S- Supplement Card P – Principal Card K – Corporate Card …. For principal card then CIF of card must be the same as CIF of Account. | Drop-down Select one Lookup value from “Code management” table where type code is “card-indicator”. Refer “list-by-code-type” API under “Master Data”. | +| | Card status \*/Trạng thái thẻ | Card status The Card status is used to check block transaction via TP or on some MQ validation | Drop-down Lookup value from “Card Status” screen (Card_status table). Refer “Card status” API under Code Maintenance | +| | Card block code/Mã chặn thẻ | Card block code The Card block code is used to check block transaction via TP or on some MQ validation | X(10) | +| | Card activation date /Ngày kích hoạt thẻ | Card activation date | Date | +| | Card creation date\*/ Ngày mở thẻ | Card creation date | Date | +| | Card expiry date \*/ Ngày thẻ hết hạn | Card expiry date | Date | +| | Old Card Number/ Số thẻ cũ. | Old Card Number | Drop-down list Card belong to selected account. In BAU processing, this is the existing card number to be replaced by new Card Number in this record. This field should have a value only if this record is ADDING a NEW CARD NUMBER which is to replace the OLD CARD NUMBER. Both new card and old card should under the same account. | +| | ==tbd== | | | + +1. Records added thru this screen cannot be updated by records from the OLSCARD batch. Record created/updated by OLSCARD batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. +2. When a record is adding with whose Card Number already exists in OLS, the record will be rejected. +3. When a record is adding/updating with whose Account does not exists in OLS, the record will be rejected. +4. When a record is adding/updating with whose CIF Number does not exists in OLS, the record will be rejected. +5. **Processing** + +* Each Card is belong to only one Account and only one customer. OLS don’t support to change CIF number Or Account of Card in this screen. If have to change CIF Numnber of card or account of card then it should be processed via CIF Merge batch if needed. +* When a record is adding with inputed data passed the card record validation then: + + - The card record is added in CARD table. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. +* When a record is updated whose Card Number passes the validations then the Card record and the Card–Account relationship record are updated. Original record is moved to his table. +* When a Card is deleted then the Card record is moved to history table to indicate a logical delete. The corresponding CARD_PRODUCT_ACCOUNT_REL record for this card is also moved to history table. +* For principal card CIF number of account should be the same CIF number of card. +* For replacement case: A new Card issued to the Cardmember in case of loss, theft, mutilation or non-receipt of a Card. Therefore new card is coming to replace old card. When replace card then: + + - Add the incoming record as a new Card record with the same PSN as old card number. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. + - Old Card Number will continue to be processed until the Card Status and/or Block Code is/are updated to make the card ineligible. + - All Attributes, Counters and Pool Buckets which were linked to the old Card number will be automatically linked to the new Card record. + +1. Card listing will be the list card of all account of selected customer. + +#### Post – Codition + +N/A + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Pool Balance Detail + +#### Requirement Definition + +OLS will support Pool balance enquiry as a tab on Customer Profile Screen. + +Pool Balance tab to list a summary of all Pools of the customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to check balance detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Balance Enquiry” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Pool Balance Detail” feature. + +#### Wireframe + +Summary listing page + +* + 1. Listing page + +![](data:image/png;base64...) + +* + 1. Filter + +![](data:image/png;base64...) + +1. Detail view + * 1. Detail view per each pool + +![](data:image/png;base64...) + +* + 1. Click on each row in Pool Balance View to brings up the pop-op detail view + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on Pool Balance tab to list a summary of all Pools of the customer. + 2. All summary of pool balance display in listing page. + 3. This screen just display only. There is no Add/Mofify action on this screen. + 4. Each row contains the summary for a Pool: the total non-balance (sum of all buckets in a Pool), and redeemable balance and the expiry date of the earliest expiring bucket. + 5. Use the filter to locate particular pool balance detail record, which will be listed in the display. + 6. Click on any record to bring up the breakdown of the Pool in that row on the “Pool Balance Detail” Screen as illustrated in the [Wireframe](#_Wireframe_2). + 7. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +* 1. Pool Balance Detail screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| **Pool Balance /Số dư pool** | | | | +| | Pool ID / Mã pool | Pool ID | Display | +| | Pool Name/ Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Pool type/ Loại pool | Pool Type | Display Lookup value from Pool Definition | +| | Pool Entity level / Cấp thực thể pool | Pool Entity level | Display Lookup value from Pool Definition and master data table | +| | Balance / Số dư | Sum all balance buckets of selected pool | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of selected pool The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | +| | Next Expiring Balance/ Số dư hết hạn gần nhất | The earliest non-expiring balance bucket of the selected pool. | Display as number format Lookup value from LAB table | +| **Pool Balance View/ Chi tiết số dư pool** The breakdown of the Pool in that row following: ![](data:image/png;base64...) 1. Each row is a bucket containing the remaining points earned by the Account/Card shown, and expiring on the date shown. Expired buckets but haven’t yet forfeited will be shown as well. 2. If Customer pool level then all Pools buckets of the customer are shown under each speparaty account even it is customer entity-level. 3. If Account pool level then all only the Pool buckets earned by the presented Account will be shown. 4. If Card pool level then only the Pool buckets earned by the presented card will be shown. | | | | +| | Account type/ Loại tài khoản | Combination of Product Account Type and Product Account level of Account | Display Lookup from Product_Account table Lookup from Product_Account number by ASN from LAB table. | +| | Account No/ Số tài khoản | Product Account Number | Display Lookup from Product_Account number by ASN from LAB table. | +| | Card Number/ Số thẻ | Card number | Present for Card pool entity level only | +| | Pool ID/ Mã pool | Pool ID | Selected pool | +| | Balance / Số dư | Non zero balance | Display Loopkup value from LAB table. Group by Expiry date / LA/ASN/CSN/Pool ID | +| | Expiry Date/ Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + +### Transaction History + +#### Requirement Definition + +* + - 1. Transaction History is a tab under Customer profile. + 2. A transaction history is a running record of all of the transactions logged in OLS including cancellation transactions. + 3. Noted that: Transaciton hisstory listing depened on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to check transaction history of customer. + +#### Pre-conditions + +1. User have to have access rights in both “Customer Profile” and “Transaction History” modules under “Customer Mangement” Group in order to view this screen. +2. User must select a customer in customer profile listing page to access the “Transaction History” tab. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + 1. Detail record + 1. Transaction Detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +1. Right panels + * + Quick view desribes expand information for this transaction. + + Click on each item to bring up the according tab + + Support scrollbar for pop-up detail view. + 1. Reward details + +![](data:image/png;base64...) + +* 1. Item Redemption Transaction Details + +![](data:image/png;base64...) + +* 1. Counter Transaction Details + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on Transaciton History tab to list all transaction of the customer as illustrated in the [wireframe](#_Wireframe_3). + 2. One transaction detail record is combination of all input field (assinged to an OLS Reference No). + 3. Transaction history listing all transaction in OLS of customer include cancellation transactions. + 4. This screen just view only. There is no futher action. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Click a listed record to display the details of the transaction as illustrated in the following: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Account Detail/Chi tiết tài khoản** | | | | +| | Account Number/ Số tài khoản | Transacting Product Account Number | Display Lookup value from TRANSACTIONS table | +| | Product Account Type/ Loại tài khoản | Transacting Product Account Type | Display Lookup value from TRANSACTIONS table | +| | Product Account Level/Hạng tài khoản | Transacting Product Account Level | Display Lookup value from TRANSACTIONS table | +| | Card Number/ Số thẻ | Transacting Card Number | Display Lookup value from TRANSACTIONS table | +| **Transaction Detail/ Chi tiết giao dịch** | | | | +| | Invoice No/ Số hóa đơn | Internal invoice No generated by OLS system. | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Reference No/Số tham chiếu giao dịch | OLS Transaction Reference Number | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Source Reference Number | Reference number from source system For refrence only | Display | +| | OLS Transaction Code | OLS Transaction Code | Display Lookup value from TRANSACTIONS table | +| | Gross Amount/ Giá trị giao dịch gộp | Gross transaction amount | | +| | Nett Amount/Giá trị giao dịch ròng | Nett transaction Amount | | +| | Redeem points/Điểm đổi thưởng | Redeem points Total redeem points of the choosen transaction. The total point shoule equal to total redeem points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Redeemed Amount/ Giá trị điểm đổi thưởng | Redemmed point Amount Total redeem point amount of the choosen transaction. The total point shoule equal to total redeem point amount on each campaign rule which will be display on quick view. | | +| | Adjust Points/ Điểm điều chỉnh | Adjustment point Total adjustment points of the choosen transaction. The total point shoule equal to total adjust points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Adjustment Amount/ Giá trị điểm điều chỉnh | Adjustment points amount Total adjust point amount of the choosen transaction. The total point shoule equal to total adjust point amount on each campaign rule which will be display on quick view. | | +| | Award Points/ Điểm thưởng | Earned points Total award points of the choosen transaction. The total point shoule equal to total award points on each campaign rule which will be display on quick view | Display Lookup value from TRANSACTION table | +| | Points Awarded Amount/Giá trị điểm thưởng | Earned points amount Total award point amount of the choosen transaction. The total point shoule equal to total award point amount on each campaign rule which will be display on quick view. | +| | Transaction Date/Ngày giao dịch | Transaction Date Time | +| | Post Date/ Ngày đăng | Post Date | +| | Settlement Date/ Ngày ghi sổ | Settlement Date | +| | Cancellation Indicator/Chỉ thị hủy | Cancellation Indicator | +| | MCC | Transaction MCC Code | +| | Store/ Cửa hàng-đơn vị | Transaction Store ID | +| | Terminal / Cấp thiết bị đầu cuối | Transaction Terminal ID | +| | Transaction Description/Mô tả giao dịch | Transaction Description in OLS or Shop Name from external source system. | +| | Currency Code/ Mã tiền tệ | Currency code of the original transaction amount | +| | Country Code /Mã quốc gia | Country code of the original transaction. | +| | Transaction Mode/ Phương thức giao dịch | Mode of transaction at point of payment | +| | Transaction Channel /Kênh giao dịch | Transaction channel | +| | Salary Credit/ Chỉ báo tiền lương | Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode/ =tbd= | POS Entry Mode | +| | Reason Code/ Mã lí do | Adjustment reason code | For Adjustment transaction | + +1. Quick view in right panel displays the award, redeem, adjust and counter update details of the transaction including the campaign rules applied to the transaction and the Pool Units earned and redeemed. Click on each item to bring up the according tab. + 1. Award/Redeem/Adjust detail: Total balance in right panel should be equal to blanace which is displayed in transaction detail. This quick view displays the reward details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Quy tắc chiến dịch | Campaign rule that transaction has been triggered This value may be empty if transaction does not trigger campaign rule | +| | Transaction Type/ Loại giao dịch | Transaction Type | +| | OLS Transaction Code/Mã giao dịch OLS | OLS Transaction Code | +| | Pool/ Pool | Reward Pool | +| | Pool Unit/ Đơn vị Pool | Award/Redeem/Adjust points Depended on transaction type | +| | Pool Unit Amount / Giá trị đơn vị Pool | Award/Redeem/Adjust points amount Depended on transaction type | + +* 1. Counter Transaction Detail: + + This part displays the counter value, which is updated by the transaction on each campaign rule. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Mã quy tắc | Campaign rule that transaction has been triggered | +| | Counter / Bộ đếm | The counter for that transaction has been updated | +| | Entity / Cấp thực thể | Entity level of counter | +| | Counter Value/Giá trị bộ đếm | Counter Value | +| | Bucket Number/ Bộ đếm số | Counter bucket number which one is updated by this transaction. | +| | Bucket Start Date/ Ngày bộ đếm bắt đầu | The start date of the counter bucket for the updated counter has been changed | +| | Bucket End Date /Ngày bộ đếm kết thúc | The end date of the counter bucket for the updated counter has been changed | + +* 1. Item Redemption Transaction Detail + + This quick view displays the item redemption details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Item / Mã vật phẩm | Item | +| | Descriptions/ Mô tả | Remark of the redemption transaction | +| | Redemmed quantity / Số lượng đổi thưởng | Redemmed quantity | +| | Redeemed points/ Điểm đổi thưởng | Redeemed points | +| | Cash Amount used/Số tiền đã dùng | Cash amount is used to redeem item. | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + +### No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT + +#### Requirement Definition + +* + - 1. In the nearest version, there is no screen to be tracking the transaction which did not trigger campaign rule by some reasons. + 2. In this version, we introduce a new screen under the 'Customer Management' module to track all non-eligible transactions (those that did not meet the rule criteria) or transactions with no linked rules + 3. A 'No-Hit Transaction' is a running record of all transactions sent to OLS to trigger a CP rule but not eligible for a campaign rule or incoming transactions with no linked campaign rule. If an incoming transaction hits Rule A but does not hit Rule B, this transaction will still appear on this screen for Rule B + 4. Noted that: Listing is depending on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - * 1. User would like to verfiy why transaction did not hit campaign rules. + +#### Pre-Conditions + +Incoming transactions trigger campaign but do not hit CP. + +User have to have access rights in both “Customer Profile” and “No hit CP- Transaction” modules under “Customer Mangement” Group in order to view this screen. + +User must select a customer in customer profile listing page to access the “No hit CP- Transaction” tab. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on No Hit CP- Transaction tab to list all No-Hit CP transaction of the customer as illustrated in the [wireframe](#_Wireframe_15). + 2. One transaction detail record is one incoming transaction ( assinged to one Invoice No). + 3. Detail view screen will display all campaign rule which transaction trigger but does not hit. + 4. This screen just view only. There is no further actions. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Lookup no – hit transactions from OLS_ORPHAN_TXN_NO_HIT table for transaction which trigger campaign rule but not meet rule criteria OR transaction no linked any campaign rule. + 7. This screen should desribe detail why transactions do not hit CP rule such as if critertia do not meet then which criteria failed. TP should response detail the error description to can show in this screen. + 8. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Account Information** | | | | +| | CIF Number | Transacted CIF Number If incoming transaction are not provided then lookup by Account/ Card which are provided. | Display | +| | Product Account No | Transacted Product Account Number and combination of Product Account Level and Product Account Type. If Incoming transaction are not provided then lookup by Card Number which is provided | Display | +| | Account Type | +| | Card number | Transacted Card Number | From incoming transaction | +| **Transaction Detail** | | | | +| | Invoice No | Unique Invocie No which generate by OLS system to determine unique incoming transaction. | Display | +| | Transaction Type | Transaction Type of CP rule AWD- Award RED- Redeem ADJ- Adjust | Display | +| | OLS Transaction Code | Transaction code which used to locate CP rule. | | +| | Transaction Date Time | Transaction Date and Time | Display as date time format. The date format must adhere to the configured format From incoming transaciton | +| | Transaction Amount | Transaction Gross Amount from incoming transaction for Award/Redeem transaction Adjust point for Adjustment transction | Display as number format 999,999,999.99 From incoming transaciton | +| | Corporate | Transaction corporate ID Lookup value from transaction store | Display | +| | Chain | Transaction chain ID Lookup value from transaction store | Display | +| | Store | Transaciton Store ID | Display From incoming transaciton | +| | Terminal | Transaction Terminal ID | Display From incoming transaciton | +| | Transaction MCC | Transaction MCC Id | Display From incoming transaciton | +| | Transaction Description | Transaction description | Display From incoming transaciton | +| | Currency Code | Currency code of the original transaction amount | Display From incoming transaciton | +| | Transaction Mode | Mode of transaction at point of payment | Display From incoming transaciton | +| | DCC indicator | DCC indicator From incoming transaciton If empty then mean for non -DCC transaction | Display | +| | Tap2Pay Indicator | Tap2Pay Indicator If empty then mean for transaction is not a Tap2Pay(token) transaction | Display | +| | Token Requestor ID | Token Requestor ID (mobile pay) 3rd party wallet providers (Apple Pay, Samsung Pay, Android Pay etc | From incoming transaciton | +| | Salary Credit | Salary Credit | From incoming transaction Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode | POS entry Mode | From incoming transaction | +| **CP Rule Listing** **Detail error description for each campaign Rule which incoming transaction trigger but do not hit this campaign Rule** | | | | +| | Campaign ID | Campain ID | Lookup value by Campaign Rule ID | +| | Campain Rule | Campaign Rule ID | Display | +| | Pool ID | The reward pool of campaign rule | Display Lookup value by Campaign Rule ID | +| | Error Code | Error response code from OLS | Display | +| | Error Descriptions | Error response description | Display | + +Post-condition + +* + - 1. User can adjust incoming transaciton to meet Campain Rule or explain to customer why they do not get reward. + +#### Exception flow + +N/A + +### Statement + +#### Requirement Definition + +* + 1. Statement Enquiry is a list of all transactions for a customer/ account over a set period, usually monthly. The statement includes earned, redeemed and adjusted, as well as the beginning and ending balance for the period, along with any interest earned. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to review/verify statement detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Statement Enquiry” modules under “Customer Mangement” Group in order to this screen. +2. User must select a customer in customer profile listing page to view customer profile and access the “Statement Enquiry” tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* + 1. OLS statement output support Customer level and Account level, however statement records will be stored under Account level therefore Statement Enquiry show under Account level for both Statement Pool Entity level. + 2. Statement Enquiry includes all active statement records of statement pool. + 3. Statement records are updated by OLS batch jobs, so in administration functions (OA) only provides view in screens. There is no further actions. + 4. Click on Statement Enquiry tab to list all statement records of the customer as illustrated in the [wireframe](#_Wireframe_6). + 5. Click a listed record to display the details of the transaction as illustrated in the [wireframe](#_Wireframe_6). + 6. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Statement detail** | | | | +| | Loyalty Account Number | Loyalty Account Number | Display Lookup value from STATEMENT table | +| | Product Account Number | Product Account Number | Display Lookup value from PRODUCT_ACCOUNT table by ASN in Statement table. | +| | Account Type | Combination of Product Account Level and Product Account Type | +| | Pool ID | Statement Pool | Display Lookup value from STATEMENT table | +| | Cycle start date | Cycle start date time Provious statement cycle | +| | Statement Opening balance | Previous Statement Points Balance | +| | Total Award | Total earned points in this cycle | +| | Total Redeem | Total redemmed points in this cycle | +| | Total Adjust | Total Adjusted points in this cycle | +| | Statement Closing Blance | Accumualted points | +| | Expired points | Balance in expired buckets which have not yet been forfeited | +| | Last transaction Date | Last transaction post date on this cycle | +| | Cycle statement date | Cycle statement date time | +| **Transaction Detail** This part display all transaction of account/customer on each cycle. ![](data:image/png;base64...) Get data from TRANSACTION table where: * + 1. LA is LA of customer statement records. 2. Pool ID is statement pool 3. ASN is ASN of Account statement records. 4. Post date from Cycle Start Date upto Last Transaction Date 5. Without cancellation transaction 6. Points are not equal to 0 | | | | +| | Reference Number | OLS Reference Number | Display | +| | Transaction Type | Transaction Type of this transaction | Display Lookup value from Transaction table | +| | Unit | Earned/ Redeemed/Adjusted point Depended on transaction type Group by Reference No,Post Date,Transaction date and Txn type | +| | Post Date | Post Date time | +| | Transaction Date | Transaction Date Time | + +#### Post – Condition + +N/A + +#### Exception flow + +N/A + +### Attribute + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according attribute: + 1. Customer profile screen dislays customer information and Customer attribute lisitng. + 2. Account Detail screen dislays Account information and Account attribute of customer. + 3. Card detail screen displays Card information and Card attribute of customer. + 1. In new OLS version Attribute will be displayed on separately tab under Customer profile module. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. User would like to review/ verify attribute detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Attribute” modules under “Customer Mangement” Group to able to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Attribute Enquiry" tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. Get data from ATTRIBUTE_VALUE table. The attribute values inserted/update form OLS batch process (Attribute maintenance batchs or OMR batch job) OR can be updated by the Attribute maintenance batch as well as by Campaign Rules. + 2. This screen just display atribute value only. There is no further action. + 3. The Attributes listing screen is accessed from the Attribute Tab in the Customer profile module. Clicking on the Attributes Tab will bring up a listing of Attributes, as illustrated in the [wireframe](#_Wireframe_7). + 4. In this screen will display all attribute of customer including Customer attribute/Account attribute/ Card attribute. + 5. Clicking on the Attribute value row in listing page will bring up the attribute value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Attribute value detail field + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/Vn)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity ID and Effect date. | | | | +| | Entity /Thực thể | Optional field Including: Client/Product_Account/ Card If Client entity is selected then listing all customer attribute of customer. If Product_Account entity is selected then listing all account attribute of customer. If Card entity is selected then listing all card attribute of customer. If Entity is not provided then get all attribute of customer which under Customer/ Account/Card entity level | Drop-down Allow multiple select. Default as empty | +| 2. | Effective Date From /Ngày bắt đầu có hiệu lực | Mandatory Listing attribute value during selected date frame. | Date time | +| 3. | Effective Date To/Ngày kết thúc hiệu lực | +| | Only effective records listed/Chỉ hiển thị các giá trị thực thể có hiệu lực | Use processing date to compare with attribute value effective date. If selected then only effective records listed If non-select then all attribute record including expired attribute value records listed | Check box Default as selected | +| **Attribute value detail field / Thông tin chi tiết thuộc tính** | | | | +| | Attribute Group/Nhóm thuộc tính | Attribute group of attribute | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Attribute ID/ID thuộc tính | Attribute ID | Display Lookup value from ATTRIBUTE_VALUE table | +| | Attribute Name / Tên thuộc tíng | Attribute Name | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity / Thực thể | Entity level of attribute Indicates the Entity to which this Attribute belongs Client: Customer Product_Account : Account Card: Card | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity ID/ ID thực thể | The identifier for the Entity to which the Attribute value in this record belongs. If Entity is : • “Product_Account”, this field contains the PA Number • “Card”, this field contains the Card Number • “Client”, this field contains the CIF Number * “Store”, this field contains the Store ID * ……etc…. | Entity value will be : * + 1. CSN for customer attribute. 2. ASN for account attribute 3. PSN for Card attribute. Use Entity and Entity_ID of attribute for lookup according value: | +| | Account Type/ Loại tài khoản | Combinaiton of Product Account Level and Product Account Type of Account attribute. Present for Account attribute only | Display Lookup value from PRODUCT_ACCOUNT table | +| | Attribute value /Giá trị thuộc tính | Attribute value | Display Lookup value from ATTRIBUTE_VALUE table | +| | Effective Date From/ Ngày bắt đầu có hiệu lực | Start date of the effective period for the Attribute value | +| | Effective Date To/Ngày kết thúc hiệu lực | End date of the effective period for the Attribute value | +| **List of Campaign/Danh sách chiến dịch** **This appear when user click to view detail of any record** ![](data:image/png;base64...) | | | | +| | Campaign ID/ID chiến dịch | Campaign ID which reference to Campaign Rule | Display Lookup value from “Campaign Rule screen” | +| | Campaign Name | Name of Campaign | Display Refer to “Campaign “ API under Campaign Management Lookup value from “Campaign” table. | +| | Campaign Rule | Campaign Rules which reference to this attribute | Display Lookup value from “Campaign Rule” screen to list all campaign rules which includes this attribute on at least following items: * + 1. Attribute Criteria 2. Formula 8 3. Formula 7 4. Award limit | +| | Campaign Rule Name | Name of Campaign rule | Display Lookup value from “Campaign_Rule” tablle Refer “Campaign Rule” API under Campaign Management | +| | Effect date | The Effect date of Campaign Rule Dislay both Effective from date and effective to dat e | Display The date format must adhere to the configured format | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + +### Counter + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according Counter: + - Customer profile screen dislays customer information and customer -level counter listing + - Account Detail screen dislays Account information and account -level counter of customer. + - Card detail screen displays Card information and card -level counter of customer. + 1. In new OLS version Counter will be displayed on separately tab under Customer profile module. + +#### Process flow + +#### Trigger + +* + 1. Users would like to review and verify the counter detail of the customer. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Counter” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Counter " tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Record detail + 1. Record detail view + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. Get data from the table that updates the counter value (Campaign_Counter table). The counter values are inserted/updated from the OLS batch process that triggers the Campaign Rules as well as the OA screen. + 2. This screen just displays counnter value only. There is no further action. + 3. The Counter Detail listing screen is accessed from the Counter Tab in the Customer profile module. Clicking on the Counter Tab will bring up a listing of the counter, as illustrated in the [wireframe](#_Wireframe_8). + 4. In this screen will display all counter bucket for the chosen customer, including Customer-level counter/Account -level counter/ Card- level counter. + 5. Clicking on the Counter value row in listing page will bring up the counter value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Counter value detail field: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity level and Counter bucket period | | | | +| | Entity /Thực thể | Optional field Including: **Customer [CU]/ Account [PA] /Card [CA].** If “Customer[CU]“ is selected then listing all customer -level counter of customer. If “Account [PA]” is selected then listing all account- level counter of customer. If “Card [CA]”is selected then listing all card -level counter of customer. If Entity level is not provided then get all counter level of customer which under Customer/ Account/Card entity level. | Drop-down Allow multiple select. Default as empty | +| 2. | Bucket Start Date / Ngày bắt đầu | Mandatory Listing counter value during selected date frame. | Date | +| 3. | Bucket End Date/ | +| | Only effective records listed/Chỉ hiện thị counter hiện tại | Use processing date to compare with counter bucket period. If selected then only effective records listed. Use processing date to determine the effective of the counter bucket. If non-select then all counter value record including expired counter records listed | Check box Default as selected | +| **Counter value detail field** | | | | +| | Counter/Bộ đếm | Counter | Display | +| | Entity /Cấp bộ đếm | Entity counter level Cust- CU Account – PA Card – CA | Display | +| | Entity ID/ID thực thể | The identifier for the Entity to which the counter value in this record belongs. If Entity is : • “Account”, this field contains the Account Number • “Card”, this field contains the Card Number • “Customer”, this field contains the CIF Number | Display | +| | What to count/ Tiêu chí đếm | The data entity that is to be counted or tracked | Display | +| | Counter Value/Giá trị bộ đếm | Counter value | Display as number format | +| | Bucket start date | Start date of the bucket period for the Counter value | Display as date format | +| | Bucket end date | End date of the bucket period for the Counter value | Display as date format | +| | Counter state/Tình trạng bộ đếm | Counter state A: Awared C: New | Display Show state code only | +| **Counter Statistic / Tổng hợp bộ đếm** ![](data:image/png;base64...) **This part will list the details of the counter history statistics for the chosen counter bucket in the listing page** | | | | +| | Reference No/ Số tham chiếu giao dịch | OLS Transaction Reference Number | Display | +| | Post Date /Ngày đăng | The post date of the transaction | Dipslay as date time format The date format must adhere to the configured format | +| | Counter Value/Giá trị bộ đếm | Counter value which is updated on this transaction | Display as number format | +| | Bucket Number/Số bộ đếm | The bucket number of selected counter | Display as interger number format | +| | Update Date | The system date when counter value is updated | Dipslay as date time format The date format must adhere to the configured format | +| | Updated by | The batch/User who post the transaction that make counter value is changed. | Display | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + +### Adjustment + +#### Requirement Definition + +1. Adjustment transactions can be manually posted through the Customer Management module in the administration screen function under. +2. This screen display all manually adjustment transaction of customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. User would like to review/ verify manually adjustment transaction of customer. + 2. There is some wrong in balance of customer then user have to manually adjust via OA screen. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Adjustment Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Adjusment Entry" tab +3. Depending on the user’s access rights, they can view/edit/add or approve manually Adjustment transaction records. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Active record + +Record detail + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +1. Create/Edit form + +Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - After selected/inputted card/Account/CIF click to quick view icon to see right panel information + +![](data:image/png;base64...) + +#### Business rules + +1. While under “Transaction Management” module in the administration screen function, manually adjustment transaction can be posted for any customer then in “Customer management”module manually adjustment transaction can be posted for selected customer only. +2. Click on the Adjustment Entry tab in the “Customer Profile “sreen to bring up the screen for accessing the Adjustment Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_9). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Adjustment Entry screen is illustrated in the [wireframe](#_Wireframe_9). +4. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +5. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen desscriptions + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | **Desscription** | **Data type** | | +| **Adjustment detail** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: CIF number/ Account / Card must be provided | Radio button Default posted by Card Look up value from master data | | +| | | | Under Customer management module | Under Transaction Management module | +| | Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Customer” API under Customer Management | +| | Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. Refer “==tbd== “ API | Drop-down Select one List all account level in the OLS system. Refer “Product Account Level” API under Code Maintenance service | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. Refer “==tbd== “ API | Drop-down Select one List all account type in the OLS system by selected Account level. Refer “Product Account Type” API under Code Maintenance service | +| | Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer Refer “Account “ API under Customer Management service | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Product Account” API under Customer Management. | +| | CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. Refer “Customer Profile” API under Customer Management. | +| | Quick view/Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF is invalid.t With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink/Icon | | +| | Adjustment Quantity is +ve/-ve \*/ Điều chỉnh âm/dương | Indicates whether the adjustment is a positive adjustment or a negative adjustment | Drop-down Select one Lookup value from “Code_Management” table Refer “list-by-code-type” API with code type is “adj-type” | | +| | Store \*/Đơn vị/Cửa hàng | The store of transaciton | Drop-down Select one Lookup active Store record from “Store” screen Refer “Store” API under Merchant Managemant. | | +| | Pool Id \*/Mã pool | The pool to be adjusted Should respect pool entity level For example: Cant posted txn by Account if pool to be adjusted is card- entity level pool. | Drop-down Select one | | +| | Transaction Date\*/Ngày giao dịch | Transaction date | Time picker within time also DD-MM-YYYYY HH:MM:SSS Allow user input from keybroad | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been adjusted. Present for postive adjustment only Show the balance bucket based on transaciton Date and expire policy of adjusted pool. When update transaction date / Card number (Account /CIF) OR Pool then this value should be automation updated. Allow user modify this value | Time picker without time DD-MM-YYYY Allow user input from keybroad | | +| | Bucket Expiry Date/ … | This is the expiry date of the bucket will be deduct poitn. Present for negative adjustment only If not selected then follow by TP processing for Redemption/Negative adjustment approach. If selected then just adjust on the selected bucket. | Drop-down Select one Loopkup value from customer balance based on adjusted pool/selected card. | | +| | Adjustment Quantiy \* /Số lượng điều chỉnh | The pool units by which to adjust the pool balance. | 9(12,2) Should be greater than 0 if provided | | +| | Reason Code \*/Mã lí do điều chỉnh | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the adjustment. | Drop-down Lookup value from Reason Code screen | | +| | Transaction Code \*/Mã giao dịch | OLS transaciton code of transaction | Drop- down Lookup value from OLS Transaction Code screen | | +| | Remarks/Ghi chú | A description of the adjustment. | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** ![](data:image/png;base64...) The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | + +* + - 1. Edit Action just be applied for Pending/Rejected record. + 2. For Active Record just view only. + 3. After the transaction has been saved, it is put in the pending tab. + 4. An authorised user has to retrieve the transaction and approve it before it is processed and pool is updated: + +**Based on entity level/account selection alog** + +* 1. For postive adjustment transaction then: + + If have negative balance bucket then adjusted point used to offset negative balance bucket to 0 first. + + The remaining points will be added for selected bucket. + 2. For negative adjustment transaction then: + +![](data:image/png;base64...) + +* + - 1. Approved transaction is putted in the active tab. + +#### Post-condition + +* + - Pool balance buckets are updated. + - Transaciton is posted and viewable on the transaction history screen. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + +### Transfer balance + +#### Requirement Definition + +1. Transfer balance transactions can be manually posted through the Customer Management module in the administration screen function under. +2. Change in UI/UX and change to support both user can transfer balance from their account to other customer or transfer between its own self. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. The user would like to review/verify the manually transferred points from a customer to another customer or between the customer's own accounts/cards. + +#### Pre-Condition + +1. User have to have the access rights in both “Customer Profile” and “Transfer Balance” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Transfer Balance" tab. +3. Depending on the user’s access rights, they can view/add/Edit or Approve manually transfer points transaction records. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. View detail form + +![](data:image/png;base64...) + +* + - 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. Click on the “Transfer Balances” tab in the “Customer Profile “screen to bring up the screen for accessing the Transfer Points listing page. The detail is illustrated in the [wireframe](#_Wireframe_10). +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the Transfer Balance screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that the Edit icon (!) and Delete icon just display for pending and rejected records only. +4. The point transfer function will transfer all pools linked directly from the “From” to the “To”. +5. Expiry Dates will be preserved unless a specific date is provided. +6. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. F**orm descriptions:** + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| | Transfer mode \*/ Phương thức điều chuyển | Use transfer mode to determine the relationship between from transfer source and the transfer destination. Check on the “Internal” mode to transfer balances itself. Check on the “External” mode to transfer the balance from a customer to another customer in the OLS system. Use Application Parameter to allow/disallow transfer mode: Apply both or only Internal or only external | Radio button Default “Internal” transfer Lookup value from “Code_Management” table where code type is ‘transfer-mode’. Refer “list-by-code-type” API under Master Data. | +| | Transfer Type\*/Loại điều chuyển | Condition field Depend on Transfer Mode to disable/enable as follows: Note: “X” stands for enable | | | | | | --- | --- | --- | --- | | **Transfer mode** | **Transfer Type disable/enable** | | | | **Card** | **Account** | **Client** | | Internal | X | X | | | External | X | X | x | | Radio button Default “Card”. Lookup value from “Code_Management” table where code type is ‘entity-lvl’. Refer “list-by-code-type” API under Master Data. | +| | From \*/Từ | A card/Account/CIF number must be present which depends on the transfer mode. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account type of the selected source account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account level of the selected source account | Drop-down Select one | +| | Quick view/Xem nhanh | Click on each quick view icon to retrieve the available balances of the customer after entering/selecting the card number. The details will be displayed in the right panel. See more in the Quick view part Show an error message if the Requesting Card is invalid. With Edit/Create mode the system will expand/collapse on the same screen to user can see and continue input needed information but with View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon See more in Quick view part | Hyperlink | +| | To \*/Đến | Card /Account/CIF number must be present which depened on transfer mode. If Transfer Type is “Account” then Account type is present. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout type of selected destination Account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout level of selected destination Account | Drop-down Select one | +| | Pool ID\*/Mã pool | The pool from which to transfer Just show the pool of “From” balance buckets as following: X: Display | | | | | | --- | --- | --- | --- | | **Transfer Type** | **Pool balance bucket of “From” Customer.** | | | | **Pool Level Card** | **Pool level Account** | **Pool Level cust** | | Card | X Display distinct Card- entity Pool of balance bucket of Inputed card only | X Display distinct account -entity Pool of balance bucket of Account of Inputed card | X Display distinct customer -entity pool of balance bucket of customer of inputed card | | Account | | X Display distinct account- entity Pool of balance bucket of inputed account only | X Display distinct customer- eintiy pool of balance bucket of customer of inputed account | | Client | | | X Display distinct customer-entity pool of balance bucket of inputed CIF Number | | Drop- down Based on Transfer Type and “From” to lookup pool from LAB and Pool Definition table. | +| | Store\*/Cửa hàng-Đơn vị | The store which transaciton is logged | Drop -down Lookup value from Store screen- Store table. Refer “Store” API under Merchant Management | +| | Amount to Transfer \*/Mức điều chuyển | The amount to transfer. Defaults to the whole pool balance. | 9(14,2) Should be greater than 0 if provided | +| | Expiry Date (after transfer)/Ngày hết hạn | The expiry date of the points after the transfer. By default the expiry date will be the source expiry date. | Date time | +| | Transaction Code\*/Mã giao dịch | OLS transaction code which transaction is logged | Drop -down Lookup value from OLS TC screen. Refer “OLS Transaction Code” API under Campaign Management | +| | Reason Code \*/Mã lí do điều chuyển | Select from a list of pre-defined codes to identify the reason for the transfer | Drop-down Lookup value from Reason Code screen (Reason_Code table). Refer “Reason Code” API under Code Maintenance | +| | Remarks/Ghi chú | Remarks to be appended to the transaction, for reference | Text box X(100) | +| **Bucket Balance Detail view of Source** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | +| **Bucket Balance Detail view of Destination** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. OLS will validate the status permission and block code permission for both “From” and “To”, the transfer transaction will be rejected if any permission disallowed to perform adjustment. +4. Transfer transaction will be rejected if Pool balance of “From” is insufficient. +5. The Approved transfer transaction is logged as Adjustment transactions and following by TP processing: + 1. Each bucket in the “From” is transferred as a negative adjustment to the “From” and logged as a positive Adjustment to the “To”. + 2. The Reason Code will be selected from a list of Adjustment Reason codes. + 3. The Adjustment Reason Code is important for determining the GL posting accounts. + +#### Post-conditions + +* + 1. Pool balance buckets are updated. + +#### Exception flow + +* + 1. Pool balance of “From” is insufficent. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 3. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Re-instatement + +#### Requirement Definition + +1. This screen is used to re-instatement for expired balance bucket which have not been forfeited. +2. If balance have been forfeited, then “re-instatement” does not apply and an adjustment transaction should be used to return points to the customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. User want to review/verify Re-Instatement transaction + 2. User want to re-instate expired bucket. + +#### Pre-Condition + +1. User have to have access righsts in s both “Customer Profile” and “Re-Instatement” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Re-Instatement" tab. +3. Customers have pool expired bucket which have not been forfeited. +4. Depending on the user's access rights, they can view, add, edit, or approve manually Re-Instatement Transaction records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. Click on the “Re-Instatement” tab in the “Customer Profile “sreen to bring up the screen for accessing the Re-Instatement listing page. The detail as illustrated in the [wireframe](#_Wireframe_11). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_11). +3. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +2. Form description: + +| **Seq** | **Field** | **Description** | **Data type** | | +| --- | --- | --- | --- | --- | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | +| | | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available/expired balances of the customer after entering the customer information. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF are invalid. With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | +| | Store \*/Cửa hàng_Đơn vị | Store | Drop -down Select one | | +| | Pool Id \*/Mã pool | The pool to be adjusted. The pool of the bucket to Re-instate. Just list the pool have balance which has already expired, but are still within the grace period (haven’t forfeited), while respecting the pool entity-level based on transfer mode. E.g Use account to re-instate then cant select card pool entity-level | Drop-down Select one | | +| | Bucket to Re-instate \*/Số lô cần gia hạn | The drop-down displays the expired buckets of the selected pool which have not been forfeited The bucket to be re-instated must be selected individually and the new expiry date must be provided in the “Expiry Date” field. | Drop-down Select one Lookup value based on LAB table. | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been re-instated. | Date The date format must adhere to the configured format | | +| | Reason Code \*/Mã lí do | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the re-instatement. | Drop-down Select one Lookup value from Reason Code screen with Reason type is Re-instatement Refer “Reason Code” API under Code Maintenance | | +| | Remarks/Ghi chú | Additional remarks on the re-instatement. | X(100) | | +| Quick View Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card. | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. The re-instatement will be posted as an Adjustment, with the Reason Code set to the selection. +4. The balance in the expired buckets will be set to 0. +5. If the bucket with the required expiry date exists, the adjustment amount will be added to the bucket. +6. Otherwise, a new bucket with the new expiry date as entered in the Re-instatement edit form is created with the balance from the expired bucket. + +#### Post-condition + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Item Redemption + +#### Requirement Definition + +1. Customers call the customer service (call center) and requests to redeem an item, giving identification and item code. +2. Item redemption requests are processed against the catalogue item set-up parameters. The details are described against the relevant parameter in the catalogue item set-up description in section 7. +3. All redemptions are in real-time. +4. Redemption through administration screens that requires approval is real-time only at time of approval. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. Users use this screen to assist customers in exchanging points for items. + 2. Users want to review and verify the redemption item transaction details of customers, which includes all online transactions via the OA screen or M as well. + +#### Pre-Condition + +1. Users have to have access rights in both “Customer Profile” and “Item Redemption Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer to access the “Item Redemption Entry” tab. +3. Depending on the user's access rights, they can view, add, edit, or approve manually Item Redemption Transaction records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +Click on each item to bring up item detail view + +![](data:image/png;base64...) + +* 1. **Create** + +**Step 1: Add General information** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Physical /Evoucher item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Miles item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add cash rebate item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add other items** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Click on the “Item Redemption Entry” tab in the “Customer Profile “screen to bring up the screen for accessing the Item Redemption Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_12). +3. User can’t modify transaction after transaction is posted. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | | +| --- | --- | --- | --- | --- | +| **Seq** | **Field** | **Description** | **Data type** | | +| **General information** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from master data | | +| | Condition fileds as following descriptions | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any card belonging to the customer can be used for making a redemption Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of the choosen customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the choosen customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (Balance Detail or Buket Balance Detail View Or Expired Balance View) to retrieve the available balances of the customer after entering the card number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card invalid. | Hyper link | | +| | Redemption Channel \*/Kênh đổi thưởng | Redemption Channel | Drop-down Select one Lookup value from master data | | +| | Redemption Date \*/Ngày đổi thưởng | The redemption transaction date | Date time Date time format must respect the date configuration format | | +| | Store\*/Đơn vị | The drop-down list to select any acitive Store in the OLS. Redemption Transaciton will be logged under this store. | Drop -down Select one | | +| | Appliable Fee/ Áp dụng phí | The fee will be applicable for this transaction if item has a fee See more about fee on Item price section. | Switch button Default OFF | | +| **Item details** | | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The drop-down to select the effected catalog | Drop – down Select one Use Redemption Date to determine effected catalogue. | | +| | Item\*/Vật phẩm | The drop-down to select the item code to be redeemed. The item must belong to the selected catalogue. Display an error message if item has no matched price. | Drop-down Select one Use Redemption Date and selected catalogue to determine effected item. From selected item and inputed data to determine price of the item. Please refer Item price to get more detail | | +| | Redemption Mode\*/Loại đổi thưởng | A drop-down list with the following choices: * Fixed Partial (Cash + Points) * Fixed Points If Price configuration did not allow Partial Redeem then just Fixed Partial is disable. If Price configuration allow “Partial Redemption” mode then both mode are enable. | Radio button Defaut fixed points Look up value from master data | | +| | Unit Price \*/Giá mỗi đơn vị | Point required **For Fixed points Mode then this is Price in point in item price configuration and user can’t change.** **For Fixed Partial Mode, the sytem must automation populate than “Minimum Partial Redeem Points” in item price configuration and user can modify this value but Unit Price must be equal to or greater than “Minimum Partial Redeem Points”.** | 9(12,2) | | +| | Unit Cash Amount required./Tiền phải trả mỗi đơn vị | Condition field This field is only active and required Fixed Partial mode only. The system must automation populate as: ( **Full Price in Point – Unit Price** ) \* **Price in Cash (per point) ( from item Price Configuration)** | Display | | +| | Unit Face value/Giá trị mỗi đơn vị | Condition field Active only when this item required face value on the configruration **Get face value from Item price cofiguration with higher priority. Otherwise this is base face value from item master.** | Display as 9(14,2) format | | +| | Quantity on hand/Số lượng còn lại | Available item can be redeemed. Just display if the item is tracked by quantity. | Display as 9(9) format | | +| | Redemption Quantity\*/Số lượng đổi thưởng | Redemption quantity If the item is tracked by quantity, then the redemption quantity must not be greater than the quantity on hand. Don’t allow to redeem if redemption quantity is greater than quantity on hand | 9(5) Should be greater than 0 if provided | | +| | Total price\*/Tổng cộng | **The system must automation populate as Unit Price \* redemption quantity** | Display | | +| | Total Cash amount required/Tổng tiền phải trả | Condition field This field is only active and required Fixed Partial mode only. **The system must automation populate as** **Unit Cash Amount required\* Quantity.** | Display | | +| | Total face value/ Tổng giá trị | Condition field. Active only when this item required face value on the configruration **The system must automation populate as** **Unit Face value \* redemption quantity** | Display as 9(14,2) format | | +| | FFP Ship number/ Mã số thẻ | FFP ship number | X(50) Condition fields Display and required for Miles items and should be configurable. Automation populate value from Attribute value based on configuration attribute ID and allow user modify this one. These fields to be used to send to partner. | | +| | FFP First Name/Tên | FFP First Name | +| | FFP last name /Họ | FFP last name | +| | Delivery Address/Địa chỉ | Delivery Address 1 Condition field Only active for Evoucher item and Physical item Auto populate from customer’s address 1 and allow user modify. | X(100) | | +| | Zip code/Mã bưu điện | Zip code Condition field Only active for Evoucher item and Physical item. Auto populate from customer’s Zip code and allow user modify. | Drop-down Select one | | +| | Recipient Name/Người nhận | Recipient Name Condition field Only active and required for Evoucher item and Physical item. Auto populate from customer’s Full Name and allow user modify. | X(50) | | +| | Email adress /Địa chỉ email | Email address Auto populate from customer’s email and allow user modify. | X(50) | | +| | Mobile Phone/Số điện thoại | Mobile Auto populate from customer’s email and allow user modify. | X(50) | | +| | Remark/ Ghi chú | Additional remarks on the item redemption transaction | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | +| Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card/Account/Customer | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card os present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +#### Post-condition + +* + 1. Transactions are logged into the related table in the database. The transaction listing includes not only transaction which to be posted under the OA but also transaction to be posted from the member site. + 2. Balance are updated. Quantity on hand are updated if transaction is posted successfully in the system. + 3. The net transaction of the redemption transaction is the sum of the tax amount, total fee, and total cash required. + 4. At the end of day (EOD), all approved items include are output in a OLS output file to be sent to parnter to be tracking or created back to the account/customer used in the item redemption, etc. + 5. TP process to approve Transaction + +![](data:image/x-emf;base64...) + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation… + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Award Transaction + +#### Requirement Definition + +#### Process flow + +Process follow for award transaction (Award service on TP side: ) + +![](data:image/png;base64...) + +#### Trigger + +#### Pre-condition + +#### Wireframe + +* + - 1. Create /Edit + +![](data:image/png;base64...) + +#### Business Rules + +1. Click on the “Award Transaction” tab in the “Customer Profile” screen to bring up the screen for accessing the Award Transaction Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Descriptions** | **Data type and data source** | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | | +| | Condition fileds as following descriptions | | Under Customer profile | | Under Transaction Management | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Account number to find card. | | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | | +| | Quick view | Click on each quick view icon “Balance” to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | | +| | Transaction Code\* /Mã giao dịch | OLS Transaction Code This TC is used to locate the Campaign Rule to use for processing. | Drop-down Select one Lookup value from “Transaction_Code” table. Refer “OLS Transaction Code” API under Campagin Management | | | +| | Transaction Date \*/Ngày giao dịch | Must be valid date. Transaction rejected if not valid. Transaction rejected if this date is older than sysdatetime by N days, where N is a system setting. | Date time | | | +| | Source Reference Number/Số giao dịch gốc | Source Transaction Reference Number Unique transaction identifier from source system | X(20) | | | +| | Store\*/Đơn vị/Cửa hàng | Transaction Store Id | Drop-down Select one Lookup value from “Store” table Refer “Store” API under merchant management | | | +| | Terminal /Thiết bị đầu cuối | Transaction Terminal Id | Drop-down Select one Lookup value from “Terminal” table Refer “Terminal” API under merchant management | | | +| | Transaction Amount\*/ Giá trị giao dịch | Transaction Gross amount Note: It is dependent on each project, Lets it be gross transaction amount first. | 9(14,2) Should be greater than 0 if provided | | | +| | Transaction Description/ Mô tả giao dịch | Shopname from Source system or OLS transaction description | X(100) | | | +| | Transaction Currency Code/ Mã tiền tệ giao dịch | It can be anpha code or number code. Let’s it be anpha code first | Drop-down Select one Lookup data from “Currency_code” table Refer “Currency Code” API under Code Maintenance | | | +| | Transaction Mode/Phương thức giao dịch | Mode of transaction at point of payment | Radio button Lookup value from “Code_Management” table where code type is “txn-mode’. Refer “get-by-code-type” API under master data | | | +| | POS Entry Mode/Phương thức thiết bị bán hàng | POS Entry Mode | X(04) This field is subdivided as follows: 0 – Unknow , 1- Manual (key entered) 3- Bar code ---Etc | | | +| | MCC code/Mã MCC | Merchant category code | Drop-down Select one Lookup value from “MCC” table Refer “MCC” API under merchant management | | | +| | Country Code/Mã quốc gia | Country code | Drop-down Select one Lookup value from “Country_Code” table Refer “country code”API under Code Maintenance | | | +| | Salary Crediting Indicator/ Tài khoản nhận lương | Indicates bundled deposit account is receiving regular salary credits | Switch button Default OFF | | | +| | Transaction Channel/Kênh giao dịch | Transaction channel | Drop-down Select one Lookup value “Code_Management” table where type code is “txn-channel” Refer “get-by-code-type” API under master data | | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buck Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | | + +#### Post-Codition + +Refer Process flow to get more detail for post-conditon when transaction is approved. + +#### Exception -flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation. + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## OneMarketing + +### Overview + +OneMarketing Module includes 2 function modules: + +* **Marketing Message:** Manage (CRUD features) all message templates that are used in the system. +* **OneMarketing Request (OMR):** Filter the target customers who satisfy the set-up-criteria to send messages or get reward transactions. +* **A/Bn Testing:** to compare at least two versions of a SMS, email, or other marketing elements to determine which one performs better. +* **Frequency Capping:** The function to practice of controlling the frequency and volume of notifications or channel delivered to customers to avoid overwhelming them +* **Blacklist:** A list of customer who will be blocked for reward/promotion notification from a business. +* **Whitelist:** A list of customer who has given their consent to receive specifc types of marketing message from business. + +### Marketing message + +#### Requirement definition + +1. The marketing message module is used to define a communication message that will be sent to the target list. +2. A Message Template can be built based on a message with pre-defined parameters or HTML file. +3. User can build different messages for different marketing channels (e.g: SMS / Notification Push/ Email/ OTT …). + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-conditions + +1. Users have to have access rights in “Marketing Message” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually message template. +3. Assume that all OMR criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +#### Wireframe + +* + - 1. Message summary listing page + +![](data:image/png;base64...) + +* + - 1. Filter + +![](data:image/png;base64...) + +* + - 1. SMS + +1. Create SMS + +**Step1 : Choose message chanel : SMS and choose create new or re-use existing message template** + +![](data:image/png;base64...) + +**Step 2: Step up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up message content** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Finish by save.** + +1. SMS detail view + +![](data:image/png;base64...) + +* + - 1. **Email** + +1. Create Email message + +**Step 1: Choose message chanel : Email and choose create new or re-use existing Email template** + +![](data:image/png;base64...) + +**Step 2: Set up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up “Sender information”** + +![](data:image/png;base64...) + +**Step 4: Setup Email content** + +![](data:image/png;base64...) + +**Upload email template** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. **Push notification** + +Create Push notification message + +**Step 1: Choose message chanel : Push and choose create new or re-use existing Push template** + +![](data:image/png;base64...) + +**Step 2: Update “Generate information”** + +![](data:image/png;base64...) + +**Step 3.1: Message content configuration for “Richer push”** + +![](data:image/png;base64...) + +**Step 3.2: Message content for “Carousel push”** + +![](data:image/png;base64...) + +**View mode** + +![](data:image/png;base64...) + +#### Business Rules + +1. OLS system can send a message to target customer through a notification on the app, an email, an SMS, and so on. These varied media used for message delivery are known as “channels”. +2. In this version, OLS support to user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. Just enter the email adress or phone number user wish to check the message preview. +3. Besides, OLS support to user can setup message template to re-use in the furture. +4. Click on the “Marketing Message” in Main icon to bring up the screen for accessing the Markting Message listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for marketing message screen is illustrated in the [wireframe](#_Wireframe_10). +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Create /Edit mode** | | | | +| **SMS message** | | | | +| | **Step 1: General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | SMS Type | Drop-down to select SMS type: Promotion/Marketing Transaction | Check box type Select one value only Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date Date time format must respect the date configuration format | +| | Effective End Date \* | The end date of the effective period of the message | Date Date time format must respect the date configuration format | +| | **Step 2: SMS Content Configuration** | | | +| | SMS Brand Name \* | Drop -down to select SMS Sender | Drop-down Lookup value from master data | +| | Message \* | The message content of the SMS. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. SMS message don’t support : 1. Images 1. A subject line 2. Attachments **SMS messages are written in Unicode (non –GSM standard). Standard single message or multi-part message are credited based on the message content.** | X(5000) | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Preview | The message will be automation displayed in the preview part. | Displaya | +| | The number of characters in the message\* | This value will be automatically upadated when the user update the message content. | Display as number format | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a phone number is dispalyed 2. When user click on “Send sample” a confirm message is display. It use to user confirm that the system will send a testing message into inputed phone number. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a sms message into inputed phone number. 3. Mobile phone number should be required when user click on” Send sample”. If not found should reject with error message | Button | +| **Email message** | | | | +| | **Step 1 : General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Email Type | Drop-down to select Email type: **Promotion/Marketing** **Transaction** | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. Lookup value from master data | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format | +| | Use type \* | 2 options to config email message : * + 1. Use messge. 2. Upload template. | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | **Step 2: Sender information** | | | +| | Sender Name\* | The name of sender | X(100) | +| | From email\* | The email addess used to send email to target customer | Display This email is configured. | +| | Subject\* | Subject of email | X(100) | +| | Preview Text | Preheader of Email Preheader can help user connect with customer and increase customer’s open rate. If Prejeader is not provided then the first line of email content will be display instead | X(100) | +| **3.** | **Step 3: Email content figuration** | | | +| | Message | Conditon field The message content of the Email. If “Use message” is selected then this field is actived. System must allow to edit HTML format. The system should support to generate into text format. System must allow to put image/url… as message content. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. | Character | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Upload file | This filed is actived when “Use template” is selected. ![](data:image/png;base64...) Allow users to drag and drop an HTML template file, or they can choose a file from their computer to upload it into the system. After uploading, the system displays message content based on the uploaded file and allows the user to review and make modifications. | Button | +| | Re-Upload | Use this button to re-upload the email template. | Button | +| | Preview the email | The message will be automation displayed in the preview part. Sender / Subject and Preheader will be displayed here. If Preheader is not provided then the first line of message will be display instead. | Display | +| | Send sample | This functions to support the user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter an email address. This entry should adhere to the email format field. 2. When click on “Send sample” a confirm button to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test email into inputed email address. 3. The email address should be required when user click on” Send sample”. If not found should reject with error message. | Button | +| **Notification Push** | | | | +| | **Step 1: General information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Notification Type | Drop-down to select Notification type: Promotion/Marketing Transaction | Check box Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format. | +| | **Step 2: Notification Content configuration** | | | +| | Message Title \* | The primary text that appears at the top of the notification | X(50) | +| | Message \* | The main content of the notification, providing additional information, context, or details related to the notification's purpose. The list of message parameters are included to be used. User can drop/drag message paramters into message. System must allow to put image/url as message content. | Text Area | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Image type\* | Drop- down to selcte image type: SingerEicheer push (No image ) Richer Push (one image) Carousel Push (One or more than one image) | Drop- down Select one only Lookup value “Code Management” table where type code is “image-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Upload Image | Condition field * + - 1. This field is not actived for Single Push 2. Image URL : Click on the Image URL field and type or paste the URL of the image 3. Upload: Drag/Drop image or click the uploaded from computer. If the Image type is 'Carousel Push,' then users can upload more than one image. The sequence sorting will be the same as the sequence displayed in the mobile app. Users can rearrange the images to adjust the sortinng. Image is required for “Richer push” and “Carousel Push”. | | +| | Preview the notification | The message will be automation displayed in the preview part: content/ image. Preview on IOS or Android | Display | +| | Link URL \* | Enter or paste the URL to which the user needs to navigate to. | X(100) | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a CIF Number. From CIF Number the system will locate device's registration token, a device group's notification key, or a single topic. 2. A confirm message to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test notification. 3. The token or key or something else which one the system used determine destination of the push message should be required when user click on” Send sample”. If not found should reject with error message. | Button | + +#### Post -codition + +* + 1. All message which will be sent to target customer are availble to config on following modules : + ++ Marketing Request + ++ Campaign Rule + ++ Item master …. + +#### Exception flow + +* + 1. Input data are not passed all validations and then the user choose cancel the action then use case ends in failure. + +### Marketing Campaign + +#### Requirement Definition + +* + - 1. Marketing Campagin Module is used to filter out a list of target customers that satisfy the marketing criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre- Conditon + +1. Users have to have access rights in “Marketing Request” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. +3. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. +4. To send marketing messange when an envent is triggered (real time events or batch events + ) then : + 1. Pre-Defined Event: Define the action to indentify when event triggers: such as login/ Get balance detail view/ leave feedback on portal app. + 2. FE Events: APIs or services can be used to initiate the action and make a call to the backend (BE) to determine whether the event has been triggered; if so, the assigned message for this event should be sent. + 3. Batch job: marketing message can be automatically sent by the system via batch jobs. + +#### Wireframe + +* + - * 1. Marketing request summary listing page + +![](data:image/png;base64...) + +1. Filter + +![](data:image/png;base64...) + +1. Create/Edit mode + 1. Step 1: General information + +![](data:image/png;base64...) + +* 1. Step 2: Run schedule + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Step 3: Targeting + +![](data:image/png;base64...) + +4. Detail view + +#### Business Rule + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_12). +2. OLS system will use Query Builder to build query for marketing criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same request. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. Click on the “Marketing Request” in Main icon to bring up the screen for accessing the Marketing Request listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Marketing Request screen is illustrated in the [wireframe](#_Wireframe_12). +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: General Information** | | | | +| | Request ID \* | Unique identifier of the OneMarketing Request Not allow special characters | X(20) | +| | Description \* | Description of the OneMarketing Request | X(100) | +| | Effective Date From\* | The start date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Effective Date To \* | The end date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Marketing Function \* | * Including 2 main functions of OneMarketing Request: + Notification [N] - The message template set up at section [Marketing Message](#_Marketing_message) is sent to target customers + Triger Campain Rule [TCR] - A campaign is applied to add/redeem/adjust points to target customers based on Transaction Code. | Check box Allow to select only one value Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| **Step 2: Run schedule and message content** | | | | +| | Trigger method \* | Two methods to select when message will be sent to target customer: Schedule Event trigger | Radio button Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | Run Schedule \* | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Radio button Lookup value from “Code_Management” table where type code is ‘run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | One time | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\*: This field is only active and required when “One time” schedule is selected. This field is date format (Date time format must respect the date format configuration). This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 2. Request will occur only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n day at the selected time. | | +| | Weekly | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n weeks on selected day of the week and at the selected time | | +| | Monthly | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is selected on “Repeat on the” filed. This is multiple select field. - Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. - In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. - Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occurred every n year on the selected day and selected month. | Drop-down Select one | +| | Business Event | This filed is actived and requied when “Event trigger” method is selected. A drop-down list is used to select the event. When the event occurs, a request is triggered to send a message to the target customer. | Drop-down Multiple select. | +| | Message template\* | This filed is actived and required only when “Notification” marketing function is selected. | Drop-down Lookup value from martketing message screen. | +| | OLS Transaction Code | This filed is actived and required only when “Trigger Campaign Rule” marketing function is selected. | Drop-down Lookup value from OLS Transaction Code screen. Refer “OLS Transaction Code” API under Campaign Management | +| **Step 3: Targeting** **This step is used to config the conditions to get target customer.** | | | | +| | Trigger method \* | There are two options to setup targeting. * + - OMR Criteiria - Upload file | Radio button Lookup value from master data. | +| | **OMR Criteira is selected** | | | +| | ![](data:image/png;base64...) | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each request. The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| | **“Upload file” is selected** ![](data:image/png;base64...) | | | +| | Browse File | Allow users to drag and drop an upload file, or the user can choose a file from their computer to upload it into the system. Use the 'Upload file' option when users have a specific targeting list that they want to use for the campaign. | Button | + +* 1. “Save as draft” and “Save as template” feature are applied on this screen. + 2. **OMR batch job will trigger marketing request as following processing:** + +OMR job (OMR) just trigger effectived marketing requests based on Effective period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + +OMR creates notification messages to be sent to customers selected based on criteria configured by users in the step 3 -OMR criteria – e.g., to send an SMS message to customers whose birthday is due in the next N days. + +OMR can also be configured to trigger awarding batches generated by extracting transactions from Transaction log table. + +OMR can be configrured to trigger CP rule for the customer selected based on based on criteria configured by users in the step 3 -OMR criteria – e.g., to award 100 cash back to customers whose birthday in Tet holiday. + +OMR will stop send message when limit is reached. The limit based on frequency capping configurued by user in step 4- Frequency capping. + +| | | +| --- | --- | +| Batch id | OMR job ==tbd== | +| Description | Processes OneMarketing Requests (OMR) on the configured schedule | +| File Id | Nil | +| Input file | Nil | +| input staging table | ==TBD== | +| Tables read | Its depending in OMR criteria list which should be defined as an attribute for each criteira. == TBD==== | +| Tables updated | =TBD=== | +| Output staging table | Nil | +| Output file | Nil | +| Unwind job | ==TBD== | + +#### Post – Condition + +* + - 1. Marketing content is sent to target customer or Target customer trigger CP rule. + +#### Exception Flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Marketing Frequency Cap + +#### Requirement Defintion + +* + - 1. By controlling frequency capping, business can provide a more personalized customer expirence. Beside, frequency capping can provide a high level overview of the need for a notification capping system and the expected benefits for the business and its customers. + 2. Business able to setup the daily, weekly, monthly capping per customer. + 3. The system should automaticly enforcement of notification caps across different communication channels. + +#### Process flow + +#### Trigger + +#### Pre-condition + +1. Users have to have access rights in “Frequency Capping” module to able to access this screen. +2. Depending on user’s access right to user can modify the frequency capping of the marketing campaign. + +#### Sktech + +* + - * 1. Listing page + +![](data:image/png;base64...) + +* + - * 1. Edit mode + +![](data:image/png;base64...) + +* + - * 1. View mode + +![](data:image/png;base64...) + +#### Business Rule + +1. This step is used to set up a limit to the number of times a message has been sent to per uniquie customer on specific period. +2. This step is also used to setup a limit the number of message that a business allow to send to customer through specific message channel. +3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | Notification Channel/Kênh thông báo | The name of the notification channel | Display | +| | Effective Date From /Hiệu lực từ ngày | The start date of the cap | Display as date format. The display format should respect the configured format. | +| | Effective Date To/Hiệu lực tới ngày | The last effective date of the cap | +| | Frequency Cap/Giới hạn tần suất | The frequency cap on each channel. Each period unit is displayed as a separate record with the cap | Display | +| | Include White List/Bao gồm danh sách trắng | Whitelist who are excluded from the cap or not | Display | +| **Edit mode** | | | | +| | Frequency Cap Id\*/ Id giới hạn tần suất | The Record inditifier | X(10) | +| | Notification Channel\*/Kênh thông báo | Marketing Frequecny Capping identifier A drop-down to select one channel to apply the capping rules. A list incluse following channel: * + - SMS - Email - Push Notifications | Drop-down Select one | +| | Effective Date From \*/ Hiệu lực từ ngày | The start date of the effective period of the cap | Date The system should only have one effective cap applied on each channel at any given time | +| | Effective Date To\*/Hiệu lực tới ngày | The end date of the effective period of the cap | +| | **Frequency Cap/ Giới hạn tần suất** **Require at least one period unit** | | | +| | + Add Period Unit/ Thêm chu kì | Click to add new period unit to limit for chosen channel. | Button | +| | Capping Period \*/Chu kì | A drop-down to select the following period: * + 1. Daily: Maximum number of notifications per day. 2. Weekly: Maximum number of notifications per week 3. Monthly: Maximun number of notifications per month. | Drop-down Select one Each period should only be configured with one cap value at the same time. | +| | Maximum number \*/Số lần gửi thông báo tối đa | The maximum the number of times a message has been sent to per uniquie customer. | 9(12) | +| | Include Whitelist/Không bao gồm danh sách trắng | This option disallows/allows the white customer list allow to receive a higher notification than normal customer for spefic scenario. | Swith button Defaut OFF | +| | Customer list /Danh sách khách hàng | A drop-down to select the white customer list. This allows the system to recognize the white list customers and ignore the frequency capping rules. This is a condition filed and only active and required if the capping rules include the white customer list. | Drop – down Multiple select | +| | Description /Mô tả | The description of the capping. For refer only | X(100) | + +* 1. Frequency Capping are applied to all marketing campaigns in the system for customer level. + 2. The system should automaticallytrack the number of notifications a customer has received across all notification channels as well as the period unit. + 3. If the customer has reached the notification cap then the notification is not delivered to customer. + 4. The white list who are excluded from the frequency cap rules should be tracked also. + +#### Post –condition + +#### Exception flow + +### A/Bn Testing + +#### Requirement Definition + +* + - 1. This function is used to evaluate and optimize various elements of the marketing program to improve customer engagement, retention, and overall performance. + 2. OLS support both A/Bn content testing and A/Bn target customer testing. + 3. For A/Bn content testing, one variation (content A) of the marketing request is sent to a subset of target customers, and one or more different variations (content sample B/ content sample n) are sent to the same subset of target customers. The goal is to identify which content in the marketing request yields the best results. + 4. Unlike A/B content testing, A/Bn target customer testing focuses solely on the target customers. In the same testing request, one variation is designated for 'target customer A,' while one or more variations are designated for 'target customer B' or 'target customer n.' The goal is to identify which OMR criteria in the marketing request will reach more customers. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-Condition + +* + - * 1. For A/Bn messsage content testing, result testing must be provied from third-party to OLS can collect data and analyze result to introduce report which user can use to make decision which on is better. + 2. Users have to have access rights in “A/Bn Testing” module to able to access this screen. + 3. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + 4. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +* 1. Filter + +![](data:image/png;base64...) + +* 1. Content marketing testing configuration + +**Step1: Choose testing type is “Content message testing”** + +![](data:image/png;base64...) + +Step 2: Setup general information + +![](data:image/png;base64...) + +Step 3: Choose target customer + +![](data:image/png;base64...) + +Step 4: Setup variant content message + +![](data:image/png;base64...) + +Step 5: Set up run schedule + +![](data:image/png;base64...) + +* 1. Target customer testing configuration + +Step 1: Choose “Target customer testing” + +![](data:image/png;base64...) + +Step 2: Set up general information + +![](data:image/png;base64...) + +Step 3: Setup variant target customer + +![](data:image/png;base64...) + +Step 4: Setup run schedule + +![](data:image/png;base64...) + +#### Business rules + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wireframe. +2. OLS system will use Query Builder to build query for OMR criteria when user setup target customer. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. Click on the “A/Bn Testing” in Main icon to bring up the screen for accessing the A/Bn Testing listing page. The detail as illustrated in the [wireframe](#_Wireframe_16). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for A/B testing screen is illustrated in the [wireframe](#_Wireframe_16)s. +6. **Screen description:** + +**Create/Edit mode** + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | **Data type** | +| * + - * 1. **A/B message content testing** | | | | | +| **Step 1: Campaign information** | | | | | +| | | Campaign ID \* | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Message channel \* | SMS Email Push | Checkbox Allow to select only one value Lookup from master data. | +| **Step 2: Choose target customer** The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). | | | | | +| | ![](data:image/png;base64...) | | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | | Each criteria can be drag one more time on each request . The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| **Step 3: Set up varial content** ![](data:image/png;base64...) | | | | | +| | Variant A Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial A will be added here. | Tab | +| | Varial B Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial B will be added here. | | +| | Add | | Click to add to introduce new tab to create new content varial. System will automation populate varinant name as default and users can rename and should be unique value on one each campaign. | Button | +| **Step 4: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format . This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | +| **II: A/B target customer testing** | | | | | +| **Step 1: General information** | | | | | +| | Campaign ID \* | | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | Campaign Description | | Description of Marketing Campaign ID | X(100) | +| | Effective Date From | | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| **Step 2: Set up variant target customer** | | | | | +| | Variant A User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial A will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Varial B User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial B will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Add | | Click to add to introduce new tab to create new target customer varial. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). System will automation populate variant name as default and User can rename and should be unique value on one each campaign. | Button | +| **Step 3: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format. This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. * Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | + +**Content marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | OMR criteria | View as Rule criteria view mode for this part | Display | +| | Variant A | View as Message Template view mode for message content part | Tab | +| | Variant B | View as Message Template view mode for message content part | Tab | +| | Variant N | View as Message Template view mode for message content part | Tab | +| | Result | =TBD== It is depened on the third-party partner and the goal. We can want to see the total result on each content variation or detail result for each target customer on each content variation. | ==tbd== | + +**Targeting marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Variant A | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant B | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant N | View as Marketing request view mode for OMR criteria part. | Tab | +| | Result | One gird to view the customer list on each variation | | | | | | | --- | --- | --- | --- | --- | | **Variation** | **Total number of customers** | **Total Female customer** | **Total male customer** | **….** | | Variation A | 100 | 10 | 90 | | | Variation B | 150 | 100 | 50 | | | Variation n | 140 | 50 | 90 | | | ==tbd== **Which criteria should be summarized??** | + +* 1. **A/Bn batch job will trigger marketing request as following processing:** + 1. A/Bn testing job (ABn) just trigger effectived A/Bn testing requests based on effectived period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + 2. For content testing, ABn creates A/Bn message content selected based on the variation content configured by user. These message to be sent to the same customers selected based on criteria configured by users. E.g to send 3 promotion messages to customers whose birthday is due in the next N days. The result testing should be provied by parter so that OLS can provide the report to user can decide which content messge is better. + 3. Regarding to target customer testing, A/Bn locates the target customer based on criteria configured by users. User can verify the result testing after batch job is completed. + 4. For A/Bn SMS content testing, we can track click-through rates if SMS includes links or calls to action. By including unique links for different messages or recipients, we can measure how many people clicked on those links to interact with each content. From this result we can have the temporary open rate to user can decide which one is better. + 5. For A/Bn Email content testing, open rate = (Number of opens / Number of delivered emails)/100. Number of opens is provided by third-party or we have to send email is in HTML format, as tracking pixels work with HTML emails. The number of opens willl be is the number of times the tracking pixel was downloaded when recipients opened the email. + 6. ==tbd== + +#### Post-condition + +#### Exception flow + +### BlackList + +#### Requirement Definition + +* + - 1. The business need to exclude specific customer or groups from marketing campaigns for strategic reasons, such as fraud customers. + 2. Ensuring marketing efforts are focused on the most relevant and engaged audience to improve efficiency and return on investment. + 3. A set of customer who will be blocked for reward/promotion notification from a business wil be pre-definiton in this module. + +#### Process flow + +#### Trigger + +* + - * 1. The customer who has fraud behaviors will need to be added into black list. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Black List” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be blocked from the marketing campaign by uploading a file into the system. + +Additionally, users are able to assign customers to the blacklist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this blacklist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the black list. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be blocked from the marketing campaign if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The blacklist is stored and accessible to another module. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +### Whitelist + +#### Requirement Definition + +* + - 1. The business need to exclude a list of customers that are excluded from the standard frequency cap rules. + 2. The whitelist ensures your top customers continue receiving your marketing messages without limit. We can use the whitelist for testing and optimizing campaign purposes. We can aslo use the whitelist for user who have shown strong interest in your marketing campaigns. + +#### Process flow + +#### Trigger + +* + - * 1. A set of customers needs to be added to the whitelist to exlcuse them from the frequency cap rules. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Whitelist” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be excluded from the frequency cap rules by uploading a file into the system. + +Additionally, users are able to assign customers to the whitelist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this whitelist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the whitelist. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be excluded from the frequency cap rules if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The whitelist is stored and accessible to another module. + +The whitelist is excludes from the frequency cap rules as default. If there is any cap rules should need to include the whitelist then the user should indicate those whitelist. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +## OneCatalogue + +### About Redemption Item in OLS system + +#### Overview + +1. The catalogue is used to set up items for online (web site, Mobile App) redemptions. +2. Redemption items such as Cash-back rebates, frequent flyer miles conversion and merchant vouchers can be set up in the redemption catalogue. +3. Front-end systems access the catalogue through web services to display available items. +4. Front-end systems accept user requests to redeem and send these requests to OLS for authorization (deduction of the relevant points) and to generate the fulfilment files for sending to designated recipient systems. +5. Catalogues are managed through the browser-based administration screens, which update the catalogue in real-time. Once “Approved” the item is available commencing on the Start Date. +6. Functions include adding catalogues to the system, adding items to catalogues, setting price rules and processing redemption requests from front-end systems. +7. OLS also provides an administration function for back-office staff to redeem items through the administration screens directly on behalf of customers. + +### Catalogue + +#### Requirement Definition + +* + - 1. A Catalogue must be defined and all items to be included in the Catalogue must be tagged with the Catalogue code before customers access the items. + 2. A Catalogue code is tagged against each Item Master record. + 3. More than one Catalogue can be configured at the same time, but each Catalogue must have its own set of Item master records. + 4. Each Catalogue has a Start / End date range and items in the Catalogue will be picked for presentation to customer only if the current date falls in the Start / End date range for that Catalogue. + +#### Process Flow + +==tbd== + +#### Trigger + +* + - * 1. If an item is to be tagged to a Catalouge that has not yet been defined. + +#### Pre-condition + +1. Users have to have access rights in “Catalogue” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve catalogue records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Catalouge icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Catalouge is illustrated in section 7.2.5. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin chung** | | | | +| | Catalogue Code \*/Mã nhóm danh mục | User-specified code identifying the catalogue. Used by front-end system when requesting for item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this catalogue. For user reference only. Default description which will be used in case there is no specific description for chosen language. | X(50) | +| | Effective From Date \*/Có hiệu lực từ ngày | Catalogue is effective only when the processing date is between Start Date and End Date, inclusive. | Date | +| | Effective To Date \*/Có hiệu lực đến ngày | Date | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of catalogue | Image | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this catalogue. For user reference on MP only. | X(100) | + +#### Post- Conditon + +The Catalouge information for each item can be returned to the front-end during an Item Enquiry response message for the front-end to use in searching the catalogue for items. + +#### Exception Flow + +N/A + +### Category + +#### Requirement Definition + +A catalog is the main folder to organize categories and items for materials. A category is a group within a catalog that contains items. All items to be included in the Catalogue must be tagged with the Category code. Multiple Categories can be linked to form a hierarchy of categories. The hierarchy of categories is used on Member site. + +#### Process Flow + +#### Trigger + +If an item is to be tagged to a catagory that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Category” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve category records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on the category icon in the navigation panel under OneCatalouge to get a listing of existing catalogues. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the category is illustrated in section 7.3.4. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin Chung** | | | | +| | Category Code \*/Mã danh mục vật phẩm | User-specified code identifying the category. Used by front-end system when requesting item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this category. For user reference only. Default description which will be used in case there is no specific description for the chosen language. | X(100) | +| | Effective From Date /Có hiệu lực từ ngày | Category is effective only when the processing date is between the Start Date and the End Date, inclusive. If an effective date is not provided then this is a non-expire category. | Date | +| | Effective To Date /Có hiệu lực đến ngày | Date | +| | Parent Category | Multiple Categories can be linked to form a hierarchy of categories. | Drop-down Select one The parent categories value from master data. | +| | Display Ordering /Thứ tự hiển thi | The display ordering sequence on the Member Site. | 9(3) | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of the category. | Image | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condition field This field is only active and required when the image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this category in the choosen language. For user reference on MP only. | X(100) | + +#### Post –Condition + +#### Exception Flow + +### Item master + +#### Requirement Definition + +Describe details about a particular item: e.g. prices, quantities, availability dates, terms and conditions, etc. Item Master Records cannot be created unless the Stock Code is in place. + +#### Process Flow + +#### Trigger + +New items need to be defined. + +#### Pre –Condition + +1. Users have to have access rights in the “Item Master” screen under the “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Item Master records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Master is illustrated in section 7.4.4 +3. **Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information: Mandatory Step** | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The Catalogue for which this item is being configured. | Drop-down Select one | +| | Category/Danh mục vật phẩm | Select the category under which this item is to be tagged, to facilitate searching in the customer-facing page – e.g. Retailer Vouchers, Frequent Flyer Points, Cash Rebate, etc. | Drop-down Multiples select | +| | Item Code\*/Mã vật phẩm | Enter the item code to be added to the catalogue. This is Item identify. | X(10) | +| | Item Name \*/Tên vật phẩm | Short description field used by customer-facing application for display for Catalogue item. The text can include control characters. This is default name in case there is no specific item name of chosen language in the member site. | X(50) | +| | Redemption From Date From\*/Có hiệu lực từ ngày | “**From Date**” & “**To Date**” specify the period within this item is available and may be included in the Catalogue display and when after which it becomes unavailable and is excluded from the Catalogue display. OLS will reject the Start Date and End Date if they are outside the Catalogue/Category Start Date and End Date period. Once the item has been started for redemption, only End date will be allowed to modify. | Date | +| | Redemption To Date \*/ Có hiệu lực đến ngày | Date | +| | Redemption Store /Đối tác | Supplier of this item. The merchant (Store) that has to be configured appropriately in order for straight-through settlement processing. | Drop-down Select one | +| | Redemption Transaction Code\*/Mã giao dịch đổi thưởng | OLS TC used for redemption processing and logging. | Drop-down Select one | +| | Award Transaction Code/Mã giao dịch tặng thưởng | OLS TC If selected, the **OLS** **Transaction Code”** used to locate any award campaign rules to be executed as a result of the catalogue item redemption. | Drop-down Select one | +| | Item Type \*/ Loại vật phẩm | The type of item Choose one of following types : * + 1. Miles 2. Physical 3. eVoucher 4. Donation 5. Cash rebate 6. Other | Radio button Item type list from master data | +| | Voucher Code /Mã voucher | Condition field A drop-down to select voucher code This field is only active and required when item is an eVoucher | Drop-down Select one | +| | Face value/ Partner Point / Giá trị vật phẩm | Condition field This field is only active and required for Cash rebate/eVoucher/Miles item. This is the value of the cash rebate/voucher /miles that customer sees. This value is not used if the Face Value is also specified in the Item Price set-up | 9(14,2) Should be positive value | +| | Display on Member Site | Turn off to restrict this item in member site. | Switch button Default ON | +| | Hot item /Vật phẩm hot | Condition field This field is active only when this item is displayed on the member site Choose to indicate this is a hot item. Used to display on Member Site. | Switch button Default OFF | +| | Display Ordering/ Thứ tự hiển thị | Condition filed This field is active only when this item is displayed on the member site The ordering sequence to display on member site | 9(3) Should be greater than 0 if provided | +| | Track Quantiy on Hand/ Theo dõi số lượng vật phẩm | ON mode if the item is an item and that requires inventory control: the “Quantity-on-Hand” is updated for such items during redemption. If this is a Voucher Code item, this field is force-set to Yes and cannot be changed. | Switch button Default OFF | +| | Initialize Quantity of Stocks/ Số lượng ban đầu | Condition filed This field is only active and required if track quantity on hand. Canot edit this value if this item has been redeemed. This field is not activated for the Evoucher item due to the number of voucher being generated by another feature (via the Voucher Code screen or batch file). | 9(9) Should be positive value. In case item has been redemmed, then not allow to modify this field. Just display only | +| **Item detail : Mandatory step** **This step involves configuring the details of each item in multiple languages. By doing so, the system can utilize the specific details tailored to each language.** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific item detail. | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Item name\*/Tên vật phẩm | Specific item name in the choosen language. | X(50) | +| | Item Description/Mô tả vật phẩm | Specific item description in the chosen language. | X(100) | +| | Item content/Thông tin chi tiết | The content of item in the choosen language | X(2000) | +| | How to use /Cách sử dụng | The way to use the item in the choosen language | X(2000) | +| | Term and Conditon/ Điều khoản | Term and Conditon Free text to be returned in the Terms and Conditions field in the Web Service message and in redemption output template letters and email. | X(2000) | +| **Item Image /Ảnh vật phẩm** Optional step | | | | +| | Select image | Click to add image for item | Button | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condiiton field This field is only active and required when image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Sort Order | The display odering sequence on Member Site. | 9(3) Should be greater than 0 if provided | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Contact and Address information** Optional step | | | | +| | Add Address | Click to add item address where we can to use this item | Button | +| | City\* | The drop-down to select the city where can use this item | Drop-down Select one | +| | Address | Address detail | X(200) | +| | Email | Email address | X(100) | +| | Phone | Phone number | X(20) | + +#### Post-Condition + +* + 1. The newly created item should have all required fields populated with valid data. + 2. The system should add/updated items in the database. + 3. Other screen which lookup to item screen must be able to use new item. + +#### Exception Flow + +### Item price + +#### Requirement Definition + +* + - 1. Outlines the specifc criteria, functionalities and parameter that determine and manage item prices in the OLS: + 1. Point valuation: Define the conversion rate between reward points and redemption quanity (e.g 100 point = 1 Ticket movie voucher) to establish the baseline for item redemption. + 2. Criterions pricing: specify if different pricing tiers will be available for customer based on their account type or redemption channel or specific criterions such as gender, redemption quantity,etc. + 3. Redemption options: Define the types of items price available for redemption, including using point only or both cash and points. + +#### Process Flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. New item is defined and must define item price to process redemption processing for this item. + 2. If an item is to be tagged to a price that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Item Master” screen under “OneCatalouge” module. +2. User have to have access rights in “Item Price” Screen under “OnCatalouge” module. +3. Depending on the user's access rights, they can view, add, edit, or approve Item Price records. + +#### Wireframe + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing item master. +2. Click to view detail any active item master records to bring up the “Item Price” screen as a new tab under item master detail record. +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Price is illustrated in section 7.5.5 +4. **Edit Screen Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | Item Code \*/ Mã vật phẩm | Item code | Display if configure item pirce under specific item. Drop-down list to select an item code to configure the item price | +| | Price Code\*/Mã giá | The identify of the item price For user refrence only | X(10) | +| | Pirce Name \*/Tên giá | Default name of the price For user reference only | X(100) | +| | Effective Start Date \*/ Hiệu lực từ ngày | **From Date**” & “**To Date**” specify the period within this price. | Date | +| | Effective End Date \*/ Hiệu lực tới ngày | Date | +| | Redemption Channel \*/Kênh đổi thưởng | The drop-down to select the redemption channel. Supported channels are: Call Center Mobile Application Internet Banking Etc | Drop-down Select one | +| | Account Type Group/Nhóm loại tài khoản | Optional filed If Account Type or Account level is selected then account type group is blocked and vice versa. | Drop-down Multi-select | +| | Product Account Level /Hạng tài khoản | Optional field The drop-down to select the Account level (Card Level) to this this price applies. Leave as empty if all Account level are applies to this prce. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Select one | +| | Product Account Type/Loại tài khoản | Optional field Optional field Multi-select drop-down to select the Account Type (Card Type) of selected account level in previous step which will be applies to this price. Leave as empty if all account types of selected PAL are applies to this price. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Multi-select | +| | Redemption Pool\*/Pool đổi thưởng | Select the Pool from which to deduct points for redeeming this item | Drop-down Select one | +| | Use Only Points from Selected PA Type/Chỉ sử dụng điểm từ các loại nhóm tai khoản được chỉ định | Restrict the use of points for redemption of this item at this price to only points earned by the selected account Type/ATG | Switch button Default OFF | +| | Face value /Trị giá vật phẩm | If transacting Customer/Account meets the criteria in this set-up, what the Customer receives is this “Face Value”. E.g. if this is 500 KrisFlyer Miles, Customer receives 500 KrisFlyer Miles for redeeming one of this item. | 9(12,2) Should be greater than 0 if provided | +| | Price in point \*(Full redemption) / Giá trị điểm | Price of item if paid for fully in points from the selected Pool | 9(12,2) Should be greater than 0 if provided | +| | Original price /Giá gốc | The original price of the item For user reference only | 9(12,2) Should be greater than 0 if provided | +| | Partial Redemption Allowed/Cho phép đổi thưởng 1 phần | If allowed, customer can use a mix of points and cash to pay for this item. The number of points and amount of cash are derived from “Price in Cash Value-per Point” and “Minimum Partial Redeem Points”. See the description for these fields. | Swith button Default OFF | +| | Minimum Partial Redeem Points/Số điểm tối thiểu | Condition field This field is only active and required when Partinal Redemption is allowed. Customer must use at least this number of points to redeem this item. | 9(12,2) Should be greater than or equal to 0 if provided 0 for full cash redemption | +| | Cash per point/ Số tiền chi trả | Condition field This field is only active and required when Partinal Redemption is allowed. This is used to calculate the amount of cash required to redeem this item after taking into account the points redeemed, if any. | 9(12,2) Should be greater than 0 if provided | +| | Appliable Taxes | The drop-down list to select the tax rate to be applicable. | Drop –down Select one Get data from “Tax Rate Maintenance” Screen | +| **Price detail :** **Optional step. If not provide then use default item price name to display if needed** | | | | +| | Select language /Chọn ngôn ngữ | Click to add item price detail on each language For user reference only | Button | +| | Language \*/Ngôn ngữ | The drop-down to select the language to setup the specific item price detail | Drop-down Select one | +| | Item price Name \*/Tên giá | The specific name of chosen language For user reference only | X(100) | +| | Description/ Mô tả | The description of the price For user reference only | X(500) | +| **Item criteria** A part to add criteria to meet the price The approach the same as Rule criteria but just display all criteria which be tagged to “Item price “ module only | | | | +| | | ![](data:image/png;base64...) | Click to add new criteria | +| | | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | +| | | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | +| | | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute and to be tagged for “Item Price “ module | +| | | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. | +| | | ![](data:image/png;base64...) | Click to delete criteria | +| | | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | + +#### Post-Condition + +With the item price configuration then here is the flow to get item price. + +Valid price + +![](data:image/x-emf;base64...) + +What is the price of the transaction + +![](data:image/x-emf;base64...) + +#### Exception Flow + +### Voucher Code + +#### Requirement Definition + +1 If the Item to be set up is for distribution of Voucher Numbers to customers, and these Voucher Numbers are from external partner merchants, then the Voucher Numbers must first be set up in OLS by uploading/creating the stock of Voucher Numbers. + +2 This voucher upload file must contain the Voucher Code (which identifies what this voucher is for – e.g. “$5 Lazada Voucher”), the period within which the vouchers are accepted at the partner merchant, and the individual voucher serial numbers (Voucher Numbers). + +3 The file format is set out later (to be decided). + +4 This upload can be done using the “Upload” functions in this screen. + +#### Process Flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have access rights in “Voucher Management” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Voucher records. + +#### Wireframe + +* + - 1. **Create/Edit mode** + +![](data:image/png;base64...) + +* + - 1. **View mode** + +![](data:image/png;base64...) + +1. Listing page +2. **Voucher Detail view** + 1. Listing Page + +![](data:image/png;base64...) + +* 1. View + +Click to any record on the listing page to bring up the detail view as following: + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Voucher icon in navigation panel under OneCatalogue to get a listing of existing Voucher Code as illustrated in section Wireframe. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Voucher is illustrated in section Wireframe. +3. Double click on any existing record in Active Tab then the Voucher Detail listing is illustrated in section 7.6.5. +4. The system just allow to view the Voucher detail only. +5. Can not allow deleting the voucher Code if voucher have been redeemed. +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Screen 1: Voucher Code** | | | | +| | **Voucher statistic / Tổng hợp thông tin voucher** **This is displayed for active record only** | | | +| | Total Voucher /Tổng voucher | Total the serial number voucher belong to the choosen voucher code | Display as interger format | +| | Available Vouchers /Số voucher khả dụng | Total the valid voucher and ready to use: The voucher has not yet been redeemed and non- expired. | +| | Redeemed Vouchers/ Voucher đã đổi thưởng | Total the numner of the successfully redeemed vouchers. | +| | Cancelled Vouchers/ Voucher đã hủy | Total the number of the fail redeemed vouchers which is cancelled by customers/system by specific reason. | +| | Expired Vouchers/Voucher đã hết hạn | Total the number of expired voucher that has not yet been redeemed. Use processing date to compare with expiry date of the voucher. | +| | **Voucher Code Detail information** | | | +| | Voucher Code\*/Mã voucher | Identifies the voucher. | ~~X(20)~~ X(10) | +| | Description /Mô tả | The description of the voucher. For user reference only. | X(100) | +| | Supplier / Nhà cung cấp | The partner/ organization that issues or provides the voucher | Drop-down Select one | +| | Expiry Policy \*/ Hạn sử dụng | A drop-down list with the following choices: * Fixed Date: Voucher will expire after the date specified in the “Expiry Date” parameter. * N days from Transaction Date: Voucher will expire after N days from Redemption Date (Transaction Date). * N days from Post Date: Voucher will expire after N days from redemption transaction is posted on the OLS. * N Months from Transaction Date: Voucher will expire after N months from redemption Date. * N months from Post Date: Voucher will expire after N moths from the moment a redemption transaction is posted on the OLS. | Drop-down Select one | +| | Expiry Date / Ngày hết hạn | Condition field This field is only active and required when the expiry policy is “Fixed Date”. **A transaction which redeem this voucher is not allowed to have Transaction Date later than this date.** Can not allow editing the policy (including the relative field that be used to determine expiry date of the voucher) | Date | +| | N Param/ Tham số N | Condition field This field is only active and required when the Expiry Policy selected in the previous step requires a parameter N param. e.g. “N days from Transaction Date” | 9(3) Should be greater than or equal to 0 if provided | +| | Generate Voucher /Khởi tạo voucher | Turn on when the voucher is generated by OLS instead partner. The system will automation create the number of vouher which user will provide on next step. This field can’t be changed if the voucher have been redeemed. | Swith button Default OFF | +| | Quantity /Số lượng | Condition filed This filed is only active and required if “Generate Voucher” in the previous step under ON mode. Specifies the number of voucher codes to be generated. **When a voucher code record is approved in the system, the system should automatically generate voucher numbers corresponding to the entered quantity.** This field can’t be changed if the voucher have been redeemed. In case users want to change then it should be “re-stock”/ “void” voucher use case instead. | 9(5) Should be greater than 0 if provided | +| | This is a promo code/ Đây là mã khuyến mãi | Turn on when this is a promo code. For user reference only | Swith button Default OFF | +| | ~~Voucher Type/Loại voucher~~ Promotion Type/Loại khuyến mãi | Conditon filed This field is only active and required when this voucher is a promo code. A drop-down list with the following choices: * Fixed Percentage Discount: This type of voucher offers a discount as a percentage of the total purchase amount. * Fixed Monetary Value Discount: Instead of a percentage, this voucher provides a fixed monetary discount. * Cashback Voucher: For this type of voucher, the customer receives a certain percentage of the purchase amount back as cashback to use on future purchases. * Gif Voucher: This type of voucher is often purchased as a gift for someone else. It typically has a fixed monetary value that the recipient can use towards their purchases. | Drop-down Select one | +| | Value /Giá trị | The specific value which customer can get from chosen voucher type. Condition field This field is only active and required when “Fixed Monetary Value” / “Fixed Percentation Discount” are selected on the previous step. | 9(14,2) Should be greater than 0 if provided | +| **Screen 2: Voucher Detail** **Each voucher No is displayed under one detail record in listing page** **Voucher detail is introduced as a subtab of Active voucher record.** | | | | +| | Voucher Code | Choosen voucher code | Display | +| | Voucher No | The serial voucher number of choosen voucher | +| | Redemption Date | The date when voucher is redeemed | +| | Expiry Date | Expiry date of the voucher number which is based on choosen expiry policy of the choosen voucher | +| | Redemption Indicator | One of following values: * No: If voucher is not used for any redemption transaction. * Yes: If voucher have been redeemed by customer. | +| | Fulfillment Status | One of following values: * New: When voucher is created/uploaded in OLS then the fuillment status should be new to indicator that voucher to be availbale to redeem. * Issued: The FFS is changed into Issued when voucher is successfully redeemed in the OLS. * **Fulfilled: The FFS is changed into Fulfilled when voucher is successfully redeemed and partner accept this voucher.** * Cancelled: FFS is changed intpo “Cancelled” if the customer cancels the transaction or if there are issues with the voucher that prevent its redemption. * Rejected: The vendor has rejected the voucher due to some reasons such as term and conditions, policy changes.etc. The fufillment status is updated when fulfilment status is changed. | + +* + - 1. User who can create new voucher can use “upload” function to upload the voucher file into OLS + +#### Post-Condition + +#### Exception Flow + +## OneTargeting + +### Segmentation Definiiton + +#### Requirement Definition + +* 1. Segmentation is one proessing to divide a customer base into smaller, that provides a way to narrow down the target audience based on the types of products or services the customers have previously purchased. + 2. This screen allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. + 3. In the system sides, segement is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup the targeting customer. + +#### Process Flow + +#### Trigger + +* + 1. User access to the OneTargeting Module to create/update new segment. + +#### Pre-Condition + +1. Users have to have access rights in “Segmentation” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. +3. Assume that all criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +#### Sktech + +* + - 1. Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. View mode + +#### Business Rule + +1. The same approach as Campaing Rule Crireria screen, OLS system will use Query Builder to build query for this screen. +2. Refer to [Rule Criteria](#_Business_rules_1) section to get more detail about the business rule of this screen. The criterion list are described in the #3. +3. Here are some way that business segment their targeting customer : + +| **Index** | **Segement Group** | **Criteria Group** | **Combination by following Criteia** | **Segment Example** | +| --- | --- | --- | --- | --- | +| | Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children: 0 -14 Youth: 15- 24 Adults: 24- 64 Seniors: 65 and above | +| Last Name | | +| First Name | | +| Income | **Income segment**: High-Income Customer Middle –Icome Customer Low-Income Customer | +| Gender | Male customer Female customer | +| Marital Status | Singel customer Married customer | +| DOB | **Generation segment:** Gen Z: Year DOB from 1997 – 2012 Gen Y: 1981 – 1996 Gen X: 1965 – 1980 Gen W (Baby Boomers): 1946- 1964 | +| Location: Country/State/City/Zip Code | **Geography segement:** International customer Urban customer Suburban customer Mountain Customer | +| Customer’s Tenure | **Customer’s Tunure** **Segment** (Use Customer Registration) : New customer: under 1 year Early- tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long - tenured customer: above 5 years | +| Account ‘s Tenure | **Account’s Tunure** **Segment** (use AOD) : New customer: under 1 year Early - tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long tenured customer: above 5 years | +| Account’s Status | | +| Next AOD | | +| Customer’s staus | Used in the many segment that | +| | Behavior Segmentation | Transaction | Last transaction /Integration | **Churned customer :** E.g Last transaction is more than 6 months ago and customer status is active | +| Transaction Frequency: Should be tracked in the specific period such as day/week/month / Quarter/Year/Custom period to determine for following criteria : * + 1. **Total number txn frequency on the specific period.** 2. **Avegare txn frequency** | **Customer Segment:** High-Value Customers: frequency range depend on each business rule Medium-Value Customers: frequency range depend on each business rule Low-Value Customers: frequency range depend on each business rule | +| Customer Recency: When was the last transaction/ integration. | +| Total spending value: How much customer spends (total nett transaction amount) | +| Transaction Date | **Peak –Time customer:** E.g Transaction date is on special day Transaction date on weekend (day of the week) Midnight transaction (Time of the transaction) **Consistent-Time Customers**: E.g Transaciton do on each the first day of the month **Flexible-Time Customers** E.g Transaciton is on specific day | +| Transaction Time | +| Merchant: Coporation/Chain/Store/MCC | Use with another crieteria or itself only to create specific segment | +| Merchant Group: Coporation/Chain/Store/MCC Group | +| Transaction Description | +| Transaction Category | +| Transaction Gross Amount | +| Transaction Nett Amount | +| | Flexible segment | Attribute | Attribute Criteria | | +| | Psychographic Segmentation | Item | Favorite Category | **Life Style segment** **Interest segment** **Opinion segment** | +| Favorite Item | +| To be added when implement onedisplay so that we can have the data source for collect the Psychographic Segmentation from survey to decision the marketing strategy | + +#### Post-Condition + +* + - * 1. Each segment are used to define the targeting customer on the marketing module. + +#### Exception Flow + +### Audience Upload + +#### Requirement Definition + +Provide a user –friendly interface to marketers to manage audience uploads. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have access rights in “Audience Upload” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. + +#### Sktech + +#### Business rules + +Users are able to upload a customer data for targeted marketing campaigns by uploading a file into the system. + +The system should allow users map data from their source files to the required platform fields by accepting the CSV, excel spreadsheets. + +The system validates the uploaded data to ensure all required fields are present and in the correct format + +Screen descrition + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data Type** | +| **Listing page** | | | | +| | Audience Name /Tệp khán giả | Name of the audience | Dipslay | +| | Description /Mô tả | Audience description For use refer only | Display | +| | File size /Dung lượng tệp | The file size | Display as number format | +| | ![](data:image/png;base64...) | By clicking here to download the audience. This should be orginal file tha user already uploaded. | Button | +| **Create/Edit Mode** | | | | +| | File ID \*/ ID tệp | Audience identifier For system refer only | X(10) | +| | Audience Name \*/ Tệp khán giả | The name of the audience Should be uniquie value in the system. | X(50) | +| | Description /Mô tả | Audience description | X(200) | +| | Upload file \*/ Đăng tệp tin lên | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse file from their device. | Button | +| | | | | + +#### Post-condition + +#### Exception Condition + +### Customer Audience + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +End of Document \ No newline at end of file diff --git a/docs/staging/clean/outline.md b/docs/staging/clean/outline.md new file mode 100644 index 0000000..72c99c8 --- /dev/null +++ b/docs/staging/clean/outline.md @@ -0,0 +1,86 @@ +# OLS Loyalty Marketing System FSD +## Reference +## Introduction +### Scope of Document +### Terminology +### Structure of Document +## OneAccess +### Overview +### User Group +### Permission Management +### User Profile +## OneAdmin™ +### Overview +### Types of Screen Layouts +### Home Page +### Summary Listing Screens +### Detail View +### Add/ Edit Screen +### Approve Pending Record +### Record History +## Application Parameter +### Requirement Definition +### Process Flow +### Wireframe +### Trigger +### Pre-condition +### Business Rule +### Post-Condition +### Exception flow +## Reward Campaign Management +### Highlights +### Structure of a Campaign (HAVE TO BE ADJUSTED) +### About Loyalty Marketing Campaigns (HAVE TO BE ADDED) +### External Transaction Code +### OLS Transaction Code +### Pool Definition +### Pool Conversion Rate +### Counter Definition +### Transaction Category +### Account Type Group +### Reward Campaign +### Reward Campaign Rule +### Campaign Rule Criteria +### Campaign Rule Formula +### Campaign Rule – Contributor Settings +### Counter Extract & Process (CEP) Request +### Redemption Extract & Process (REP) Rule +### Item Redemtion Rule Type (ITRD) +### Transaction Rule Analysis (HAVE TO BE ADDED) +### Campaign Insight +### One tester (HAVE TO BE ADDED) +## Customer management +### Customer profile +### Customer 360 +### Account +### Card +### Pool Balance Detail +### Transaction History +### No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT +### Statement +### Attribute +### Counter +### Adjustment +### Transfer balance +### Re-instatement +### Item Redemption +### Award Transaction +## OneMarketing +### Overview +### Marketing message +### Marketing Campaign +### Marketing Frequency Cap +### A/Bn Testing +### BlackList +### Whitelist +## OneCatalogue +### About Redemption Item in OLS system +### Catalogue +### Category +### Item master +### Item price +### Voucher Code +## OneTargeting +### Segmentation Definiiton +### Audience Upload +### Customer Audience diff --git a/docs/staging/raw/FSD P1_Finnal Version.md b/docs/staging/raw/FSD P1_Finnal Version.md new file mode 100644 index 0000000..a78e256 --- /dev/null +++ b/docs/staging/raw/FSD P1_Finnal Version.md @@ -0,0 +1,6179 @@ +--- +title: "Fsd P1 Finnal Version" +source: "docs/FSD P1_Finnal Version.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +OLS Loyalty Marketing System FSD + +Reference 13 + +Change History 14 + +1 Introduction (HAVE TO BE ADJUSTED) 15 + +1.1 Scope of Document 15 + +1.2 Terminology 15 + +1.3 Structure of Document 18 + +2 OneAccess 19 + +2.1 Overview 19 + +2.2 User Group 19 + +2.2.1 Business Requirement 19 + +2.2.2 Process Flow 19 + +2.2.3 Trigger 19 + +2.2.4 Post –Condition 19 + +2.2.5 Wireframe 19 + +2.2.6 Business Rule 19 + +2.2.7 Post –Condition 20 + +2.2.8 Exception Flow 20 + +2.3 Persmission Management 20 + +2.3.1 Business requirement 20 + +2.3.2 Process flow 20 + +2.3.3 Trigger 20 + +2.3.4 Post-codition 21 + +2.3.5 Wireframe 21 + +2.3.6 Business rule 21 + +2.3.7 Post-Condition 24 + +2.3.8 Exception flow 24 + +2.4 User Profile 24 + +2.4.1 Business requirement 24 + +2.4.2 Process flow 24 + +2.4.3 Trigger 24 + +2.4.4 Post-codition 24 + +2.4.5 Wireframe 24 + +2.4.6 Business rule 25 + +2.4.7 Post-Condition 27 + +2.4.8 Exception flow 27 + +3 OneAdmin™ 27 + +3.1 Overview 27 + +3.2 Types of Screen Layouts 28 + +3.3 Home Page 28 + +3.4 Summary Listing Screens (have to be adjusted) 30 + +3.5 Detail View (have to be adjusted) 32 + +3.6 Add Form (have to be adjusted) 34 + +3.7 Edit Form (have to be adjusted) 34 + +3.8 Approve Pending Record (Have to be adjusted) 35 + +3.9 Record History (have to be adjusted) 37 + +3.10 Record Copy (have to be adjusted) 37 + +4 Campaign Management 39 + +4.1 Highlights 39 + +4.2 Structure of a Campaign (HAVE TO BE ADJUSTED) 40 + +4.2.1 Types of Campaign Mechanics 40 + +4.2.2 Award on Every Transaction 41 + +4.2.3 Accumulate Then Award 41 + +4.2.4 Auto-redemption Campaigns 42 + +4.2.5 Reward Pool Structure & Bucket Deduction Sequence 42 + +4.2.6 Counters – Structure and Mechanics 42 + +4.3 About Loyalty Marketing Campaigns (HAVE TO BE ADDED) 46 + +4.4 External Transaction Code 46 + +**4.4.1** Requirement Definition 46 + +4.4.2 Process flow 47 + +4.4.3 Trigger 47 + +4.4.4 Pre-Condition 47 + +4.4.5 Wireframe 47 + +4.4.6 Business rules 49 + +4.4.7 Post-condition 50 + +4.4.8 Exception flow 50 + +4.5 OLS Transaction Code 50 + +4.5.1 Requirement Definition 50 + +4.5.2 Process flow 51 + +4.5.3 Trigger 51 + +4.5.4 Pre-Condition 51 + +4.5.5 Wireframe 52 + +4.5.6 Business rules 54 + +4.5.7 Post-condition 55 + +4.5.8 Exception flow 55 + +4.6 Pool Definition 55 + +4.6.1 Requirement Definition 55 + +4.6.2 Process flow 56 + +4.6.3 Trigger 56 + +4.6.4 Pre-Condition 56 + +4.6.5 Wireframe 57 + +4.6.6 Business rules 64 + +4.6.7 Post-condition 72 + +4.6.8 Exception flow 73 + +4.7 Pool Conversion Rate 73 + +4.7.1 Requirement Definition 73 + +4.7.2 Process flow 73 + +4.7.3 Trigger 73 + +4.7.4 Pre-Condition 73 + +4.7.5 Wireframe 74 + +4.7.6 Business rules 77 + +4.7.7 Post-condition 78 + +**4.7.8** Exception flow 79 + +4.8 Counter Definition 79 + +4.8.1 Requirement Definition 79 + +4.8.2 Process flow 80 + +4.8.3 Trigger 80 + +4.8.4 Pre-Condition 80 + +4.8.5 Wireframe 80 + +4.8.6 Business rules 83 + +4.8.7 Post-condition 87 + +4.8.8 Exception flow 88 + +4.9 Transaction Category 88 + +4.9.1 Requirement Definition 88 + +**4.9.2** Process flow 88 + +**4.9.3** Trigger 88 + +4.9.4 Pre-Condition 88 + +4.9.5 Wireframe 89 + +4.9.6 Business rules 91 + +**4.9.7** Post-condition 92 + +**4.9.8** Exception flow 92 + +4.10 Account Type Group 92 + +4.10.1 Requirement Definition 92 + +4.10.2 Process flow 93 + +4.10.3 Trigger 93 + +4.10.4 Pre-Condition 93 + +4.10.5 Wireframe 93 + +4.10.6 Business rules 96 + +4.10.7 Post-condition 98 + +4.10.8 Exception flow 99 + +4.11 Campaign Management 100 + +4.11.1 Requirement Definition 100 + +**4.11.2** Process flow 100 + +**4.11.3** Trigger 100 + +4.11.4 Pre-Condition 100 + +4.11.5 Wireframe 100 + +4.11.6 Business rules 101 + +4.11.7 Post-condition 102 + +**4.11.8** Exception flow 102 + +4.12 Campaign Rule 102 + +4.12.1 Requirement Definition 102 + +4.12.2 Process flow 103 + +4.12.3 Trigger 103 + +4.12.4 Pre-condition 103 + +4.12.5 Wirefame 103 + +4.12.6 Business rule 103 + +4.12.7 Post-condition 109 + +4.12.8 Exception flow 109 + +4.13 Campaign Rule Criteria 109 + +4.13.1 Requirement Definition 109 + +4.13.2 Process flow 110 + +4.13.3 Trigger 110 + +4.13.4 Pre-Condition 110 + +4.13.5 Wireframe 111 + +4.13.6 Business rules 113 + +4.13.7 Post-condition 123 + +4.13.8 Exception flow 124 + +4.14 Campaign Rule Formula 124 + +4.14.1 Requirement Definition 124 + +**4.14.2** Process flow 124 + +**4.14.3** Trigger 124 + +**4.14.4** Pre-Condition 124 + +**4.14.5** Wireframe 124 + +4.14.6 Business rules 124 + +**4.14.7** Post-condition 124 + +**4.14.8** Exception flow 124 + +4.15 Campaign Rule – Contributor Settings 124 + +4.15.1 Requirement Definition 124 + +4.15.2 Process flow 125 + +4.15.3 Trigger 125 + +4.15.4 Pre-Condition 125 + +4.15.5 Wireframe 125 + +4.15.1 Business rules 126 + +4.15.2 Post-condition 127 + +**4.15.3** Exception flow 127 + +4.16 Counter Extract & Process (CEP) Request 127 + +4.16.1 Requirement Definition 127 + +**4.16.2** Process flow 128 + +4.16.3 Trigger 128 + +4.16.4 Pre-Condition 128 + +4.16.5 Wireframe 128 + +4.16.6 Business rules 128 + +4.16.7 Post-condition 133 + +4.16.8 Exception flow 134 + +4.17 Redemption Extract & Process (REP) Rule 134 + +4.17.1 Requirement Definition 134 + +**4.17.2** Process flow 134 + +4.17.3 Trigger 134 + +4.17.4 Pre-Condition 135 + +4.17.5 Wireframe 135 + +4.17.6 Business rules 135 + +4.17.7 Post-condition 140 + +**4.17.8** Exception flow 140 + +4.18 Item Redemtion Rule Type (ITRD) 140 + +4.18.1 Requirement Definition 140 + +4.18.2 Process flow 140 + +4.18.3 Trigger 140 + +4.18.4 Pre-Condition 140 + +4.18.5 Wireframe 140 + +4.18.6 Business rules 140 + +4.18.7 Post-condition 143 + +4.18.8 Exception flow 143 + +4.19 Transaction Rule Analysis (HAVE TO BE ADDED) 144 + +**4.19.1** Requirement Definition 144 + +**4.19.2** Process flow 144 + +**4.19.3** Trigger 144 + +**4.19.4** Pre-Condition 144 + +**4.19.5** Wireframe 144 + +**4.19.6** Business rules 144 + +**4.19.7** Post-condition 144 + +**4.19.8** Exception flow 144 + +4.20 Campaign Insight 144 + +4.20.1 Requirement Definition 144 + +4.20.2 Process flow 144 + +4.20.3 Trigger 144 + +4.20.4 Pre-Condition 144 + +4.20.5 Wireframe 145 + +4.20.6 Business rules 146 + +4.20.6.1 Top 10 Best customer of the campaign 146 + +4.20.6.2 Number of enrrolled customers not - eligible because of criteria 148 + +4.20.6.3 Number of enrolled customers eligibe vs not- eligible because of criteria 150 + +4.20.6.4 Earned points Vs redemmed points 151 + +4.20.6.5 Redemptions point on each channel 153 + +4.20.6.6 Redemption on each item type 155 + +4.20.6.7 Customer’s activities 156 + +4.20.6.8 Campagin statistic 157 + +4.20.7 Post-condition 159 + +4.20.8 Exception flow 159 + +4.21 One tester (HAVE TO BE ADDED) 160 + +**4.21.1** Requirement Definition 160 + +**4.21.2** Process flow 160 + +**4.21.3** Trigger 160 + +**4.21.4** Pre-Condition 160 + +**4.21.5** Wireframe 160 + +**4.21.6** Business rules 160 + +**4.21.7** Post-condition 160 + +**4.21.8** Exception flow 160 + +5 Customer management 160 + +5.1 Customer profile 160 + +5.1.1 Requirement Definition 160 + +5.1.2 Process flow 161 + +5.1.3 Trigger 161 + +5.1.4 Pre-Condition 161 + +5.1.5 Wireframe 161 + +5.1.6 Business rules 164 + +5.1.7 Post -condition 168 + +5.1.8 Exception flow 168 + +5.2 Customer 360 168 + +5.2.1 Requirement Definition 168 + +5.2.2 Process flow 168 + +5.2.3 Trigger 168 + +5.2.4 Pre-condition 169 + +5.2.5 Wireframe 170 + +5.2.6 Business Rules 171 + +5.2.6.1 Customer information 172 + +5.2.6.2 Customer’s rewards statistic 172 + +5.2.6.3 Account / Card information 173 + +5.2.6.4 Transaciton statistic 174 + +5.2.6.5 Customer Activities 178 + +5.2.6.6 Customer Segmentation 178 + +5.2.6.7 Most Redemmed Items 180 + +5.2.6.8 Balance information 181 + +5.2.7 Post – condition 182 + +5.2.8 Exception flow 182 + +5.3 Account 183 + +5.3.1 Requirement Definition 183 + +5.3.2 Process flow 184 + +5.3.3 Trigger 185 + +5.3.4 Pre-condition 185 + +5.3.5 Wireframe 185 + +5.3.6 Business rules 188 + +5.3.7 Post – Codition 191 + +5.3.8 Exception flow 191 + +5.4 Card 192 + +5.4.1 Requirement Definition 192 + +5.4.2 Process flow 193 + +5.4.3 Trigger 193 + +5.4.4 Pre-condition 194 + +5.4.5 Wireframe 194 + +5.4.6 Business rules 196 + +5.4.7 Post – Codition 199 + +5.4.8 Exception flow 199 + +5.5 Pool Balance Detail 199 + +5.5.1 Requirement Definition 199 + +5.5.2 Process flow 200 + +5.5.3 Trigger 200 + +5.5.4 Pre-condition 200 + +5.5.5 Wireframe 201 + +5.5.6 Business rules 202 + +5.5.7 Post – Codition 204 + +5.5.8 Exception flow 204 + +5.6 Transaction History 204 + +5.6.1 Requirement Definition 204 + +5.6.2 Process flow 205 + +5.6.3 Trigger 205 + +5.6.4 Pre-conditions 206 + +5.6.5 Wireframe 206 + +5.6.6 Business rules 209 + +5.6.7 Post – Codition 213 + +5.6.8 Exception flow 213 + +5.7 No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT 213 + +5.7.1 Requirement Definition 213 + +5.7.2 Process flow 214 + +5.7.3 Trigger 214 + +5.7.4 Pre-Conditions 214 + +5.7.5 Wireframe 215 + +5.7.6 Business rules 217 + +5.7.7 Post-condition 219 + +**5.7.8** Exception flow 219 + +5.8 Statement 219 + +5.8.1 Requirement Definition 219 + +5.8.2 Process flow 220 + +5.8.3 Trigger 220 + +5.8.4 Pre-condition 220 + +5.8.5 Wireframe 221 + +5.8.6 Business rules 222 + +5.8.7 Post – Condition 224 + +5.8.8 Exception flow 224 + +5.9 Attribute 224 + +5.9.1 Requirement Definition 224 + +5.9.2 Process flow 225 + +5.9.3 Trigger 225 + +5.9.4 Pre-condition 225 + +5.9.5 Wireframe 226 + +5.9.6 Business rules 227 + +5.9.7 Post-condition 230 + +**5.9.8** Exception flow 230 + +5.10 Counter 230 + +5.10.1 Requirement Definition 230 + +**5.10.2** Process flow 230 + +5.10.3 Trigger 230 + +5.10.4 Pre-Condition 231 + +5.10.5 Wireframe 231 + +5.10.6 Business rules 232 + +5.10.7 Post-condition 235 + +5.10.8 Exception flow 235 + +5.11 Adjustment 235 + +5.11.1 Requirement Definition 235 + +5.11.2 Process flow 235 + +5.11.3 Trigger 235 + +5.11.4 Pre-Condition 235 + +5.11.5 Wireframe 236 + +5.11.6 Business rules 239 + +5.11.7 Post-condition 245 + +5.11.8 Exception flow 245 + +5.12 Transfer balance 245 + +5.12.1 Requirement Definition 245 + +5.12.2 Process flow 246 + +5.12.3 Trigger 246 + +5.12.4 Pre-Condition 246 + +5.12.5 Wireframe 246 + +5.12.6 Business rules 248 + +5.12.7 Post-conditions 254 + +5.12.8 Exception flow 254 + +5.13 Re-instatement 254 + +5.13.1 Requirement Definition 254 + +5.13.2 Process flow 254 + +**5.13.3** Trigger 254 + +5.13.4 Pre-Condition 254 + +5.13.5 Wireframe 255 + +5.13.6 Business rules 256 + +**5.13.7** Post-condition 261 + +5.13.8 Exception flow 261 + +5.14 Item Redemption 261 + +5.14.1 Requirement Definition 261 + +5.14.2 Process flow 262 + +5.14.3 Trigger 263 + +5.14.4 Pre-Condition 263 + +5.14.5 Wireframe 263 + +5.14.6 Business rules 270 + +5.14.7 Post-condition 277 + +**5.14.8** Exception flow 278 + +5.15 Award Transaction 278 + +5.15.1 Requirement Definition 278 + +5.15.2 Process flow 278 + +5.15.3 Trigger 280 + +5.15.4 Pre-condition 280 + +5.15.5 Wireframe 280 + +5.15.6 Business Rules 280 + +5.15.7 Post-Codition 286 + +5.15.8 Exception -flow 286 + +6 OneMarketing 286 + +6.1 Overview 286 + +6.2 Marketing message 287 + +6.2.1 Requirement definition 287 + +6.2.2 Process flow 288 + +6.2.3 Trigger 289 + +6.2.4 Pre-conditions 289 + +6.2.5 Wireframe 289 + +6.2.6 Business Rules 298 + +6.2.7 Post -codition 305 + +6.2.8 Exception flow 305 + +6.3 Marketing Request 305 + +6.3.1 Requirement Definition 305 + +6.3.2 Process flow 306 + +6.3.3 Trigger 306 + +6.3.4 Pre- Conditon 306 + +6.3.5 Wireframe 307 + +6.3.6 Business Rule 309 + +6.3.7 Post – Condition 317 + +6.3.8 Exception Flow 317 + +6.4 Frequency Capping 317 + +6.4.1 Requirement Defintion 317 + +6.4.2 Process flow 318 + +6.4.3 Trigger 318 + +6.4.4 Pre-condition 318 + +6.4.5 Wireframe 318 + +6.4.6 Post -condition 318 + +6.4.7 Exception flow 318 + +6.5 A/Bn Testing 318 + +6.5.1 Requirement Definition 318 + +6.5.2 Process flow 319 + +6.5.3 Trigger 320 + +6.5.4 Pre-Condition 320 + +6.5.5 Wireframe 320 + +6.5.6 Business rules 326 + +**6.5.7** Post-condition 339 + +**6.5.8** Exception flow 339 + +7 OneCatalogue 339 + +7.1 About Redemption Item in OLS system 339 + +7.1.1 Overview 339 + +7.2 Catalogue 340 + +7.2.1 Requirement Definition 340 + +7.2.2 Process Flow 340 + +7.2.3 Trigger 340 + +7.2.4 Pre-condition 340 + +7.2.5 Mockup 341 + +7.2.6 Business Rule 341 + +7.2.7 Post- Conditon 342 + +7.2.8 Exception Flow 342 + +7.3 Category 342 + +7.3.1 Requirement Definition 342 + +7.3.2 Process Flow 342 + +7.3.3 Trigger 342 + +7.3.4 Pre-Condition 342 + +7.3.5 Mockup 343 + +7.3.6 Business Rule 343 + +7.3.7 Post –Condition 345 + +7.3.8 Exception Flow 345 + +7.4 Item master 345 + +7.4.1 Requirement Definition 345 + +7.4.2 Process Flow 345 + +7.4.3 Trigger 345 + +7.4.4 Pre –Condition 345 + +7.4.5 Mockup 346 + +7.4.6 Business Rule 347 + +7.4.7 Post-Condition 350 + +7.4.8 Exception Flow 350 + +7.5 Item price 350 + +7.5.1 Requirement Definition 350 + +7.5.2 Process Flow 352 + +7.5.3 Trigger 353 + +7.5.4 Pre-Condition 353 + +7.5.5 Wireframe 354 + +7.5.6 Business Rule 355 + +7.5.7 Post-Condition 358 + +7.5.8 Exception Flow 360 + +7.6 Voucher Code 360 + +7.6.1 Requirement Definition 360 + +7.6.2 Process Flow 360 + +7.6.3 Trigger 360 + +7.6.4 Pre-Condition 361 + +7.6.5 Wireframe 361 + +7.6.6 Business Rule 363 + +7.6.7 Post-Condition 367 + +7.6.8 Exception Flow 367 + +# Reference + +| Ref# | Description / File Name | +| --- | --- | +| R01 | | +| R02 | | +| R03 | | +| R04 | | +| | | + +Change History + +| **Version** | **Change Description** | **Date** | **Updated by** | +| --- | --- | --- | --- | +| | The first version including: Customer Management Campaign Management Draft OMR module | 14/12/2023 | Trangdth Maivt | +| | 1. Customer 360: Add more detail for Account/Card information 2 Section 5.1 Add filter, Add/update some fields in the screen Section 5.5 Card: Update description and logical Section 5.9 and 5.10: Update label | 18/12/2023 | Trangdth | +| | 1. Update the Pool Conversion Rate module 2. Update data type DD/MM/YYYY into "Date" to respect the date time configuration format 3. Update the Card logically: Add more detail when updating the card 4. **Update customer Management module section 5: an update based on Sang's requirement (Customer/Account/dashboard/transaction history/attribute/counter)** Update Vietnamese fields and some cosmetic issues | 20/12/2023 | Trangdth | +| | 1. Update customer block data type from X(20) into X(10) 2. Section 5.4 update the card activation date from mandatory to optional 3. Section 5.2.6: Update the logic of most items 4. Section 4.7- Pool Conversion Rate: update field name and logic for pool conversion rate 5. Section 4.12 Campaign Rule Criteria: Correction some typos and add more detail for txncat criteria 6. Pool Definition: remove the item code field (move to Rule setup). Add some validations(red line) 7. Add CEP rule type | 27/12/2023 | Trangdth | +| | 1. Add REP Rule 2. Update Pool Definition Screen: screen and logical 3. Update Counter Defintion to match with PMS and add more detail. | 02/01/2024 | Trangdth | +| | 1. Update API information for REP rule 2. Update API information for CEP Rule 3. Add document for Formula (UI+ Logical) | 10/01/2024 | Trangdth | +| | 1. Add Section 5.15 Awward Transaction Entry Screen 2. Update Section 4.8 Counter Definition: Add Late txn posting option. Update logical on post-condition 3. Update Pool Defintion: add more detail for ATG field 4. CEP/REP: Update API for run schedule | 16/01/2024 | Trangdth | +| | 1. Counter definition: Update: Active "First start date is fixed" for "Days from COD" period unit 2. Pool conversion rate: Update code from X(03) into X(05) 3. Card - Update data type and logic for Old Card number - Update the relationship of Account type and Account number 4. Add Campaign : Add description for CP module | 24/01/2024 | Trangdth | +| | 1. Add section 4.12 Campaign Rule logical for Award/redem/Adjust rule type 2. Add section 4.9 Transaction Category module | 25/01/2024 | Trangdth | +| | 1. Campaign: change data type and add alidation for Campaign type 2. CEP: Update data type for Run schedule and change the sequence order in Layout 3. REP: Update data type for Run schedule and change the sequence order in Layout | 30/01/2024 | Trangdth | +| | Section 4.17 : CEP : Update API information of following fields: - Account with blocked Card - Post Transactions under PA Account selected based on | 19/02/2024 | Trangdth | +| | Section 4.12.6 : Campaign Rule/Business Rule : Update validation of "Apply after Cap value " field | 21/02/2024 | Trangdth | +| | 1. Correction typo 2. Section 4.13: Rule criteria: Update more detail and req 3. Section 5.11 Adjustment : Add field and update logical of quick view | 05/03/2024 | Trangdth | +| | 1. Correction typo 2. Section 5.11 Adjustment: Update Vietnamese label and correction logical 3. Section 5.12 Transfer Balance: Add fields, Update logical, Add User Stories and Accepted Criterions 4. Section 5.13 Re-instatement : Add fields, Update logical , Add User Stories and Accepted Criterions | 07/03/2024 | Trangdth | +| | 1. 5.2.6.3: Account/Card information: Update logical and data entities 2. 5.11 Adjust: Add US and AC 3. 5.12 Award Transaction: Add fields, Update logical , Add User Stories and Accepted Criterions 4 5.5 Pool Balance Detail: Correction and Add User Stories and Accepted Criterions | 11/03/2024 | Trangdth | +| | 1. Section 4.15 contributor setting: Update data type of "Contributor Percentage" field 2. Section 4.14 Campaign Rule formula: Remove validation of F5/Multiplier | 12/03/2024 | Trangdth | +| | 1. Section 7: Added OneCatelogue module, including: Item master/ Catalogue/Category/Voucher management 2. Section 4.12 Campaign Rule: Added Post-condition for Amount to Use feature (Transaction Processing with Amount to use). 3. Secttion 4.6 Pool Definition: Remove CP Rule name and change data for "List Of Campaign" listing page. | 20/03/2024 | Trangdth | +| | 1. Add section 7.5: Item Price 2. Update section 5.14 Item redemption to match onecatalogue logical 3. Update quick view of Adjust/transfer balance/Re-instatement/Award. Take note that I just remove redundant information and update the description to be more clearly. The logical is not changed. | 25/03/2024 | Trangdth | +| | 1. Added section 2 (2.1/ 2.2/2.3/2.4) OneAccess module, including Overview, User Group, Permission Management and User Profile 2. 4.6 Pool Definition: Correction typo 3. 4.13 Rule Criteria: Correct index of operator on each data type 4. 4.14 Campaign Formula : Update Formula logical on TP sides | 03/04/2024 | Trangdth | +| | 1. Correction typo 2. Section 4.13 Rule Criteria: Update logical of String data type (TP sides only) (change in red text) | 12/04/2024 | Trangdth | +| | 1. Section 5.6 Transaction History: Update sketch, Update US and AC, update Business rule 2. Section 5.11 Adjustment: Update sketch. Update US and AC, update business rule 3. Section 5.15 Award : Update US and AC | 15/04/2024 | Trangdth | +| | 1. Section 4.18 Added Item Redemption Rule Type | 16/04/2024 | Trangdth | +| | 1. Section 7: OneCatalogue: Typ0 correction and update section 7.6 Voucher Code module 2. Section 4.12.7 CP rule : Add Award limit use case in FSD | 19/04/2024 | Trangdth | +| | 1. Section 5.6 Transaction History: Added "Pool Unit Amount" on Award quick view. 2. Section 5.15 Item Redemption: update business req/ Flow and post condition 3. Section 7.5 Item Price Update flow/ post condition / add effective date | 26/04/2024 | Trangdth | +| | 1. Section 4.6 Pool Definition : Add validation for Card entity level field 2. Section 4.13 Campaign Rule Criteria : Correction description of filter value of Number data type 3. Section 5.14 Item Redemption : Correction Wireframe and update business rule 4. Section 7.3 Item master: Add Face value and correction typo | 02/05/2024 | Trangdth | +| | 1. Addded description to clear "Balance detail" quick view of Award and Adjustment Transaction Screen (in red text). 2. Section 5.14 Item redemption : Added User Stories and Acceptance criteria | 06/05/2024 | Trangdth | +| | 1. Section 4.13 Campaign Rule Criteria: Update String data type: Use Input tag instead of delimiter in case there are many filter value if input type as "value" | 09/05/2024 | Trangdth | +| | 1. Section 4.13 Campaign Rule Criteria: Add more description for Date Data type. 2. Section 4.12 Campaign Rule: Add new fields/validation to handle Evoucher Pool and Adjust Rule Type. ( Change in red) | 20/05/2024 | Trangdth | +| | 1. Section 4.6: Pool Definition: Add validation for Precision of Pool 2. Section 7.6: Voucher code: Change field name from Voucher type into Promotion Type 3. Section OneAdmin Overview: Update and correction section 3.1/3.2/3.3 4. Section 7.5 Item price: Add item code to avoid confuse 5. Customer Profile: Add "Address Type: field 6. Section 5.6 Item redemption Entry: Remove redudant field and add validation (Change in red text) | 24/05/2024 | Trangdth | +| | 1. Counter Definition: Add validation for "Bucket period Unit" 2. Campaign rule: Remove API of master data filed Remove Voucher code Add item code | 30/05/2024 | Trangdth | +| | 1. Section 5.9/5.10: Attribute/Counter: Correction and update more detail 2. Section 5.6: Transaction History: Remove Deleted field, correction typo and update detail for quick view 3. Section 5.11/5.12: Adjustment /Transfer balance: Correction process flow and business 4, Section 5.15: Award transaction: Update process flow on TP side 5. Other section: Update and correct to match with the system | 17/06/2024 | Trangdth | +| | All sections: Add more description for number field if needed | 19/06/2024 | Trangdth | +| | 1. Campaign formula /Business rule : Update validation for "Amount " field (F4/F6) 2. Section 5.2.6.2: Customer’s rewards statistic : Remove total spending, Update logical for Points/Cash back All change in red text | 24/06/2024 | Trangdth | +| | 1. Add section 3: Oneadmin: Overview about the OLS system : Search/Filter/Add/View/Edit/Approve/History 2. Add Section 4: Application Parameter 3. Update section 6.2.6: Customer 360=>Business Rule: Correct typo. Add more detail for pool balance information and most redeemed item | 12/07/2024 | Trangdth | +| | Correction typos | 11/11/2024 | Trangdth | + +# Introduction + +## Scope of Document + +## Terminology + +1. The following sets out the definition of terms which are used in this document: + +| | **Term** | **Definition** | +| --- | --- | --- | +| | Amount vs Quantity | * In OLS, “Amount” is used in connection with monetary amounts – i.e. when the unit of measure is an actual currency such as Dollars, Pesos, and Indonesian Rupiah etc. For example, “Transaction Amount” is the most frequently encountered “amount” entity. * Quantity is used to refer to the number of units of an entity, but not to monetary value. For example, the number of points awarded is typically referred to as the “Award Quantity”, and the number of points redeemed is the “Redeem Quantity”, whereas the value of the award is the “Award Amount” and the value of the redemption is the “Redeem Amount” | +| | Pool Blance Bucket (Bucket) | * It is used in the context of a Reward Pool Bucket, per bucket: based on pool entity level and expiring date to determine a pool balance bucket. | +| | Bucket Expiry Date | * If used in the context of a Counter, see Counter. * If used in the context of a Reward Pool Bucket, see Pool. | +| | Campaign Rule (Rule) | * A Rule is a business rule defining the conditions under which a reward will be given, including the type and quantity of reward. * The Rule includes a set of “**Rule Criteria**” that defines the conditions to be met in order that the quantity of rewards to be calculated with the formula and parameters that are defined in the “**Rule Formula**” is to be given to the customer. | +| | CEP | * “Counter Extract & Process” is a module for setting up job requests to extract a specified counter based on criteria set up in the request, and using the counter value as transaction amount, to form a transaction to process against Campaign Rules linked to the transaction through a Transaction Code and other Rule Criteria. * The module includes the corresponding batch processes to execute the requests. | +| | Contributor | * Identifies an entity which funds the rewards given under a given Rule. * One or more Contributors can be set up for rewards of each Rule. * If there is more than one Contributor for a Rule, the “**Rule Contributor Settings**” function is used to define the percentage of reward to be billed to each Contributor. The total contribution percentage must be 100%. * If the business entity with which the customer is transacting is the only Contributor for the rewards, then no setting has to be done in the “**Rule Contributor Settings**”, as BLP will consider the transacting entity as the default Contributor. * The Contributor setting is used in the end-of-day Contributor settlement report to calculate the amount due from each Contributor, for each reward transaction. | +| | Counter | * Counters are used to track customer’s transaction statistics. * Counters can be defined on demand to track a spend frequency or spend total for a given set of criteria. * For example, a Counter can be configured to track the number of transactions done by each customer in a specific Merchant Category Code or MCC. * If the count to be tracked is periodic – e.g. monthly – then the Counter can be configured to track the count for each period in a separate “**Counter Bucket**”, where each Counter Bucket has a “**Counter Bucket Date**” equal to the end date of the month. * What is tracked depends on which “**Counter Method**” is selected. * Counters are identified by “Counter Ids”. | +| | Effective Period | * Many parameters have a Start Date and End Date range during which the parameter is effective. * The general rule is that the Start Date starts on and after 00:00:00 hours and the End Date ends at 23:59:59. * Note that in BLP, time is considered a discrete quantity in seconds. * This definition applies for all cases where we have the “Start Date” and “End Date” parameters – e.g. campaign rules, currency rates, item price schedules, etc, where the corresponding start and end times are not specified. | +| | Expiry Policy | * See more on the Pool Definition section | +| | Formula | * This part of the Rule defines the calculation formula or formulae to be used for calculating the quantity (number of units in the Reward Pool – e.g. number of points, number of coupons) of reward to be given for a given transaction if the conditions set in the Rule Criteria are fulfilled. * The Formula comprises 2 parts: the Formula Header and the Formula Detail. * “**Formula Header**” defines a set of parameters to be adopted by all formulas selected in the Formula Detail – e.g. the maximum amount of reward to be given, the rounding rule (round down, round up, etc), the quantity to use for calculation (whether the Gross Amount or Nett Amount). * “**Formula Detail**” defines the details of the formula to be used in the calculations. Each Formula Detail can have one or more Formula. * **Execution Sequence**. A Rule has one or more Formula Details. Each Formula Detail is assigned an Execution Sequence number that determines the order in which the Formula is executed during transaction processing. The higher the numbers are executed first. | +| | Gross Amount | * See Transaction Amount. | +| | Pool | * Each type of reward – e.g. points or coupons, is tracked in a “**Pool**” or “**Reward Pool”**. * Each Reward Pool is associated with a “**Pool Expiry Policy**”, also referred to as “**Expiry Policy**”. * The Pool Expiry Policy selected for the Pool determines how the reward earned in that Pool is expired. * An example of a Pool Expiry Policy is “Expire 2 calendar quarters after earning”. * This would cause all the rewards earned in a given calendar quarter to be put in a Pool Bucket with an Bucket Expiry Date set to the end date 2 calendar quarters from the quarter in which the rewards were earned. * Rewards that expire on a given date are tracked in a separate “**Pool Bucket**”. * Example, if **Expiry Policy** for a Reward Pool is “Expire rewards 6 months from month of earning”, then all the points earned in each month will be stored in a separate bucket, each “Pool Bucket” having its own **Bucket Expiry Date**. * To meet the requirements of UNIRMs, new policy based on Card Types will be provided. For details of this, see “Expiry Policy” definition. | +| | REP | * “Redeem, Extract and Process” is a module for setting up a request to redeem a specified Pool, subject to criteria set up as part of the request, and to then output the redemption transaction details according to the selection set up in the request. | +| | Rule Criteria | * See Campaign Rule Criteria | +| | Rule Pool | * The Rule Pool is a Reward Pool which is updated with the results of the Rule Formula or Formulae. * Each Rule is associated with one Rule Pool. | +| | Transaction Amount | * Each transaction record in OLS for award processing has a mandatory column identified as the Transaction Amount. The Transaction Amount is used as the principal quantity for reward calculation in the Formula. * If the transaction is a payment transaction: + The Transaction Amount is the payment amount + If the transaction request includes a request to offset the payment amount by redeeming any available rewards, the amount remaining after deducting the available rewards value from the payment amount is referred to as the “**Nett Amount**”. + The payment amount before the deduction is the “**Gross Amount**”. * The Transaction Amount is always logged in OLS as the “Gross Amount”. | +| | OLS Transaction Code (TC) | * Each transaction record received in OLS for award processing has a column identified as the Transaction Code or TC. * The TC is used as the key to locate applicable Rules. * If no Rule is linked to TC, no reward calculation is done for that transaction. * TC is user-defined but it must be set up in the Transaction Code look-up table. | + +## Structure of Document + +The rest of this document is made up of the following sections: + +1. Introduction +2. OneAcess +3. Customer Management +4. Campaign Management +5. OneCatalouge +6. OneMarketing +7. OneTargeting + +# OneAccess + +## Overview + +1. OneAccess™ is the module for managing user access rights to OLS administration functions. +2. The Access control Management functions are comprised of: + +* User Group definition +* User Profile set-up (defining user IDs for logging into the system). +* Permission Management setup 2 permission type: Particular user/ User Group. + +1. Report permission + +* To identify reports each Permission Group is allowed to access. + +1. View filter Management + +Every screen can be configured with a filter based on the value of fields in the screen (View Filter). The View Filter restricts which fields in which screens are displayed to users in a User Group. The View Filter can also be used to block the entire view from the users in a User Group. + +**In phase 1, we are focusing on item #1 first and allow automation to approve when user/edit record.** + +## User Group + +### Business Requirement + +1. The User Group module is utilized to categorize users who share identical permissions within OLS. +2. Use this screen to define the group to be assigned to a particular user or group of users. When adding a new user to the system, select this group for that user. + +### Process Flow + +=TBD= + +### Trigger + +1. A new user group needs to be defined. +2. An existing user group needs to be modified or the user needs to review the existing group to make any decision. + +### Post –Condition + +1. Users have to have the access right on this screen to access this screen. +2. Depending on the user’s access rights, they can view/add/edit user group records. + +### Wireframe + +Please refer to the wireframe on the Figma. + +### Business Rule + +* + - * 1. The user group ID must be a unique value. + 2. If the required user group has not been defined, click on the User group icon in the Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_18) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for User Group is illustrated in section [Wireframe](#_Wireframe_18). + 4. Screen description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Genneral information** | | | | +| | User Group ID\*/ Id nhóm người dùng | The identify of user group | ~~X(20)~~ X(10) | +| | User group Name\*/ Tên nhóm người dung | The name of the user group For reference only | X(100) | +| | Description /Mô tả | Description for user group | X(200) | +| **Group users: List all active User Profile record are assigned to this group.** **This part is display when user click to view any active record only** | | | | +| | User ID\* / ID người dùng | The identify of the user who be long to the chosen group | Display | +| | User name\*/Tên người dung | The name of the user | Display | +| | Email \*/Địa chỉ email | Email | Display | + +### Post –Condition + +* 1. The data is updated in the DB and relation screen (if needed). + +### Exception Flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Permission Management + +### Business requirement + +1. The Permission Management module is used to maintain Access Rights Groups – i.e. to define: + 1. Which modules and functions can be accessed by users in a group, and + 2. Which of the applicable actions can be performed by the users in each of the functions within each of the modules in the group: + +| | | | +| --- | --- | --- | +| * + 1. Add | * + 1. Change | * + 1. View | +| * + 1. Delete | * + 1. Approve (or Reject) | * + 1. Copy | +| * + 1. View History | h. Save as Template | | + +### Process flow + +TBD + +### Trigger + +* + 1. New user group to be defined then need to add permission to this group. + +### Post-condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on the user’s access rights, they can view/add/edit Permission Management records. + +### Wireframe + +Please refer to the wireframe on the Figma. + +### Business rule + +* + - * 1. If permission required has not been defined, click on the Permission Management icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_19) + 2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Permission Management is illustrated in the section [Wireframe](#_Wireframe_19). + 3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1\*: General information/Thông tin Chung** | | | | +| | Role \*/Quyền | The unique identifier of the permission group. | ~~X(20)~~ X(10) | +| | Role Name\*/Tên nhóm quyền | Text describing the Permission Group Name, for user reference | X(100) | +| | Permission Type \*/Loại quyền | Drop down to select the following permission type: *Particular User* *User Group* | Drop-down Select one | +| | User/Người dùng | Condition field Drop-down list to select one or more users who can be accessed on all functions of this role. This field is only active and required when "Particular User" is selected in the previous step. | Drop-down Multiple select | +| | User group/ Nhóm người dung | Condition field Drop-down list to select only one group and all users under this group can be accessed on all functions of this role. This field is only active and required when this role is applicable to the user group type. | Drop-down Select one | +| | Description/ Mô tả | Text describing the Role, for user reference | X(200) | +| **Step 2**\*: **Permission Management** /Quản lí quyền | | | | +| | **Select Modules** A hierarchy of modules contains the list of functions available. Top-level module: The modules group Second level module: The specific module for each group. Allow the user to search the modules by entering the module name | | | +| | Select All/Chọn tất cả | Check/Uncheck to drag/drop all modules in the system into the permission part to configure the specific permission of the role. | Check box | +| | “Module Name” | Check/Uncheck to drag/drop this module permission part to configure the specific permission of the role. Checked/Unchecked on top level then all second level modules will be applicable as well. | Check box | +| | Search /Tìm kiếm | Users input their search keyword(s) into a designated search bar to find the module they're looking for. | Search feature | +| | **Permission /Quyền** **A list contains all selected modules in the previous step and the permission list applicable for each module.** **Note that: N/A =**Not Applicable will be defined in the master data and the user can’t check/uncheck to allow/disallow the permission if this permission is not applicable. **The system allows the user to quickly add/delete one permission to all modules per each module group.** **Besides the system allows** to allow/disallow all available permissions for all modules that appeared in the “Permission” part | | | +| | Selected all/Chọn tất cả | Check/Uncheck to allow/disallow all available permissions for all modules that appeared in the “Permission” part. | Check box | +| | “Top-level module name” E.g: Customer Management | The name of the top-level selected module. Check/uncheck to allow/disallow all available permission for all second-level modules belonging to this module | Check box | +| | “Second level Module name” E.g: Card | The name of the second level selected module. Check/uncheck to allow/disallow all available permissions for the chosen module. | Check box | +| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup to define the permission of each field on the each screen. See more on “Acccess Right Fields” | Hyperlink | +| | View /Xem | This column contains one checkbox in each row corresponding to a function to which the View action is applicable. If checked, users in this role can view the data available in this function | Check box | +| | Create/Thêm mới | This column contains one checkbox in each row corresponding to a function to which the Create action is applicable. If checked, users in this role can create data in this function. If user have created permisson then user will have "Save as draft" role also | Check box | +| | Edit /Sửa | This column contains one checkbox in each row corresponding to a function to which the Edit action is applicable. If checked, users in this role can do "update" action in this function. | Check box | +| | Delete/Xóa | This column contains one checkbox in each row corresponding to a function to which the Delete action is applicable. If checked, users in this role can do "delete" action in this function. | Check box | +| | Copy /Sao chép | This column contains one checkbox in each row corresponding to a function to which the Copy action is applicable. If checked, users in this Role can coppy available data in this function | Check box | +| | Approve /Phê duyệt | This column contains one checkbox in each row corresponding to a function to which the Approve/Reject action are applicable. If checked, users in this role can do " approve/reject" action in this function | Check box | +| | History/Xem lịch sử | This column contains one checkbox in each row corresponding to a function to which the History action (i.e. to view earlier versions of the data in the activity log) is applicable. If checked, users in this role can view data history in this function. | Check box | +| | Template/Tạo biểu mẫu | This column contains one checkbox in each row corresponding to a function to which the "Save As Tempalte"action is applicable. If checked, users in this role can save record as a template and able to access to "template" tab in listing page | Check box | +| **Access rights field /Phần quyền chi tiết trường thông tin** | | | | +| | Access permission | The list available fields of chosen module | Display | +| | View/Xem | This column contains one checkbox in the each row corresponding to a function to which the “view” action is applicable. If checked, user in this role can view the field in the screen. | Check box | +| | Editable/Cho phép chỉnh sửa | This column contains one checkbox in the each row corresponding to a function to which the “Editable” action is applicable. If checked, user in this role can modify the value of this field in the screen. | Checkbox | + +* When viewing any record, the system displays only the available permissions for this group. + +### Post-Condition + +Record is automation approval. + +Based on the permission the system will check and display available module/function of each user as following: + +A = Set of Permission of role which are assigned directly to user + +B= Set of Permission of Role which are assigned to permission group and user are in these permission group. + +**Therefore: C= User permission = Combination of A and B.** + +### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## User Profile + +### Business requirement + +The user profile defines user attributes and sets the date and time for allowing user access to system functions. User profile created will be used for login, and users, upon logging in, will be able to view a list of functions with specific operations set in the permission management section and will be associated with users through this function screen. + +### Process flow + +N/A + +### Trigger + +* + 1. New account need to be defined. + 2. Need to update information of any existing account in the system. + +### Post-codition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit User Profile records. + +### Wireframe + +Please refer to the wireframe in the Figma. + +### Business rule + +* + - * 1. If the permission required has not been defined, click on the User Profile icon in the Main Menu to bring up the summary list as illustrated in the section [Wireframe](#_Wireframe_20). + 2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the User Profile is illustrated in the section [Wireframe](#_Wireframe_20). + 3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | User ID\*/ ID người dùng | Unique user identifier, assigned by the user | X(10) | +| | User Name\*/Tên người dùng | Name of the user associated with the User ID | X(50) | +| | Password/Mật khẩu | Condition field This field is only active and required when creating a new user. The password must be strong enough. | X(50) | +| | Re-enter password/Nhập lại mật khẩu | Condition filed This field is only active and required when viewing any record. The re-enter password must be matched with the password. | X(50) | +| | Reset Password | Condition field This field is only active and required when updating the user profile record. Click to reset the password in case the user forgot the password. See more on “ Reset password” | Hyperlink | +| | Email \*/Email | User’s email address. A password reset link can be sent to this address if the system is configured to do so. User can use this email to log in in the system instead. The email must be unique value | X(100) | +| | Default Language\* /Ngôn ngữ mặc định | Determines the language in which the screen labels are displayed. | Drop-down Select one | +| **Access Detail** | | | | +| | Access Day \*/Ngày truy cập | Seven checkboxes, each of which indicates the day of week on which the user has (checked) or has no (unchecked) access to the system. | Check box Allow to check more than one value | +| | Access time \*/Thời gian truy cập | On days when user has access, the Access Time is the time on and after which user has access to the system – i.e. is able to log in to the system | Time | +| | User Profile Effective From Date \*/Tài khoản có hiệu lực từ ngày | Date on and after which this User Profile is effective and the user can log in to the system | Date | +| | User Profile Effective End Date\*/Tài khoản hết hạn sau ngày | Date on and before which this User Profile is effective and the user can log in to the system After this day user can no longer log in to the system | Date | +| | User Group\*/Nhóm người dùng | A drop-down listing the available User groups. The selected group determines the functions to which the user that this user profile is defined for has access. | Drop-down Select one | +| | Report Access Right/ Quyền truy cập báo cáo | Drop-down listing the Report Access Rights groups. The selected Report Access Rights group determines which report(s) the user has access to. | Drop-down Select one | +| | User Status\*/Trạng thái người dùng | Drop-down to select following user status: Active Blocked If account is blocked then user can no longer login into the system. | Drop-down Select one | +| **Reset Password** A pop-up will be appeared when user click to Reset password | | | | +| | New Password\*/ Mật khẩu mới | Enter new password Password must be strong enough. | X(50) | +| | Re-enter Password\*/Nhập lại mật khẩu | Enters their new password again to confirm | X(50) | +| | Save /Lưu | Click to accept the change | Button | +| | Cancel /Hủy | Click to cancel the change | Button | +| **User Permission / Quyền người dùng** **Display for any active User Profile records** **The list contains all permission which applicable for the chosen user** | | | | +| | “Top level module name” E.g: Customer Management | The name of top-level module. | Display | +| | “Second level Module name” E.g: Card | The name of the seconde level selected module. | Display | +| | “Second level Module name” E.g: Card | Click on the second level module to bring up the popup show the access rights fields of chosen module. | Hyperlink | +| | View /Xem | Checked if allow Unchecked if disallow N/A if not applicable this action to that module | Display | +| | Create/Thêm mới | Display | +| | Edit /Sửa | Display | +| | Delete/Xóa | Display | +| | Copy /Sao chép | Display | +| | Approve /Phê duyệt | Display | +| | History/Xem lịch sử | Display | +| | Template/Tạo biểu mẫu | Display | + +### Post-Condition + +When create new record then the new user account is successfully created in the system. + +The new user receives an email notification with login instructions and temporary password. + +When password is resetted then an email notification will send into user’s email with new password to user can login into the system again. + +### Exception flow + +# OneAdmin™ + +## Overview + +1. OneAdmin™ is a browser-based application framework based on which all OLS administration screen functions are implemented. +2. This section describes the admin screen functions in general. +3. OneAdmin™ provides the screen functions such as the following for users to administer OLS: + +| | | +| --- | --- | +| * 1. Application parameters and campaign management | * 1. Creating and reviewing customer information through menus | +| * 1. Viewing and Posting of transactions for award, redeems and adjusts | * 1. Requesting for generation and viewing of reports. | +| * 1. Creating and reviewing catalogue information. | * 1. Generic Ledger management | +| * 1. Creating and reviewing merchant information | * 1. Posting of transaction testing for award, redeem and adjusts. | + +1. Maintenance actions supported include: + 1. “**Add**”, to add a new record in the module or function. See section 3.6 for an illustration of the [Add](#_Add_Form) form for adding a record. + 2. “**Edit**”, to modify an existing record on the module or function. See section [Edit](#_Edit_Form) for an illustration of the Edit form for editing a record. + 3. “**Copy**”, where user can add a new record with the contents of a currently selected record: user will be prompted to change key values which are not allowed to be replicated across records. See section [Record Copy](#_Record_Copy) for an illustration of the record copy screen. + 4. “**History**” tab brings up a display of previous versions of this record. See section [History](#_Record_History) for an illustration of the History screen. + 5. “**Save**” will save the record displayed in the edit form to the database (whether it’s a new record or changes made to an existing record). + 6. “**Cancel**” will cancel the action. + 7. “**Approve**”, to accept the change of the record in the module or function. + 8. “**Reject**”, to reject the change of the record in the modue or function. + 9. “**Save as Draft**”, to temporary save the record in the module or function without publishing it. + 10. “**Save as Template**”, to save the record displayed in the form to re-use in the furture as a template. +2. When first “saved”, the record is stored with its Status set to “Pending”. +3. It has to be selected (by click on the “Pending” tab to locate records with Status = “Pending”), then clicking on the record to view and/or approve it. +4. Upon approval, the record status is set to “Active”. +5. See section [Approve](#_Approve_Pending_Record) for the process to “**Approve**” pending records. +6. “**Delete**” marks the record being displayed as deleted or “inactive”. +7. The record will be copied into a new record with its status set to “Pending”, and the original record will be left intact. +8. A user with the necessary “Approval” rights must approve the deletion for the record to be deleted and blocked from further use. +9. All updates posted through OneAdmin™ are reflected in the database immediately on approval. + +## Types of Screen Layouts + +1. OLS admin screen functions are generally made up of 3 types of screen layouts, each corresponding to the screen function +2. The first is the **Home Page** – there is only one of this. This screen is displayed after a successful log in. +3. The second is the **Listing** **Page**: + 1. This class of screens is displayed when module in the navigation panel (Menu) is clicked. + 2. It generally displays a default list of records that can be accessed through the module. +4. The third type of screens is the “**Details Page**” layout: + 1. This is the page displayed after a record in the Summary Listing page has been selected. + 2. It shows the details of the selected record at the field level + 3. In some cases, access to child records of the record on display is provided as tabs in the screen. +5. The general features of each type of screen layout are described in the following sub-sections. + +## Home Page + +1. The following figure illustrates the Home Page screen: + +Main Menu + +1. The left panel (navigation panel) lists the module and functions to which user has access. The actual functions available in the navigation panel vary depending on the access rights of the user id that is used to log into the system. Only the functions to which the user has access will be displayed. +2. The main display area shows charts of key statistics, pre-configured at time of deployment. +3. Each of the listed modules in the navigation panel expands when clicked to show the functions available under that module. + +![](data:image/png;base64...) + +Figure: The “Campaign Managemetn” module in illustrates this expanded view. + +This module has 07 functions – “Campaign Insight”, “Campaign”, “Campaign Rule”, “Pool Definition”, “Pool Conversion Rate”, “Counter Definition”, and “Account Type Group”. + +The total number of pending records on each module is displayed on the right side of the module name. + +1. Clicking on a function will bring up the summary listing page for that function: see section 3.4. + +## Summary Listing Screens + +1. When a function in the navigation menu is clicked, the main display area will typically show the summary listing page for that function. +2. The typical layout is illustrated in the following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML37ebbf0.PNG](data:image/png;base64...) + +Sample Summary Listing Screen Layout + +1. In the following table, the row numbers correspond to the display areas enclosed in red boxes with the same number: + +| Box | Description | +| --- | --- | +| | The name and the path of the function are displayed at the top left corner of the main display area, in this case “Campaign Management > Pool List” – i.e. the function for maintaining “Pool Definition” records. | +| | The top right conner of the screen displays the language, with an icon of the language and language name. To change the display language, click on the icon to choose another language. | +| | The top right corner of the screen displays the user id and an icon of the user, with a description of the user’s access rights, i.e. the actions to which the user has access. To leave this screen simply click on the destination module and function in the navigation menu. | +| | The module name | +| | The area labelled in red displays the quick search form. It contains input boxes for filtering the records to be displayed. There are two modes of search – the **Quick search** mode and **Filter** mode: * The **Quick Search** mode search involves searching by key word: + Provides users with a fast and efficient way to access search functionality without navigating through multiple pages with the selection record status in the area 7. + Entering keyword on the text box. + By click on the ![](data:image/png;base64...) icon or press “Enter” key to get result. The system will display the list of records where the keyword is found in any column on the listing page except date time data type coulmn, in the area labeled as box number 9. + The search uses the "Contains" operator in a case-insensitive manner to find the matching record | +| | The area labelled 4 in red displays the link to the advanced filter form where multiple fields can be set up as part of the search/filter criteria. * The advanced mode involves clicking on the “**Filter**” link. * When click on the “Filter” button the advanced filter form that appears is illustrated as following: ![](data:image/png;base64...) Figure 1 – Example of the Advanced Filter Form * When click to “Add” button the form that appears as illustrated in red box in area 2 as following: ![](data:image/png;base64...) Figure 2 – Example of the Advanced Filter when add any filter In the red box, which represents the Advance Filter form (area 2): * + Three purple boxes appear in the adjacent areas: area 4, area 5, and area 6. + In the area 4, there is the “Search Field” drop-down a data field name by which to search. The system list all available **field in the listing page by the default, except “Action” and “Status” field.** * Some specific modules will need include custom filter field, that are not displayed on the listing page such as: “Customer Profile” and “Transacion History” screen. See more on its section. * Users can choose from the available data fields to narrow down their search. + In the area 5, there is the “Search Operator”. For each data type‘s search filed then the system provides a set of “Operator” options that users can apply. These operator allow the user to specific how the field should be applied to the selected filter field. All available operator according on each data type’s search field are described on the following table: | | | | | --- | --- | --- | | **Index** | **Data Type** | **Operator** | | | Character | A drop dow to select following values: * Equal * Not Equal * Empty * Not Empty * Contains * Not Contains * In * Not In | | | Number | A drop dow to select following values: * Equal * Not Equal * Greater Than * Less Than * Greater than Or Equal to * Less than or Equal to * Between | | | Boolean | A drop dow to select following values: * Equal | | | Datetime | A drop down to select following values: * Equal * Not Equal * Greather Than or Equal To * Less than or Equal to * Between | * + In the area 6, there is the “Value Field”. This field can be of two types: Text box or Drop-Down. The type of value fields (text box or drop-down) displayed to users depends on the selected operator and searched field as following: * “Empty” and “Not Empty” operator should not require a value input field. * “Between” operator of Date/Time search field should require 2 value input fields with date/ time picker to allow the users to specific the range of date /time to be used in the filter query. * “Between” operator of number search field should require 2 text boxes with number format to allow user to specific the range of number to be used in the filter query. * “In” /”Not In” operator of character search field may present a drop-down list when search field is a lookup value field on that screen, meaning it is a field that fetches data from other tables in the system . The drop-donw list all active records of the search field and allow user select multiple value to be used in the filter query. * “In”/”Not In” operator of character search field may present a text box when search field is not a lookup value field on that screen. This text box should allow the user to enter multiple values, separated by input tag. * “Contain”/”Not Contain” operator of character search field shoud present a text box. This text box should allow the user to enter multiple values, separated by input tag. They system uses “\*” to match zero or more occurrences of the preceding subexpression. * All remaining operators may present a text box input filed to allow the users to enter a filter value. The system should validate the user-entered value based on the data type of the search field. * There is no sensitive case for character search fields. * All selected fields are used in an “AND” search. * On clicking the “Adanced Search” button, the list of records found to have the matching value would be displayed in area in box number 9. * Searching by “Filter” and “Status” be done together as an AND condition. * On clicking the “Reset” button, the system delete all filter field and return all records by the slection status. | +| | This are contains three distinct tabs, each representing a different record status: Active, Pending and Rejected. On the “Pending” tab the system show the total number of pending records next to the tab label. | +| | This area contains the pagination control links – to page forward, backward or to navigate directly to a numbered page with the number of records displayed and the number of record in total. | +| | This is the main display area listing the first N records within the function selected, where N defaults to a system parameter. N can be changed in drop-down box in area 8. The top row contains the column headings, with up to N numbered rows below it. The right-most column in are 10, inclues the actions for viewing, editing, deleting and approval the record in each row. | +| | This area shows the number of records displayed and the number of record in total. | +| | This is the Add button which when clicked brings up the edit form described in section 3.6, for adding a new record in the system. | + +## Detail View + +1. When the View icon for a row is clicked in the Summary List page as described in section 3.4, the details of the record in that row is displayed as illustrated in the following: + +![](data:image/png;base64...) + +Figure 3 – Sample Record View Screen with Labelled Areas + +![](data:image/png;base64...) + +Figure 4 – Sample Record History + +| | | +| --- | --- | +| Box | Description (Refer to figure 3 and figure 4) | +| | * This area display the name of the module with the record status and record primary key. | +| | * Clicking on the “Copy” button brings up the view described in section 3.10. This feature provides a convenient means by which to create new records by changing existing records. The “Copy” feature is provided only for selected functions where a “Copy” action is practical. * Clicking on the “Edit” button, the fields are displayed with details of the record in that row, awaiting user input to amend the details. * Clicking on the “Delete” button brings up the pop-up to user confirm the deleted action. | +| | * The function accessed is displayed as a tab. * If the function has data which can be categorised separately in a logical way, each category is displayed as a different tab. * This area shows the tabs available and clicking on the tab brings up the display for that category of data. | +| | * This area shows the details of the record. | +| | * The panel on the right/bottom displays supplementary data relating to the record in the main display area (area 5). The details in the right panel vary depending on the function. | +| 7 | * Clicking on the “Back” button brings the view back to the Summary Listing page. | +| 8 | This area shows when the record was last changed, and by whom. * Every time a record is updated or approved, the user id that last made the change and the user id that last approved a change are logged with the record, together with the date and time of the action. * This information is always shown at the bottom of the record details screen display. * Only records with Status = “A” for Active are taken into account during transaction processing: if a record status is not active it will not be taken into account for any transaction processing. * The “Last Updated By” field shows the user id of the user who last updated this record. If the record is updated by a batch process, this field will contain the Batch Id. * The “Last Updated Date” field shows the date and time when the record was last updated. * The “Last Approved By” field shows the user id of the user who last approved this record. For updates by programs (batch processes and online transactions), this field is empty. * The “Last Approved Date” field shows the date and time when the record was last Approved. For updates by programs (batch processes and online transactions), this field is empty. | +| 9 | This area shows when the action records may can be changed * Clicking on the “History” records will bring up the display described as in area 4. * By choose the 2 version and clicking the “Compare” button will bring up the display described in section 3.8: Record History. Feature allows for easy browsing of the changes made to the record | + +## Add/ Edit Screen + +1. When the Edit /add for a row is clicked in the Summary List page, the details of the record in that row is displayed in the edit form for editing, as illustrated in the following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML4d96c81.PNG](data:image/png;base64...) + +Figure 3 – Sample Record Edit Form with Labelled Areas + +1. Each row in the following describes the correspondingly numbered area in Figure 3: + +| | | +| --- | --- | +| Box | Description (Refer to Figure 3) | +| | This area shows the function for which the edit form is being displayed. | +| | This is the main edit form. * Mandatory input fields have a coloured border on the left. * If the edit form is displayed as a result of the “Add” button being clicked in the previous screen, the fields will be displayed empty, awaiting user input * If the edit form is displayed as a result of the “Edit” button being clicked in the previous screen, the fields are displayed with details of the record in that row, awaiting user input to amend the details. | +| | * The “Create”/”Update” button will save the changes or in the case of the “Add” action, the input data, in the database as a new record with record Status = “Pending”. Note that the record being changed (“original record”) will remain unchanged. | +| | * The Cancel button causes any input or change made to be discarded and the display will return to the previous summary listing page. | + +## Approve Pending Record + +1. When a new record is first added, or when an existing record is “Changed” or “Deleted”, the new or modified record is inserted in the database with a Status set to “Pending”. +2. The original record remains active. +3. The “Pending” records must first be “Approved” by a user who has the rights to the “Approve” action for that function before the change becomes effective. +4. To “Approve” a record, the record must first be located by clicking for records with the “Pending ” tab as illustrated here: + +![](data:image/png;base64...) + +Figure 4 – Search for Pending Records + +![](data:image/png;base64...) + +Figure 5– Pending Record Listing + +1. In change mode, the record values with and without the change are both displayed for comparison.The previous value (before change) and the modified value,that pending approval are displayed side by side, with modified fields displayed in a font of a different color, as illustrated: + +* Red text highlights changes of the active record, ~~Red text~~ highlight with strikethrough effect for the deteled data. +* Green text highlights changes of the pending record. +* **Black text** denotes unchanged information in both record versions. + +![](data:image/png;base64...) + +Figure 6 – Pending Record Displayed Side-by-side with Currently “Active” Record + +1. At this point, it is possible to click on the Modify button to edit the record and save it back into the Pending list. The user who edits the record will not be able to “Approve” the change. +2. Click on the “Approve” button to put the record into active use. +3. Click on the “Reject” button to return the record to the Reject list for follow-up and correction. +4. Users can “Approve/Reject” record from detail view mode or by clicking on the “Approve/Reject” button from listing page. + +## Record History + +1. The “History” feature is for scanning through historical versions of a record. +2. When in the Record Detail view, clicking on the “History” Tab will bring up the all version of the record. +3. When the “Compare” button is clicked, the display will show details of two chosen version as following: + +![C:\Users\DELL\AppData\Local\Temp\SNAGHTML50b76fd.PNG](data:image/png;base64...) + +Figure 7 – Sample Display of a Record’s History + +| | | +| --- | --- | +| Box | Description (Figure 7) | +| | Drop-down lisitng all history version inclues currently version. Users can change version to compare by select the verion to compare. | +| | Details displayed in the change history of two selected versions by the version in the drop-down list in area 1. * Red text highlights changes of the record in the red drop-down in the area 1. * Green text highlights changes of the redcoed in the green drop-down in the area 1. * **Black text** denotes unchanged information in both record versions. | + +# Application Parameter + +## Requirement Definition + +* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. + +## Process Flow + +## Wireframe + +* + 1. Access control + +![](data:image/png;base64...) + +* + 1. Display setting + +![](data:image/png;base64...) + +* + 1. Functionality + +![](data:image/png;base64...) + +## Trigger + +## Pre-condition + +* Users have to have access right on this screen in order to access this screen. +* Depending on the user’s access rights, they can view/add/edit/ + +## Business Rule + +* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: + +![](data:image/png;base64...) + +1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. +2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. +3. Application parameters list detail: + +| Label (EN/VN) | Parameter | Data Type | +| --- | --- | --- | +| **Access *Control*** | | | +| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | +| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | +| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | +| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | +| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | +| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | +| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | +| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | +| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | +| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | +| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | +| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | +| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | +| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | +| **Display Setting** | | | +| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | +| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | +| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | +| **Functionality** | | | +| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | +| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | + +## Post-Condition + +* The application now uses the new, standardized parameter format. +* All existing parameter settings have been successfully migrated to the new format. +* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. +* The application's parameter management is more maintainable, scalable with other systems. + +## Exception flow + +# Reward Campaign Management + +## Highlights + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. +3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: + +Customer + +Account # 1 + +Account # 2 + +Account # 3 + +Smart$ + +Cash Rebates + +UNIRM + +Product Holdings + +Reward Pools PoolsBalances + +Account # 4 + +* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type + +Loyalty Account Acct + +Figure 9 – Customer View + +1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. + 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. + 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. +2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. +3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. +4. A single transaction can trigger multiple concurrent award programs. +5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. +7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. +8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. + 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: + 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) + 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. + 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically + 5. Instant discounts (specific to SKU codes i.e. purchased item codes). +9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. +10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). +11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. +12. Practically unlimited number of reward campaign rules can be run concurrently. +13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: + 1. Demographic attributes: Age group, Gender, etc. + 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week + 3. Location of transaction + 4. Instant transaction amount + 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) + 6. Transaction count (number of transactions in a period + 7. Average balance over a specified period, period-end balance over a specified period + 8. Card type (product account type) + 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) + 10. User-defined attributes associated with customer and / or product accounts, etc. +14. Rewards can be tracked at + 1. Customer level: single reward balance for customer + 2. Product level: rewards tracked as a separate balance per Product Account. +15. Customer can redeem their incentives and rewards through any of the following: + +| | | +| --- | --- | +| * 1. EDC terminals at partner outlets | * 1. Call center | +| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | + +## Structure of a Campaign (HAVE TO BE ADJUSTED) + +### Types of Campaign Mechanics + +1. Reward campaigns can be broadly divided into two types or models: + 1. Those that award on every transaction (“Award on Every Transaction”) and + 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward +2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. + +### Award on Every Transaction + +1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: + 1. The reward is determined at the time the transaction is processed in BLP. + 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: + +![](data:image/png;base64...) + +Figure 10 – Process Flow for Award Per Transaction + +1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules + 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. + 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems +2. Campaign Rules are set up as described in the rest of this section 4. +3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. + +### Accumulate Then Award + +1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. + 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. + 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P + 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters + 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. + 3. The structure and mechanism of how Counters work are described in section 4.2.6. + 3. The Campaign structure of such a Campaign is broadly outlined in the following: + +![](data:image/png;base64...) + +Figure 11 – Structure of “Accumulate Then Award” Campaigns. + +1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules +2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. + +### Auto-redemption Campaigns + +1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. + +### Reward Pool Structure & Bucket Deduction Sequence + +1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. +2. Pools belong to “Loyalty Accounts” or LAs. +3. One LA is created per Customer (per unique CIF Number). +4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. +7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): + +| | | | | +| --- | --- | --- | --- | +| UNIRM Pool | Account Type | Expiry Date | Balance | +| A | 31-Mar-2015 | 100 | +| B | 31-Mar-2015 | 50 | +| A | 30-Jun-2015 | 110 | +| B | 30-Jun-2015 | 510 | +| A | 31-Sep-2015 | 140 | +| C | No Expiry | 215 | +| TOTAL BALANCE | | 1,125 | + +1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. +2. When customer redeems: + 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. + 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. +3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. + +### Counters – Structure and Mechanics + +1. A Counter is a conceptual entity that tracks a quantity over a defined period of time +2. For example, a Counter may track: + 1. Customer’s total spend per month + 1. Use Case example: to award customers who spend more than 1,000 a month + 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. + 2. The total points earned by an Account in the entire Campaign + 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign ![](data:image/png;base64...) + 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. + 3. The number transactions awarded at individual merchants (Store Ids) per month + 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign + 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. +3. The key data entities making up Counter are defined in the following table: + +| | | | | | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | **Data Entity** | | **Description** | | | | | | | | | | | +| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | +| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | +| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | +| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | +| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | +| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | +| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | +| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | +| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | +| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | +| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | +| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | +| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | +| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | +| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | +| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | +| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | +| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | +| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | +| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | +| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | +| | | | DY | | SD = FSD | | | | | | | | | +| | | | MN | | SD = Start of Month of FSD | | | | | | | | | +| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | +| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | +| | Reset Value | 9(16,2) | | | | | | | | | | | | +| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | + +## About Loyalty Marketing Campaigns (HAVE TO BE ADDED) + +## External Transaction Code + +### Requirement Definition + +* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. + 2. The External System TC is the first key is located OLS TC for processing the transaction. + 3. The TC values will be agreed with users at the time of setting up the system. + 4. Each External Transaction Code must have an OLS Transaction Code associated with it. + +For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* 1. New transaction code coming from external system then user have to define new external TC in OLS. + 2. Some description should be adjusted then user have to modify. + 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. + +### Pre-Condition + +* 1. Users have to have the access right on this screen in order to accesss this screen. + 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. + +### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Detail view + 2. Detail view + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +### Business rules + +1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | +| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | + +1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/Edited. + +### Post-condition + +1. User able to proceed to OLS Transaction Code screen. See in section 4.5 + +### Exception flow + +1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. + +## OLS Transaction Code + +### Requirement Definition + +1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. +2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. +3. For example: + 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +1. New transaction code coming from external system then the user has to define new OLS TC also. +2. New OLS transaction coming from internal transaction. +3. Some detailed information should be adjusted then the user has to modify it. +4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. + +### Pre-Condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. +3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. + +### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Summary listing page + +![](data:image/png;base64...) + +Figure 2 – Filer and quick search + +1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status ( History) + +![](data:image/png;base64...) + +1. Create/Edit form + +![](data:image/png;base64...) + +### Business Rules + +1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | +| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | +| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | +| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | + +1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/edited. + +### Post-condition + +1. User able to proceed to Campaign Rule Set-up. See section>>>>> + +### Exception flow + +1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. + +## Pool Definition + +### Requirement Definition + +1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. +2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. +3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. +4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. +5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). +6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +1. Reward pool is not existing in OLS or have some informations need to be corrected. + +### Pre-Condition + +1. Users have to have the access right on this screen in order to view/update or approve these records. +2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). +3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). +4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) + +### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1- Empty page + +![](data:image/png;base64...) + +Figure 2- Listing page + +![](data:image/png;base64...) + +Figure 3- Filter + +1. Detail view + 1. Pool detail + +![](data:image/png;base64...) + +* 1. Record history + +![](data:image/png;base64...) + +* 1. Pending record + +![](data:image/png;base64...) + +1. Create/Edit form + 1. General information + +![](data:image/png;base64...) + +* 1. Product Specific Expiry + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Velocity Control + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business rules + +1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| Seq | Field (EN /VN) | Description | | Type | +| --- | --- | --- | --- | --- | +| **Statistic information** | | | | | +| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | +| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | +| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | +| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| **Step 1: General information** | | | | | +| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | +| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | +| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | +| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | +| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool_Conversion_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | +| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | +| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | +| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account_Type_Group table). Refer “Account Type Group” API under “Campaign Management” | +| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | +| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | +| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product_Account_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | +| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product_Account_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | +| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | +| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | +| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | +| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | +| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | +| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | +| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | +| **Effected Campaign Rule listing linked this reward pool** ![](data:image/png;base64...) | | | | | +| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN_TC_LINKAGE table | +| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | +| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | + +1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each reward pools to be added/edited. + +### Post-condition + +1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. +2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. +3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. +4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). + +### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Pool Conversion Rate + +### Requirement Definition + +1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. +2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. + +### Pre-Condition + +1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. +2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. + +### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +1. Detail view + 1. Detai view + +![](data:image/png;base64...) + +Figure 1 - Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +* 1. Record status + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +1. Create/Edit form + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2 – Currency Rate + +### Business Rules + +1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. +3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 +4. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. +5. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | +| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | +| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | +| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | +| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | +| | Effective End Date\*/ Ngày kết thúc | + +### Post-condition + +* 1. User able to proceed Pool Definition setup. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Counter Definition + +### Requirement Definition + +* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. +* The Counters can then be referenced in Campaign Rules are criteria. +* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. +* A Counter is structured + + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. + + The cut-over from one period to the next can be: + - 1. Automatic based on the Transaction Date or the Batch Date, or + 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” +* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. + + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. + + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” + + A new “current” bucket is automatically created by subsequent updates. +* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 + + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules + + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month + + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. + +### Process flow + +![](data:image/png;base64...) + +### Trigger + +* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. +* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 +* For example: + + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter + + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter + + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter + +### Pre-Condition + +N/A + +### Wireframe + +* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition_Grid.png](data:image/png;base64...) + +* Use the search filter to locate the counter required: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition- filter.png](data:image/png;base64...) + +* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition.png](data:image/png;base64...) + +* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail.png](data:image/png;base64...) + +* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail2.png](data:image/png;base64...) + +### Business Rules + +The key data entities making up Counter are defined in the following table: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | +| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | +| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | +| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | +| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | +| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | +| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | +| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | +| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | +| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | +| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | +| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | +| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | +| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | +| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | +| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | +| **Validation:** - If the Counter Id already exists counter value (counter_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter_stock table. | | | | + +### Post-condition + +* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: + +[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) + +1. Late counter transaction posting + +**When late transaction is comming:** + +If "Late Transaction Posting Option" = "Update Late Value" + +& State! = C then update + +Else if "Late Transaction Posting Option" = "Update Current Bucket" + +& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. + +**Scenario: ![](data:image/x-emf;base64...)** + +### Exception flow + +## Transaction Category + +### Requirement Definition + +* 1. Transaction Category help business can define each processed transaction under pre-defined category. + 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. + 3. **Business case:** + +3.1 Enrollment Program + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | +| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | +| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | +| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | +| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | + +If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. + +Therefore If the 4 conditions are are captured as transaction category then we have: + +TxCat1 = Dining txns, local currency + DCC + +TxCat2 = Entertainment txns, local currency + DCC + +TxCat3 = Dining txns, foreign currency + not DCC + +TxCat4 = Entertainment txns, foreign currency + DCC + +To archive this campaign, when define the transaction category we just need: + +* One counter under Account-TxnCat couter level +* One CEP rule to extract counter value to trigger award rule to get award points/cash back. +* One Campaing Rule using F6 to fulfilment this requirement. + +### Process flow + +### Trigger + +### Pre-Condition + +1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup + +### Sktech + +* + - 1. Create/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. +2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same category. +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **General information** | | | | +| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | +| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | +| | Description/Mô tả | Description for refer only | X(100) | +| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | + +### Post-condition + +* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. + +### Exception flow + +## Account Type Group + +### Requirement Definition + +* + - 1. An account type is a combination of Product account level and product account type. + 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) + 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. + 4. There is no ATG checking for redemption and negative adjustment. + 5. An ATG Sequence number is assigned to each Account Type in an ATG. + 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +1. New account type is coming then need to be added this account under ATG of reward pools. +2. Some points need to be corrected for existing ATG. + +### Pre-Condition + +1. Users have to have the access right on this screen in order to can view/update or approve these records. +2. Account type which apply for ATG have to be actived on OLS. + +### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Listing page + +![](data:image/png;base64...) + +Figure 2- Filter + +* + - * 1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status (history) + +![](data:image/png;base64...) + +* + - * 1. Create/Update form + +![](data:image/png;base64...) + +### Business rules + +* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. + 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): + 4. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | +| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | +| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | +| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | +| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | +| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. ![](data:image/png;base64...) | | | | +| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool_Definition table where ATG of the pool is selected ATG. | +| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | +| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign_Rule table by specific pool Id | +| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign_Rule” table by specific Campaign Rule ID~~ | +| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign_Rule” table by specific Campaign Rule ID | + +### Post-condition + +1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: + 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. + 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). + 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. + 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. + +* Example of an ATSP comprising 2 Account Types + +ATSP Id PA Level PA Type Sequence Number + +| 11 | | 830 550 | | 10 | + +| 11 | | 830 630 | | 20 | + +When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account + +*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. + +*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. + +1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: + +* A = set of all Acct Types of Cust +* B = set of Acct Type in ATG of Pool +* C = Intersection of A and B + +**Therefore**: + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. + +**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. + +1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. + +* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. +* If CIF number is provided only then TP base on following process to find eligible account to process: + +A = set of all Acct Types of Customer + +B = set of Acct Type in ATG of Award Pool + +C = Intersection of A and B + +**Therefore:** + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. + +**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. + +1. ATG is used to validate blocked transaction. +2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Reward Campaign + +### Requirement Definition + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. +3. A single transaction can trigger multiple concurrent award programs. +4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +5. Type of campaign in OLS: + +* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: + +![](data:image/png;base64...) + +* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: + +![](data:image/png;base64...) + +1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. + +### Process flow + +### Trigger + +### Pre-Condition + +1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. + +### Wireframe + +Refer wireframe on figma. + +### Business rules + +* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) + +1. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) +2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Create/Edit mode** | | | | +| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | +| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | +| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | +| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | +| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | +| | **Campaign Target** | | | +| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | +| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | +| **View mode: Display all field of create mode and add following fields:** | | | | +| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | +| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | +| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | + +### Post-condition + +### Exception flow + +## Reward Campaign Rule + +### Requirement Definition + +* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. + 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. + 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. + 4. In this version we support following Campaign Rule type: +* Award +* Redeem +* Adjust +* Item Redemption +* Counter Extract and Process +* Redeem Extract and Process +* Transaction Extract and Process + 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust + +### Process flow + +### Trigger + +### Pre-condition + +* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. + +### Wirefame + +Refer to Figma. + +### Business rule + +* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe + 3. Campaign Rule Screen can be display as a submodule of Campaing module as well + 4. **Screen description for Edit/Create mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Choose rule type to configurate campaign Rule** | | | | +| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool_Definition" table. Refer "Pool Definition" API under Campaign Management. | +| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | +| **Step 4: Formula setting** | | | | +| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | +| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code_Management" table where code type is "amt-to-use-formula" | +| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | +| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | +| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | +| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | +| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | +| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | +| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | +| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | +| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | +| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | +| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | + +### Post-condition + +Amount to use feature with Transaction Processing. + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +### Exception flow + +## Campaign Rule Criteria + +### Requirement Definition + +1. Rule criteria are divided into 5 categories for ease of maintenance: + +| | | | +| --- | --- | --- | +| Customer | Account | Transaction | +| Atttribute | Counter | Merchant | + +1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* 1. Exsiting Campaign require at least one campagin rule validate criterions. + +### Pre-Condition + +1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== + +![](data:image/png;base64...) + +1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. + +### Wireframe + +![](data:image/png;base64...) + +Figure 1 - Query builder + +![](data:image/png;base64...) + +Figure 1 – Rule criteria + +![](data:image/png;base64...) + +Figure 2- Drag criteria into Rule + +![](data:image/png;base64...) + +Figure 3 – Rule criteria screen after complete setup + +### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). +2. OLS system will use Query Builder to build query for Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same campaign rule. +4. **Screen description:** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | ![](data:image/png;base64...) | Click to add new criteria | Button | +| | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. ![](data:image/png;base64...) | Action | +| | ![](data:image/png;base64...) | Click to delete criteria | Button | +| | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | +| | Criteria | **Criteria Structure:** **![](data:image/png;base64...)** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | + +1. **Right panel** + +In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. + +Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== + +Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== + +**Some use case for each criteia group:** + +| | | | +| --- | --- | --- | +| **Index** | **Use case** | **Criteria group** | +| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | +| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | +| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | +| | MCC group Store group Chain group Corporation group | Transaction criteria | +| | ATG criteria | Account Criteria | +| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | + +1. **Query builder structure** + +*For example:* + +*+ Account type criteria has data type as string and filter value is account type list from PRODUCT_ACCOUNT_TABLE.* + +*+ Transaction description criteia has data type as string but filter value is enterted by user.* + +*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | +| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: ![](data:image/png;base64...) | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | +| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. ![](data:image/png;base64...) | +| | Is empty ( NULL) | This condition checks whether the comparison value is empty. ![](data:image/png;base64...) | MUST not display filter value field and input type | +| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. ![](data:image/png;base64...) | +| | Contains | This condition checks whether the comparison value contains the filter value. ![](data:image/png;base64...) | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example ![](data:image/png;base64...) | +| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. ![](data:image/png;base64...) | +| | Is in | This condition checks whether the comparison value is in one of the filter value. ![](data:image/png;base64...) | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example ![](data:image/png;base64...) 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | +| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. ![](data:image/png;base64...) | +| | Begins with | This conditon checks whether the comparison text begins with the filter value. ![](data:image/png;base64...) | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example ![](data:image/png;base64...) Should not be case sensitive | +| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. ![](data:image/png;base64...) | +| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. ![](data:image/png;base64...) | +| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. ![](data:image/png;base64...) | +| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. ![](data:image/png;base64...) | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. ![](data:image/png;base64...) | +| | Is less than (<) | This condition checks Comparison value is less than filter value. ![](data:image/png;base64...) | +| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. ![](data:image/png;base64...) | +| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. ![](data:image/png;base64...) | +| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. ![](data:image/png;base64...) | +| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) ![](data:image/png;base64...) | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* ![](data:image/png;base64...) *For example 2: Customer’s birthday from Jul 01 to Jul 15* ![](data:image/png;base64...) | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | +| | Is fixed date | This condition checks whether the comparison value is equal to filter value ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | +| | Is null | The comparison value must be null value | There is no filter value | +| | Is not null | The comparison value must be null value | +| | Is betweenperiod from N (min to max value). | ![](data:image/png;base64...) **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* ![](data:image/png;base64...) ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) ![](data:image/png;base64...) ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** ![](data:image/png;base64...) | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | +| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | +| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | +| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | + +### Post-condition + +* 1. User able to proceed next step to complete campagin rule setup. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Campaign Rule Formula + +### Requirement Definition + +1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. +2. Sometimes we was using campaing formula to update the counter value or attribute value as well. +3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. + +### Process flow + +### Trigger + +### Pre-Condition + +### Wireframe + +### Business rules + +See more detail in attached file + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +### Post-condition + +### Exception flow + +## Campaign Rule – Contributor Settings + +### Requirement Definition + +1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. +2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* 1. Campaign require a list of Contributors configured for the Rule. + +### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. +2. The merchant as a “contributor” of the award transaction should availble on OLS system. + +### Wireframe + +* + 1. Contributor setting + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business rules + +* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. + +1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Type** | +| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | +| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | +| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | +| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | +| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | +| | ![](data:image/png;base64...) | Clicking Click on the “![](data:image/png;base64...)” icon removes the Contributor row | Button | + +1. The total contribution must be 100%. +2. Contributor must be uinique on each campaign rule. +3. If contributors are configured then must have one and only one contributor is “absord remider”. +4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) + +### Post-condition + +* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Counter Extract & Process (CEP) Request + +### Requirement Definition + +* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. + +### Process flow + +### Trigger + +### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. +2. All drop-down value must avaiable in the system. + +### Wireframe + +Please refer figma to get more detail. + +### Business rules + +* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | +| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter_Definition" table. Refer "Counter Definition" API under Campaign Management | +| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | +| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | +| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | +| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | +| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | +| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | +| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +### Post-condition + +1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: + 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== + 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== + 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== + +| | | | | +| --- | --- | --- | --- | +| | **Counter Bucket To Extract** | | | +| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | +| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | +| * Monthly on Day N of Month | +| * Statement Cycle Date | +| * N Days after AOD | +| * Annually, on Day N of Month M | + +* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run + 2. Counter state is update when CEP extract based on Counter definition setup : + + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. + + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. + + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. + +### Exception flow + +N/A + +## Redemption Extract & Process (REP) Rule + +### Requirement Definition + +1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. +2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. +3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. + +### Process flow + +### Trigger + +* + - 1. The campaigns require the system automation extract the pool balances. + +### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. +2. All drop-down value must available in the system. + +### Wireframe + +* + - 1. Please help to refer on the figma. + +### Business rules + +* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool_Definition” table. Refer “Pool Definition”API under Campaign Management | +| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | +| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | +| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction_Code”table Refer “OLS Transaction Code” API under Campaign Management | +| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | +| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | +| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually/Hàng năm | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | +| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | + +### Post-condition + +REP batch job extract balance based on REP rule type configure. + +=tbd== + +### Exception flow + +## Item Redemtion Rule Type (ITRD) + +### Requirement Definition + +Item redemption Rule Type is used to to evaluate item redemption transactions. + +The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. + +Redemption pool which be used to redeem wil be configured in item price instead. + +### Process flow + +Update later + +### Trigger + +If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. + +### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. +2. All drop-down value must available in the system. + +### Wireframe + +Please refer Award Rule Type. + +### Business rules + +* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". + 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | + +### Post-condition + +To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Transaction Rule Analysis (HAVE TO BE ADDED) + +### Requirement Definition + +### Process flow + +### Trigger + +### Pre-Condition + +### Wireframe + +### Business rules + +### Post-condition + +### Exception flow + +## Campaign Insight + +### Requirement Definition + +* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. + +### Process flow + +### Trigger + +N/A + +### Pre-Condition + +1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. + +### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business rules + +1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. +2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. +3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. +4. OLS support following chart: + +#### Top 10 Best customer of the campaign + +* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter key** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | +| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | +| **Layout:** ![](data:image/png;base64...) | | | +| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | +| | View all | Use scroll bar to view full list top 10 best customer. | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | + +#### Number of enrrolled customers not - eligible because of criteria + +This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. + +Dashboard descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | +| **I: Layout 1** ![](data:image/png;base64...) | | | | +| **Filter key** | | | | +| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | +| | Period | | Last 12 months | +| **Layout description** | | | | +| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | +| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | +| **II : Layout 2** ![](data:image/png;base64...) | | | | +| **Filter** | | | | +| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | +| **Layout description** | | | | +| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | +| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last_update_date of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | + +#### Number of enrolled customers eligibe vs not- eligible because of criteria + +This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. + +1. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Descriptions** | +| **Filter** | | | +| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | +| | Period | Last 12 months | +| **Layout:** ![](data:image/png;base64...) | | | +| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | +| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | +| **Data source** | | | +| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS_ORPHAN_TXN_NO_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | + +#### Earned points Vs redemmed points + +* + 1. This chart used to compare total earned point with total redeemed point during each selected period. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | +| **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | +| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | +| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | + +#### Redemptions point on each channel + +* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Icon ![](data:image/png;base64...) | Icon for each channel: Item redemption Automation redemption Pay with Points. | +| | Total redemmed points and rate ![](data:image/png;base64...) | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | + +#### Redemption on each item type + +* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | +| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | +| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | + +#### Customer’s activities + +* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. + 2. **Dashboard descriptions** + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Month | Last 12 months | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | +| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | +| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | +| **Data source** | | | +| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last_update_date in OLS system to determine period. | | + +#### Campagin statistic + +* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter: Just use for detail listing only** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | +| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Campagin statistic ![](data:image/png;base64...) | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | +| | Detail listing ![](data:image/png;base64...) | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | +| **Data source** | | | +| | Get data from TRANSACTIONs table for number of customers/ total spending and awarded points Get data from CAMPAIGN table for target value. Use transaciton date to determine period. | | + +### Post-condition + +* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. + +### Exception flow + +N/A + +## One tester (HAVE TO BE ADDED) + +### Requirement Definition + +### Process flow + +### Trigger + +### Pre-Condition + +### Wireframe + +### Business rules + +### Post-condition + +### Exception flow + +# Customer management + +## Customer profile + +### Requirement Definition + +1. OLS administration screens include a “Customer Profile” function to view Customer details. +2. Customer records are view-only, and can only be updated from source systems by batch ==TBD=== + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + - 1. User want to verify/ get customer’s information. + +### Pre-Condition + +1. User have to have the access right on both “Customer Profile module under “Customer Mangement” Group. + +### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + - * 1. Filter + +![](data:image/png;base64...) + +* + - * 1. Create/Edit mode + +1. ![](data:image/jpeg;base64...) + * + - 1. Detail view + +![](data:image/png;base64...) + +### Business rules + +1. Click on Customer Profile icon in Main Menu to list customer records, as illustrated in the [wrireframe](#_Wireframe_13). +2. Use the filter to locate particular customer, which will be listed in the display. +3. Click on a row to view details of the customer record, as illustrated in the [wireframe](#_Wireframe_13). +4. Filter description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Filter** | | | | +| | Quick search | As common function, OLS allows find customer record by quick search function. Put and press enter any key related to these field to find data. | | +| | Gender / Giới tính | If Gender are provide then just get customer who have selected gender If gender are not provided then get all customer | Drop -down Allow multiple select | +| | Country Origin /Quốc gia | If Country are provide then just get customer who have selected Country Issused If Country are not provided then get all customer | Drop -down Allow multiple select | +| | Date of Birth/Ngày sinh | Find customer who have day of birth matched with selected date | Date Time picker | +| | Card number/ Số thẻ | Find customer who have the account of inputed Card number | Text box | +| | Account number/Số tài khoản | Find customer who have the inputed Account | Text box | + +1. **Screen description** + +Screen description at create/edit mode + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: Customer Profile / Hồ sơ khách hàng** | | | | +| | CIF number \* / Số CIF | Unique CIF Number assingn to each customer. | X(30) | +| | Frist Name \*/ Tên | Customer First Name | X(50) | +| | Last Name \* / Họ | Customer last name Frist Name + Last Name will be customer Name which will be stored in database for refering | X(50) | +| | Date of Birth\*/ Ngày sinh | Customer birth date | Date | +| | Registration Date/ Ngày đăng kí | The date customer open an account | Date | +| | Gender / Giới tính | Customer Gender | Drop-down Select one Lookup value from Code_Management table where code type is “gender”. Refer to “get-type-by-code”API under Master data | +| | Customer Status \*/Trạng thái khách hàng | Customer status | Drop-down Select one Lookup value from Code_Management table where code type is “customer-status”. Refer to “get-type-by-code”API under Master data | +| | Customer Block Code | Customer block code | X(10) | +| | Marital Status/ Tình trạng hôn nhân | Customer marital ima status | Drop-down Select one Lookup value from Code_Management table where code type is “marital-status”. Refer to “get-type-by-code”API under Master data | +| | ID Type/ Loại ID | ID Type of cardholder ID | Drop-down Select one Lookup value from Code_Management table where code type is “cardholder-idtype”. Refer to “get-type-by-code”API under Master data | +| | Cardholder ID/ Số ID | Cardholder ID Condition field. This field is required when Cardholder type is selected otherwise this will be optional field. | X(30) | +| | Country Origin/ Quốc gia | Customer country orgin | Drop-down Select one Lookup value from “Country” table. Refer “Country Code” API under Code Maintenance | +| | Customer Income/Thu nhập | Customer income | 9(14,2) Should be greater than or equal to 0 if provided | +| | Datetime of maitenance date/ Ngày cập nhật thông tin | The sysdate to create/update record via OA screen. The maintenance date from request if input via batch job | Datetime The date format must adhere to the configured format Display for view mode only | +| | Profile Picture /Ảnh hồ sơ | Drag or drop photo Or Browse file to upload image file | | +| **Step 2: Contact Detail/ Thông tin liên hệ** At least one contact detail record should be provided Each customer can have more than one contact detail information such as customer contact and guardian contact…. | | | | +| | Addess Type\*/ Loại địa chỉ | Adress type A drop-down list to select one of following address: Home Address Business Address Shipping Address Billing Address | Drop-down Select one Address type should be unique on each customer | +| | Phone number\*/ Số điện thoại | Phone number | X(30) | +| | Email Address\*/ Địa chỉ Email | Email Adress This field must be under email format | X(50) | +| | Address 1/ Địa chỉ 1 | The main address | X(100) | +| | Address 2/ Địa chỉ 2 | Other address | X(100) | +| | State/Tỉnh-Khu vực | State | Drop-down Select one Lookup value from “State_Code” table Refer to “State code” API under Code maintenance | +| | City/ Thành phố | City | Drop-down Select one Lookup value from “City_Code” table Refer to “City code” API under Code maintenance | +| | Zip Code/ Mã bưu điện | Zip code/postal code | Drop-down Select one Lookup value from “ZIP_CODE” table Refer to “Zip Code” API under Code Maintenance | + +* 1. **Processing** + + If a request is adding a record which whose CIF # locates an existing Client record in OLS with record Status = “A”, the incoming record will be rejected. + + If a request is updating or deleting a CIF # that does not locate an existing Client record with record Status = “A” in OLS, the request will be rejected. + + If a request is deleting a CIF# that locates a Client record that is linked to one or more Account that is still active in OLS, the request will be rejected. + + When new customer is added in OLS then: + ++ Customer record is added in both Client and Client_corr table. + ++ The corresponding LOYALTY_ACCOUNT is created. + +* + - When customer is deleted then: + ++ Logically delete the record by moving it to History table. + ++ Locate record in LOYALTY_ACCOUNT and move that to History table. + +* + - Records added thru this screen cannot be updated by records from the OLS batch. Record created/updated by OLSCUST batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + 1. **View mode of active record is display as customer 360 which is described** **in section 5.2.** + +### Post -condition + +* + - * 1. Able to access submodule in customer management module which will be described more detail as following section. + +### Exception flow + +N/A + +## Customer 360 + +### Requirement Definition + +1. OLS administration screens include a “Customer 360” function to view Customer details. +2. Customer 360 contains key information about customer. User can use it as a strategy guide to creating personalized experiences. + +### Process flow + +N/A + +### Trigger + +N/A + +### Pre-condition + +1. User need to have the access right in Customer Profile module in order to able to view this dashboard. +2. User must select a customer in customer profile listing page to bring up the customer dasboard. + +### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business Rules + +1. Clicking on the chart icon at the top of the main Customer list page will toggle between the Customer list view and the Customer dashboard view. +2. Customer dashboard update constantly, giving user a real-time view of customer behavior and information. +3. Click any customer record in listing page to see the customer profile of each customer. +4. **OLS support following information:** + +#### Customer information + +![](data:image/png;base64...) + +* + 1. Click “See profile details” to see customer profile detail. The system bring up the screen as pop-up screen for customer profile as illustrated as following: + +![](data:image/jpeg;base64...) + +1. User can edit/delete customer from this screen. + +#### Customer’s rewards statistic + +![](data:image/png;base64...) + +* + 1. This part displays statistical indicators related to the customer's rewards. OLS introduces 2 indicators: + ++ Points: The customer’s total available points. Use sysdate to determine the balance bucket periods. + ++ Cash back: The customer’s total available cash back. Use sysdate to determine the balance bucket periods. + +#### Account / Card information + +* + 1. The Customer’s account holdings and all of the customer’s card are displayed, regardless of whether account or card number is used. + 2. **The Account/ Card information listing give user have a general overview of customer’s cards:** + +**+ A = Set of card list of all account in the selected customer** + +**+ B= Set of card lists for the specifically selected customer.** + +**Therefore C= Card in listing page = Distinct cards from the union of A and B** + +* + 1. **In case account there is no card is added then just show the account list of selected customer.** + 2. Quick shortcut to support adding new Card or new Account from this screen. + 3. Detail listing description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Filed** | **Description** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| | Account type\*/Loại tài khoản | The combination of Product Account Level and Prodcut Account Type of customer. All Customer’s account holding are displayed here. | Display | +| | Account Number\* /Số tài khoản | Product Account No. | Link Click on each Account number to bring up the Account Detail screen to see more about this account. See more on [Account](#_Account) section | +| | Card Number/Số thẻ | Card number | Link Click on each Card number to bring up the Card Detail screen to see more about this card. See more on [Card](#_Card) section. | +| | CIF Number\*/Số CIF | CIF number of card will be the same as selected CIF number for Principal card For supplement card then this is CIF number of Card instead CIF Number of Account. | Display | +| | Card Status/Trạng thái thẻ | Card status | Display Lookup value from Card table | +| | Card indicator/Chỉ thị thẻ | Card indicator | Display Lookup value from Card table | +| | Card block code/Mã chặn tài khoản | Card block code | Display Lookup value from Card table | +| | Card expiry date/Ngày hết hạn thẻ | Card expiry date | Display Lookup value from Card table | +| | Account block code/Mã chặn tài khoản | Account block code | Display Lookup value from Product_Account table | +| | Account status\*/Trạng thái tài khoản | Account status | Display Lookup value from Product_Account table | +| | Account Open Date\*/Ngày mở tài khoản | Account Open Date | Display Lookup value from Product_Account table | + +#### Transaciton statistic + +A combination of two charts is used to describe the transaction statistic for selected period of a customer. + +The line chart describes the fluctuations in a customer's balance for the selected pool over a specified period. + +The combo chart illustrates the relationship between the total number of transactions and the total number of transacted merchants for the selected pool over a specified period. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | | +| **Filter** ![](data:image/png;base64...) | | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months 4. Last 6 months Default as “This month” This filter is apply for both graph | | +| | Pool | Mandatory field Allow multiple select Lookup value from Pool Defintion Display Pool ID and Pool Name per each pool. This filter is applied for left graph only | | +| | Account type | Drop-down list to select combination of PAT and PAL. Allow multiple select. This filter is applied for right graph only | | +| | MCC | Drop-down list to select MCC of the transaction. Allow multiple select Display code and description per each MCC This filter is applied for right graph only | | +| **Line chart** **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Vertical axis | Total point each selected period/ selected pool Each line is assinged for one transaction type. | | +| | Horizontal axis | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. If Period “Last 6 months” is selected then horizontal axis is including last 6 months from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points/ adjusted points for the date range/time frame defined. | | +| **Data source** | | | | +| Get data from the TRANSACTION table with transaction type = “Award” for earned points/Transaction type = “Redeem” for redeemed points / Transaction type =’ Adjust” for Adjusted points during each selected month on the selected pool. The transaction should not be a cancellation transaction. Use the transaction date to determine the period. | | | | +| **Combo chart** Layout ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Left vertical axis | | Total number of transacted merchants during selected period of selected pool Use Bar chart to describe total number per each period | +| | Right vertical axis | | Total number of transaction during selected period of selected pool Use line chart to describe total number per each period | +| | Horizontal axis | | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of transaction for the each day/month Hover over the bar graph to view a count of transacted merchant for the each day/month | +| **Data source** | | | | +| | Lookup value from TRANSACTIONS table Use transaction date to determine period Use Store data as merchant to determine transacted merchant Each OLS Reference No should be one and only transaction. | | | + +#### Customer Activities + +* + - * 1. The all customer activites will be triggerd and displayed here. + 2. Some types of customer activities as following: + 1. Loyalty program + +All OLS transaction of customer such as: + +* + - Enrolling in and participating in OLS loyalty programs. + - Redeeming points + - Transfer points + - Earn points + 1. Feedback and Review + + Leaving customer’s feedback on the portal app. + 2. Email engagement + + Receive email from OMR + 3. Account management + +Refering to all bellow action in portal app such as: + +* + - Updating customer information, such as contact details, payment methods, and preferences. + - Password resets and login activity. + +1. Allow user filter data by time frame (Start date and End date). +2. Layout + +![](data:image/png;base64...) + +#### Customer Segmentation + +* + - 1. Deviding the customer base into segmentation groups based on specific characteristics, behaviors and demographics. + 2. Introduce the criteritions on each segmentation group and the conditons to meet each criterion. Based on this, OLS introduce a program to collect data and devide customers into each segment. + 3. Demographic segmentation includes following segment: + 1. Gender: Famale or Male + 2. Age: Teenager / Adult/ Middle- Aged person/ Senior Citizens: Based on criteria (Age’s range) to devide customer’s age. + 3. Matirial Status: Single or Married + 4. Income: Low / Medium / High: Based on criteria (customer’s income range) to devide icom segment. + 5. Layout + +![](data:image/png;base64...) + +1. Behaviors segmentation includes following segment: + 1. Frequency of purchase: Daily / Weekly/Montly..: Based on the frequency of the transaction to devide this segment. + 2. Membership class: Depending on the organization, business. Some common types of membership class: + * Basic membership + * Premium membership + * Platium membership + * Gold membership + * Daimon membership + * VIP membership + 3. Purchase channel: Categorizing customers based on customer’s preferred purchase channels, such as in-store, online, mobile app, or phone (Call to call center)… + 4. Hobby: Based on customer’s hobby to create siutable loyatly program. + +6. Layout + +![](data:image/png;base64...) + +#### Most Redemmed Items + +The top 10 (this value should be configurable value) redeemed items of the customer are displayed here. + +Just show top 5 item on each page. + +Each row contains a summary for an item, including the item code, the total redeemed quantity, and the redeemed points/cash amount to use for the specificed period. + +Shortcut to support quick add new item redemption transaction from this screen. + +Listing page description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| F**ilter** | | | | +| | Period | Period used to filter data. | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. Today 2. This month 3. Last month 4. Last 3 motnhs Default as “To day” | +| | Item type | Optional field The drop-down to select item type to get top N item. If item type is not provided then top N of all item type will be displayed. | Drop down Multiple select Default Evoucher type | +| **Listing page** | | | | +| | Item code/Mã vật phẩm | Item code | Display Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Item Name/Tên vật phẩm | Item Name | Display Lookup value from ITEM table | +| | Category/ | The categories are assigned to item | Display Lookup value from Item table Each item can be assinged more than one category | +| | Quantiy/Số lượng | Total redemmed quantity of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Redemmed points/ Điểm đã sử dụng | Total redemmed point of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Cash Amount used/Tiền đã sử dụng | Cash used to redeem | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| **Data source** | | | | +| | Lookup value from CAT_CATALOGUE_TRANS_DETAIL table Use Post_Date to determine period Order by quantity descending order. | | | + +#### Balance information + +1. The all customer’s pool balances are displayed here. +2. Each row contains the summary for a Pool: the total balance (sum of all buckets in a Pool), redeemable balance and the expiry date of the earliest expiring bucket. +3. Listing page descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| Layout ![](data:image/png;base64...) | | | | +| **Fitler** | | | | +| | Pool | Optional field A drop-down to select the reward pools, which quickly retrieves the customer's balance. If Pool is provided then the system display all balance of the selected pool of the customer. If pool is not provided then all pool balance of the customer are displayed. | Drop –down Default as empty Multiple select Lookup from pool definition screen Display only the pools with a non-zero balance. | +| **Listing page** | | | | +| | Pool ID/Mã pool | Pool ID | Link Click on the pool id to bring up the “[Pool Balance Enquiry](#_Balance_Detail_Enquiry) ” detail view of this pool. | +| | Pool Name/Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Balance/Số dư | Sum all balance buckets of a pool of customer. | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of a pool of customer. The bucket should have: Start date <= Processing date <= Expiry date | Display as number format Lookup value from LAB table | +| | Earliest Exp Bal and Date/ Số dư gần nhất | The earliest expiring bucket date for a pool, for non-0 balance buckets. And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | + +### Post – condition + +* + 1. User can use it as a strategy guide to creating personalized experiences.. + +### Exception flow + +N/A + +## Account + +### Requirement Definition + +Account tab show all customer’s holding account. + +Account information means anything relating to customer’s holding acccount which sent from external system to OLS or Added by user via OLS system. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +N/A + +### Pre-condition + +1. Users have to have access rights in both “Customer Profile” and “Account” modules under “Customer Mangement” Group in order to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Account” tab. +3. An account type must be available in the OLS system before adding any account of that type. + +### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +Add/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +### Business Rules + +Account records are updated in the external system and then loaded into OLS. + +Account records can be added by adding functions in administration screens. + +Click on the Account tab in the Customer profile screen to bring up the Account listing as illustrated in the [wireframe](#_Wireframe_4). + +Use the filter to locate a particular Account, which will be listed in the display. + +Click on a row to view details of the Account record, as illustrated in the [wareframe](#_Wireframe_4). + +Screen description + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | | | **Data type** | +| | CIF numnber\* / Số CIF) | CIF number of selected customer | | | Display | +| | Product Account Level (PAL) \* /Hạng tài khoản | Product Account Level of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_LEVEL table Refer to “ Product Account Level” API under “Code Maintenance” | +| 2. | Product Account Type (PAT)\* /Loại tài khoản | Product account type which belongs to selected PAL that assigned to Account Combination PAL and PAT as Account Type of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_TYPE table where PAL as selected PAL Refer “ Product Account Type” API under “Code Maintenance” | +| 3 | Account Number\*/ Số tài khoản | Product Account Number | | | X(20) Combination Account Type + Account Number should be unique. An Combination Account No + Account Type is assigned to an ASN. ASN is unique in the OLS system | +| | Account Open Date \*/Ngày mở tài khoản | Product Account Open Date | | | Date The date format must adhere to the configured format | +| | Account Indicator\*/ Chỉ thị tài khoản | P- Personal account C- Corporate Account | | | Drop-down Select one Lookup value from “Code Management” table where type code is “Acct-indicator”. Refer “List-by-code-type” API under Master Data. | +| | Account block code/ Mã chặn tài khoản | The account block code is used to check block transaction via TP or on some MQ validation | | | X(10) | +| | Block code reason / Mã lí do chặn tài khoản | Reason to block account | | | X(100) | +| | Block code last update date/ Ngày chặn cuối cùng | The day to block account | | | Date The date format must adhere to the configured format | +| | Cycle / Ngày sao kê | Statement cycle date | | | 9(02) Should be greater than 0 if provided | +| | Account status\*/ Trạng thái tài khoản | Product account status The Account status is used to check block transaction via TP or on some MQ validation | | | Drop-down Select one Lookup value from “Account Status” screen (Account_status table). Refer “Account status” API under Code Maintenance | +| **Card information/Thông tin thẻ** When click to view any active account then this pannel is display to show the card of cards belong to selected account. The pannel includes following information: | | | | | | +| | Card number / Số Thẻ | | Card Number | Display Lookup value from Card_Product_Account_Rel table where account is selected account. Refer “Card” API under Customer Management | | +| | Card status/ Trạng thái thẻ | | Card Status Display both code and description of status | Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-status”. Refer “Card” API and “get-by-code-type” API | | +| | Card Indicator/Chỉ thị thẻ | | Card indicator Display both Code and description of indicator | Display Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-indicator”. Refer “Card” API and “get-by-code-type” API | | +| | Card Creation Date/ Ngày tạo thẻ | | Creation Date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card Expiry Date /Ngày hết hạn | | Expiring date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | CIF number/ Số CIF | | CIF number of Card | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card block code/Mã chặn thẻ | | Card block code | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | + +Each account is belong to only one Customer. OLS don’t support to change CIF number of account in this screen. If have to change CIF number of the account then it should be processed via CIF Merge batch if needed. + +Records added thru this screen cannot be updated by records from the OLSACCT batch. Record created/updated by OLSACCT batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + +When an account is added then: + +* If locate any exiting record with the same combination Account No+ Account Type in OLS (record status is “A”) then the record is rejected. +* If not then: + + - Account record is added in PRODUCT_ACCOUNT table. + - The corresponding LOYALTY_ACCOUNT_PRODUCT is created + +When an account is modified then : + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then update Product Account fields with the incoming field values accordingly. The original record is moved to his table after record is approved. +* Upgrade Account case :==tbd=== + +When account is deleted then: + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected +* If locates a Product Account record that has a Card record with record Status “A” linked to it, the incoming delete action is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then move record into history table. The corresponding LOYALTY_ACCOUNT_PRODUCT is moved to his table as well. + +### Post – Codition + +* 1. Allow to add Card. + 2. Allow to post transaction with new account. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Card + +### Requirement Definition + +Card tab show all customer’s card. + +Card information means anything relating to customer’s card which sent from external system to OLS or added by users on the OLS system. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +N/A + +### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Card” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Card” tab. +3. An account must be available in the OLS system before adding any card of that account. + +### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Create/Edit view + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail record view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +### Business rules + +Card records are updated in external system and then loaded into OLS, so OLS only provides view functions in administration screens for Card records. There is no further actions. + +Click on Card tab in Customer profile screen to brings up the Card listing as illustrated in the [wareframe](#_Wireframe_5). + +Use the filter to locate particular Card, which will be listed in the display. + +Click on a row to view details of the Card record, as illustrated in the [wareframe](#_Wireframe_5). + +Create/Edit screen description + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| | CIF number \*/Số CIF | CIF Number of Card | Drop-down Get data from Client table Default as CIF Number of selected customer but user can modify if Supplement Card is added. Support quick search CIF number by enterd al least 4 digits of CIF number. | +| | Account Type\*/ Loại tài khoản | Combination of Product Account Level and product account type PAT : Visa [001] PAL: Debit [830] Account type : 830-001 | Drop-down Lookup value from PRODUCT_ACCOUNT table where Account Type is Account type of select customer (Use CIF number which is selected from listing page). Refer to “Product account” API under “Customer Management”. | +| | Account number \*/ Số tài khoản | Product Account number | Drop-down All account of selected account type of selected customer. Refer to “Product account” API under “Customer Management” | +| 3 | Card number\* /Số thẻ | Card number | X(20) Must be unique value in whole system. | +| | Masked Card Number/ ==tbd== | Masked Card Number | X(20) | +| | Cardholder Name\*/ Tên chủ thẻ | Cardholder Name | X(50) | +| | Card Indicator\*/ Chỉ thị thẻ | Card indicator: S- Supplement Card P – Principal Card K – Corporate Card …. For principal card then CIF of card must be the same as CIF of Account. | Drop-down Select one Lookup value from “Code management” table where type code is “card-indicator”. Refer “list-by-code-type” API under “Master Data”. | +| | Card status \*/Trạng thái thẻ | Card status The Card status is used to check block transaction via TP or on some MQ validation | Drop-down Lookup value from “Card Status” screen (Card_status table). Refer “Card status” API under Code Maintenance | +| | Card block code/Mã chặn thẻ | Card block code The Card block code is used to check block transaction via TP or on some MQ validation | X(10) | +| | Card activation date /Ngày kích hoạt thẻ | Card activation date | Date | +| | Card creation date\*/ Ngày mở thẻ | Card creation date | Date | +| | Card expiry date \*/ Ngày thẻ hết hạn | Card expiry date | Date | +| | Old Card Number/ Số thẻ cũ. | Old Card Number | Drop-down list Card belong to selected account. In BAU processing, this is the existing card number to be replaced by new Card Number in this record. This field should have a value only if this record is ADDING a NEW CARD NUMBER which is to replace the OLD CARD NUMBER. Both new card and old card should under the same account. | +| | ==tbd== | | | + +1. Records added thru this screen cannot be updated by records from the OLSCARD batch. Record created/updated by OLSCARD batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. +2. When a record is adding with whose Card Number already exists in OLS, the record will be rejected. +3. When a record is adding/updating with whose Account does not exists in OLS, the record will be rejected. +4. When a record is adding/updating with whose CIF Number does not exists in OLS, the record will be rejected. +5. **Processing** + +* Each Card is belong to only one Account and only one customer. OLS don’t support to change CIF number Or Account of Card in this screen. If have to change CIF Numnber of card or account of card then it should be processed via CIF Merge batch if needed. +* When a record is adding with inputed data passed the card record validation then: + + - The card record is added in CARD table. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. +* When a record is updated whose Card Number passes the validations then the Card record and the Card–Account relationship record are updated. Original record is moved to his table. +* When a Card is deleted then the Card record is moved to history table to indicate a logical delete. The corresponding CARD_PRODUCT_ACCOUNT_REL record for this card is also moved to history table. +* For principal card CIF number of account should be the same CIF number of card. +* For replacement case: A new Card issued to the Cardmember in case of loss, theft, mutilation or non-receipt of a Card. Therefore new card is coming to replace old card. When replace card then: + + - Add the incoming record as a new Card record with the same PSN as old card number. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. + - Old Card Number will continue to be processed until the Card Status and/or Block Code is/are updated to make the card ineligible. + - All Attributes, Counters and Pool Buckets which were linked to the old Card number will be automatically linked to the new Card record. + +1. Card listing will be the list card of all account of selected customer. + +### Post – Codition + +N/A + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Pool Balance Detail + +### Requirement Definition + +OLS will support Pool balance enquiry as a tab on Customer Profile Screen. + +Pool Balance tab to list a summary of all Pools of the customer. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +User would like to check balance detail of customer. + +### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Balance Enquiry” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Pool Balance Detail” feature. + +### Wireframe + +Summary listing page + +* + 1. Listing page + +![](data:image/png;base64...) + +* + 1. Filter + +![](data:image/png;base64...) + +1. Detail view + * 1. Detail view per each pool + +![](data:image/png;base64...) + +* + 1. Click on each row in Pool Balance View to brings up the pop-op detail view + +![](data:image/png;base64...) + +### Business rules + +* 1. Click on Pool Balance tab to list a summary of all Pools of the customer. + 2. All summary of pool balance display in listing page. + 3. This screen just display only. There is no Add/Mofify action on this screen. + 4. Each row contains the summary for a Pool: the total non-balance (sum of all buckets in a Pool), and redeemable balance and the expiry date of the earliest expiring bucket. + 5. Use the filter to locate particular pool balance detail record, which will be listed in the display. + 6. Click on any record to bring up the breakdown of the Pool in that row on the “Pool Balance Detail” Screen as illustrated in the [Wireframe](#_Wireframe_2). + 7. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +* 1. Pool Balance Detail screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| **Pool Balance /Số dư pool** | | | | +| | Pool ID / Mã pool | Pool ID | Display | +| | Pool Name/ Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Pool type/ Loại pool | Pool Type | Display Lookup value from Pool Definition | +| | Pool Entity level / Cấp thực thể pool | Pool Entity level | Display Lookup value from Pool Definition and master data table | +| | Balance / Số dư | Sum all balance buckets of selected pool | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of selected pool The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | +| | Next Expiring Balance/ Số dư hết hạn gần nhất | The earliest non-expiring balance bucket of the selected pool. | Display as number format Lookup value from LAB table | +| **Pool Balance View/ Chi tiết số dư pool** The breakdown of the Pool in that row following: ![](data:image/png;base64...) 1. Each row is a bucket containing the remaining points earned by the Account/Card shown, and expiring on the date shown. Expired buckets but haven’t yet forfeited will be shown as well. 2. If Customer pool level then all Pools buckets of the customer are shown under each speparaty account even it is customer entity-level. 3. If Account pool level then all only the Pool buckets earned by the presented Account will be shown. 4. If Card pool level then only the Pool buckets earned by the presented card will be shown. | | | | +| | Account type/ Loại tài khoản | Combination of Product Account Type and Product Account level of Account | Display Lookup from Product_Account table Lookup from Product_Account number by ASN from LAB table. | +| | Account No/ Số tài khoản | Product Account Number | Display Lookup from Product_Account number by ASN from LAB table. | +| | Card Number/ Số thẻ | Card number | Present for Card pool entity level only | +| | Pool ID/ Mã pool | Pool ID | Selected pool | +| | Balance / Số dư | Non zero balance | Display Loopkup value from LAB table. Group by Expiry date / LA/ASN/CSN/Pool ID | +| | Expiry Date/ Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +### Post – Codition + +N/A + +### Exception flow + +N/A + +## Transaction History + +### Requirement Definition + +* + - 1. Transaction History is a tab under Customer profile. + 2. A transaction history is a running record of all of the transactions logged in OLS including cancellation transactions. + 3. Noted that: Transaciton hisstory listing depened on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +User would like to check transaction history of customer. + +### Pre-conditions + +1. User have to have access rights in both “Customer Profile” and “Transaction History” modules under “Customer Mangement” Group in order to view this screen. +2. User must select a customer in customer profile listing page to access the “Transaction History” tab. + +### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + 1. Detail record + 1. Transaction Detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +1. Right panels + * + Quick view desribes expand information for this transaction. + + Click on each item to bring up the according tab + + Support scrollbar for pop-up detail view. + 1. Reward details + +![](data:image/png;base64...) + +* 1. Item Redemption Transaction Details + +![](data:image/png;base64...) + +* 1. Counter Transaction Details + +![](data:image/png;base64...) + +### Business rules + +* 1. Click on Transaciton History tab to list all transaction of the customer as illustrated in the [wireframe](#_Wireframe_3). + 2. One transaction detail record is combination of all input field (assinged to an OLS Reference No). + 3. Transaction history listing all transaction in OLS of customer include cancellation transactions. + 4. This screen just view only. There is no futher action. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Click a listed record to display the details of the transaction as illustrated in the following: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Account Detail/Chi tiết tài khoản** | | | | +| | Account Number/ Số tài khoản | Transacting Product Account Number | Display Lookup value from TRANSACTIONS table | +| | Product Account Type/ Loại tài khoản | Transacting Product Account Type | Display Lookup value from TRANSACTIONS table | +| | Product Account Level/Hạng tài khoản | Transacting Product Account Level | Display Lookup value from TRANSACTIONS table | +| | Card Number/ Số thẻ | Transacting Card Number | Display Lookup value from TRANSACTIONS table | +| **Transaction Detail/ Chi tiết giao dịch** | | | | +| | Invoice No/ Số hóa đơn | Internal invoice No generated by OLS system. | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Reference No/Số tham chiếu giao dịch | OLS Transaction Reference Number | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Source Reference Number | Reference number from source system For refrence only | Display | +| | OLS Transaction Code | OLS Transaction Code | Display Lookup value from TRANSACTIONS table | +| | Gross Amount/ Giá trị giao dịch gộp | Gross transaction amount | | +| | Nett Amount/Giá trị giao dịch ròng | Nett transaction Amount | | +| | Redeem points/Điểm đổi thưởng | Redeem points Total redeem points of the choosen transaction. The total point shoule equal to total redeem points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Redeemed Amount/ Giá trị điểm đổi thưởng | Redemmed point Amount Total redeem point amount of the choosen transaction. The total point shoule equal to total redeem point amount on each campaign rule which will be display on quick view. | | +| | Adjust Points/ Điểm điều chỉnh | Adjustment point Total adjustment points of the choosen transaction. The total point shoule equal to total adjust points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Adjustment Amount/ Giá trị điểm điều chỉnh | Adjustment points amount Total adjust point amount of the choosen transaction. The total point shoule equal to total adjust point amount on each campaign rule which will be display on quick view. | | +| | Award Points/ Điểm thưởng | Earned points Total award points of the choosen transaction. The total point shoule equal to total award points on each campaign rule which will be display on quick view | Display Lookup value from TRANSACTION table | +| | Points Awarded Amount/Giá trị điểm thưởng | Earned points amount Total award point amount of the choosen transaction. The total point shoule equal to total award point amount on each campaign rule which will be display on quick view. | +| | Transaction Date/Ngày giao dịch | Transaction Date Time | +| | Post Date/ Ngày đăng | Post Date | +| | Settlement Date/ Ngày ghi sổ | Settlement Date | +| | Cancellation Indicator/Chỉ thị hủy | Cancellation Indicator | +| | MCC | Transaction MCC Code | +| | Store/ Cửa hàng-đơn vị | Transaction Store ID | +| | Terminal / Cấp thiết bị đầu cuối | Transaction Terminal ID | +| | Transaction Description/Mô tả giao dịch | Transaction Description in OLS or Shop Name from external source system. | +| | Currency Code/ Mã tiền tệ | Currency code of the original transaction amount | +| | Country Code /Mã quốc gia | Country code of the original transaction. | +| | Transaction Mode/ Phương thức giao dịch | Mode of transaction at point of payment | +| | Transaction Channel /Kênh giao dịch | Transaction channel | +| | Salary Credit/ Chỉ báo tiền lương | Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode/ =tbd= | POS Entry Mode | +| | Reason Code/ Mã lí do | Adjustment reason code | For Adjustment transaction | + +1. Quick view in right panel displays the award, redeem, adjust and counter update details of the transaction including the campaign rules applied to the transaction and the Pool Units earned and redeemed. Click on each item to bring up the according tab. + 1. Award/Redeem/Adjust detail: Total balance in right panel should be equal to blanace which is displayed in transaction detail. This quick view displays the reward details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Quy tắc chiến dịch | Campaign rule that transaction has been triggered This value may be empty if transaction does not trigger campaign rule | +| | Transaction Type/ Loại giao dịch | Transaction Type | +| | OLS Transaction Code/Mã giao dịch OLS | OLS Transaction Code | +| | Pool/ Pool | Reward Pool | +| | Pool Unit/ Đơn vị Pool | Award/Redeem/Adjust points Depended on transaction type | +| | Pool Unit Amount / Giá trị đơn vị Pool | Award/Redeem/Adjust points amount Depended on transaction type | + +* 1. Counter Transaction Detail: + + This part displays the counter value, which is updated by the transaction on each campaign rule. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Mã quy tắc | Campaign rule that transaction has been triggered | +| | Counter / Bộ đếm | The counter for that transaction has been updated | +| | Entity / Cấp thực thể | Entity level of counter | +| | Counter Value/Giá trị bộ đếm | Counter Value | +| | Bucket Number/ Bộ đếm số | Counter bucket number which one is updated by this transaction. | +| | Bucket Start Date/ Ngày bộ đếm bắt đầu | The start date of the counter bucket for the updated counter has been changed | +| | Bucket End Date /Ngày bộ đếm kết thúc | The end date of the counter bucket for the updated counter has been changed | + +* 1. Item Redemption Transaction Detail + + This quick view displays the item redemption details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Item / Mã vật phẩm | Item | +| | Descriptions/ Mô tả | Remark of the redemption transaction | +| | Redemmed quantity / Số lượng đổi thưởng | Redemmed quantity | +| | Redeemed points/ Điểm đổi thưởng | Redeemed points | +| | Cash Amount used/Số tiền đã dùng | Cash amount is used to redeem item. | + +### Post – Codition + +N/A + +### Exception flow + +N/A + +## No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT + +### Requirement Definition + +* + - 1. In the nearest version, there is no screen to be tracking the transaction which did not trigger campaign rule by some reasons. + 2. In this version, we introduce a new screen under the 'Customer Management' module to track all non-eligible transactions (those that did not meet the rule criteria) or transactions with no linked rules + 3. A 'No-Hit Transaction' is a running record of all transactions sent to OLS to trigger a CP rule but not eligible for a campaign rule or incoming transactions with no linked campaign rule. If an incoming transaction hits Rule A but does not hit Rule B, this transaction will still appear on this screen for Rule B + 4. Noted that: Listing is depending on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + - * 1. User would like to verfiy why transaction did not hit campaign rules. + +### Pre-Conditions + +Incoming transactions trigger campaign but do not hit CP. + +User have to have access rights in both “Customer Profile” and “No hit CP- Transaction” modules under “Customer Mangement” Group in order to view this screen. + +User must select a customer in customer profile listing page to access the “No hit CP- Transaction” tab. + +### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +### Business rules + +* 1. Click on No Hit CP- Transaction tab to list all No-Hit CP transaction of the customer as illustrated in the [wireframe](#_Wireframe_15). + 2. One transaction detail record is one incoming transaction ( assinged to one Invoice No). + 3. Detail view screen will display all campaign rule which transaction trigger but does not hit. + 4. This screen just view only. There is no further actions. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Lookup no – hit transactions from OLS_ORPHAN_TXN_NO_HIT table for transaction which trigger campaign rule but not meet rule criteria OR transaction no linked any campaign rule. + 7. This screen should desribe detail why transactions do not hit CP rule such as if critertia do not meet then which criteria failed. TP should response detail the error description to can show in this screen. + 8. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Account Information** | | | | +| | CIF Number | Transacted CIF Number If incoming transaction are not provided then lookup by Account/ Card which are provided. | Display | +| | Product Account No | Transacted Product Account Number and combination of Product Account Level and Product Account Type. If Incoming transaction are not provided then lookup by Card Number which is provided | Display | +| | Account Type | +| | Card number | Transacted Card Number | From incoming transaction | +| **Transaction Detail** | | | | +| | Invoice No | Unique Invocie No which generate by OLS system to determine unique incoming transaction. | Display | +| | Transaction Type | Transaction Type of CP rule AWD- Award RED- Redeem ADJ- Adjust | Display | +| | OLS Transaction Code | Transaction code which used to locate CP rule. | | +| | Transaction Date Time | Transaction Date and Time | Display as date time format. The date format must adhere to the configured format From incoming transaciton | +| | Transaction Amount | Transaction Gross Amount from incoming transaction for Award/Redeem transaction Adjust point for Adjustment transction | Display as number format 999,999,999.99 From incoming transaciton | +| | Corporate | Transaction corporate ID Lookup value from transaction store | Display | +| | Chain | Transaction chain ID Lookup value from transaction store | Display | +| | Store | Transaciton Store ID | Display From incoming transaciton | +| | Terminal | Transaction Terminal ID | Display From incoming transaciton | +| | Transaction MCC | Transaction MCC Id | Display From incoming transaciton | +| | Transaction Description | Transaction description | Display From incoming transaciton | +| | Currency Code | Currency code of the original transaction amount | Display From incoming transaciton | +| | Transaction Mode | Mode of transaction at point of payment | Display From incoming transaciton | +| | DCC indicator | DCC indicator From incoming transaciton If empty then mean for non -DCC transaction | Display | +| | Tap2Pay Indicator | Tap2Pay Indicator If empty then mean for transaction is not a Tap2Pay(token) transaction | Display | +| | Token Requestor ID | Token Requestor ID (mobile pay) 3rd party wallet providers (Apple Pay, Samsung Pay, Android Pay etc | From incoming transaciton | +| | Salary Credit | Salary Credit | From incoming transaction Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode | POS entry Mode | From incoming transaction | +| **CP Rule Listing** **Detail error description for each campaign Rule which incoming transaction trigger but do not hit this campaign Rule** | | | | +| | Campaign ID | Campain ID | Lookup value by Campaign Rule ID | +| | Campain Rule | Campaign Rule ID | Display | +| | Pool ID | The reward pool of campaign rule | Display Lookup value by Campaign Rule ID | +| | Error Code | Error response code from OLS | Display | +| | Error Descriptions | Error response description | Display | + +Post-condition + +* + - 1. User can adjust incoming transaciton to meet Campain Rule or explain to customer why they do not get reward. + +### Exception flow + +N/A + +## Statement + +### Requirement Definition + +* + 1. Statement Enquiry is a list of all transactions for a customer/ account over a set period, usually monthly. The statement includes earned, redeemed and adjusted, as well as the beginning and ending balance for the period, along with any interest earned. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +User would like to review/verify statement detail of customer. + +### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Statement Enquiry” modules under “Customer Mangement” Group in order to this screen. +2. User must select a customer in customer profile listing page to view customer profile and access the “Statement Enquiry” tab. + +### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +### Business rules + +* + 1. OLS statement output support Customer level and Account level, however statement records will be stored under Account level therefore Statement Enquiry show under Account level for both Statement Pool Entity level. + 2. Statement Enquiry includes all active statement records of statement pool. + 3. Statement records are updated by OLS batch jobs, so in administration functions (OA) only provides view in screens. There is no further actions. + 4. Click on Statement Enquiry tab to list all statement records of the customer as illustrated in the [wireframe](#_Wireframe_6). + 5. Click a listed record to display the details of the transaction as illustrated in the [wireframe](#_Wireframe_6). + 6. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Statement detail** | | | | +| | Loyalty Account Number | Loyalty Account Number | Display Lookup value from STATEMENT table | +| | Product Account Number | Product Account Number | Display Lookup value from PRODUCT_ACCOUNT table by ASN in Statement table. | +| | Account Type | Combination of Product Account Level and Product Account Type | +| | Pool ID | Statement Pool | Display Lookup value from STATEMENT table | +| | Cycle start date | Cycle start date time Provious statement cycle | +| | Statement Opening balance | Previous Statement Points Balance | +| | Total Award | Total earned points in this cycle | +| | Total Redeem | Total redemmed points in this cycle | +| | Total Adjust | Total Adjusted points in this cycle | +| | Statement Closing Blance | Accumualted points | +| | Expired points | Balance in expired buckets which have not yet been forfeited | +| | Last transaction Date | Last transaction post date on this cycle | +| | Cycle statement date | Cycle statement date time | +| **Transaction Detail** This part display all transaction of account/customer on each cycle. ![](data:image/png;base64...) Get data from TRANSACTION table where: * + 1. LA is LA of customer statement records. 2. Pool ID is statement pool 3. ASN is ASN of Account statement records. 4. Post date from Cycle Start Date upto Last Transaction Date 5. Without cancellation transaction 6. Points are not equal to 0 | | | | +| | Reference Number | OLS Reference Number | Display | +| | Transaction Type | Transaction Type of this transaction | Display Lookup value from Transaction table | +| | Unit | Earned/ Redeemed/Adjusted point Depended on transaction type Group by Reference No,Post Date,Transaction date and Txn type | +| | Post Date | Post Date time | +| | Transaction Date | Transaction Date Time | + +### Post – Condition + +N/A + +### Exception flow + +N/A + +## Attribute + +### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according attribute: + 1. Customer profile screen dislays customer information and Customer attribute lisitng. + 2. Account Detail screen dislays Account information and Account attribute of customer. + 3. Card detail screen displays Card information and Card attribute of customer. + 1. In new OLS version Attribute will be displayed on separately tab under Customer profile module. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + 1. User would like to review/ verify attribute detail of customer. + +### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Attribute” modules under “Customer Mangement” Group to able to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Attribute Enquiry" tab. + +### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +### Business rules + +* + - * 1. Get data from ATTRIBUTE_VALUE table. The attribute values inserted/update form OLS batch process (Attribute maintenance batchs or OMR batch job) OR can be updated by the Attribute maintenance batch as well as by Campaign Rules. + 2. This screen just display atribute value only. There is no further action. + 3. The Attributes listing screen is accessed from the Attribute Tab in the Customer profile module. Clicking on the Attributes Tab will bring up a listing of Attributes, as illustrated in the [wireframe](#_Wireframe_7). + 4. In this screen will display all attribute of customer including Customer attribute/Account attribute/ Card attribute. + 5. Clicking on the Attribute value row in listing page will bring up the attribute value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Attribute value detail field + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/Vn)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity ID and Effect date. | | | | +| | Entity /Thực thể | Optional field Including: Client/Product_Account/ Card If Client entity is selected then listing all customer attribute of customer. If Product_Account entity is selected then listing all account attribute of customer. If Card entity is selected then listing all card attribute of customer. If Entity is not provided then get all attribute of customer which under Customer/ Account/Card entity level | Drop-down Allow multiple select. Default as empty | +| 2. | Effective Date From /Ngày bắt đầu có hiệu lực | Mandatory Listing attribute value during selected date frame. | Date time | +| 3. | Effective Date To/Ngày kết thúc hiệu lực | +| | Only effective records listed/Chỉ hiển thị các giá trị thực thể có hiệu lực | Use processing date to compare with attribute value effective date. If selected then only effective records listed If non-select then all attribute record including expired attribute value records listed | Check box Default as selected | +| **Attribute value detail field / Thông tin chi tiết thuộc tính** | | | | +| | Attribute Group/Nhóm thuộc tính | Attribute group of attribute | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Attribute ID/ID thuộc tính | Attribute ID | Display Lookup value from ATTRIBUTE_VALUE table | +| | Attribute Name / Tên thuộc tíng | Attribute Name | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity / Thực thể | Entity level of attribute Indicates the Entity to which this Attribute belongs Client: Customer Product_Account : Account Card: Card | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity ID/ ID thực thể | The identifier for the Entity to which the Attribute value in this record belongs. If Entity is : • “Product_Account”, this field contains the PA Number • “Card”, this field contains the Card Number • “Client”, this field contains the CIF Number * “Store”, this field contains the Store ID * ……etc…. | Entity value will be : * + 1. CSN for customer attribute. 2. ASN for account attribute 3. PSN for Card attribute. Use Entity and Entity_ID of attribute for lookup according value: | +| | Account Type/ Loại tài khoản | Combinaiton of Product Account Level and Product Account Type of Account attribute. Present for Account attribute only | Display Lookup value from PRODUCT_ACCOUNT table | +| | Attribute value /Giá trị thuộc tính | Attribute value | Display Lookup value from ATTRIBUTE_VALUE table | +| | Effective Date From/ Ngày bắt đầu có hiệu lực | Start date of the effective period for the Attribute value | +| | Effective Date To/Ngày kết thúc hiệu lực | End date of the effective period for the Attribute value | +| **List of Campaign/Danh sách chiến dịch** **This appear when user click to view detail of any record** ![](data:image/png;base64...) | | | | +| | Campaign ID/ID chiến dịch | Campaign ID which reference to Campaign Rule | Display Lookup value from “Campaign Rule screen” | +| | Campaign Name | Name of Campaign | Display Refer to “Campaign “ API under Campaign Management Lookup value from “Campaign” table. | +| | Campaign Rule | Campaign Rules which reference to this attribute | Display Lookup value from “Campaign Rule” screen to list all campaign rules which includes this attribute on at least following items: * + 1. Attribute Criteria 2. Formula 8 3. Formula 7 4. Award limit | +| | Campaign Rule Name | Name of Campaign rule | Display Lookup value from “Campaign_Rule” tablle Refer “Campaign Rule” API under Campaign Management | +| | Effect date | The Effect date of Campaign Rule Dislay both Effective from date and effective to dat e | Display The date format must adhere to the configured format | + +### Post-condition + +N/A + +### Exception flow + +N/A + +## Counter + +### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according Counter: + - Customer profile screen dislays customer information and customer -level counter listing + - Account Detail screen dislays Account information and account -level counter of customer. + - Card detail screen displays Card information and card -level counter of customer. + 1. In new OLS version Counter will be displayed on separately tab under Customer profile module. + +### Process flow + +### Trigger + +* + 1. Users would like to review and verify the counter detail of the customer. + +### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Counter” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Counter " tab. + +### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Record detail + 1. Record detail view + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +### Business rules + +* + - * 1. Get data from the table that updates the counter value (Campaign_Counter table). The counter values are inserted/updated from the OLS batch process that triggers the Campaign Rules as well as the OA screen. + 2. This screen just displays counnter value only. There is no further action. + 3. The Counter Detail listing screen is accessed from the Counter Tab in the Customer profile module. Clicking on the Counter Tab will bring up a listing of the counter, as illustrated in the [wireframe](#_Wireframe_8). + 4. In this screen will display all counter bucket for the chosen customer, including Customer-level counter/Account -level counter/ Card- level counter. + 5. Clicking on the Counter value row in listing page will bring up the counter value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Counter value detail field: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity level and Counter bucket period | | | | +| | Entity /Thực thể | Optional field Including: **Customer [CU]/ Account [PA] /Card [CA].** If “Customer[CU]“ is selected then listing all customer -level counter of customer. If “Account [PA]” is selected then listing all account- level counter of customer. If “Card [CA]”is selected then listing all card -level counter of customer. If Entity level is not provided then get all counter level of customer which under Customer/ Account/Card entity level. | Drop-down Allow multiple select. Default as empty | +| 2. | Bucket Start Date / Ngày bắt đầu | Mandatory Listing counter value during selected date frame. | Date | +| 3. | Bucket End Date/ | +| | Only effective records listed/Chỉ hiện thị counter hiện tại | Use processing date to compare with counter bucket period. If selected then only effective records listed. Use processing date to determine the effective of the counter bucket. If non-select then all counter value record including expired counter records listed | Check box Default as selected | +| **Counter value detail field** | | | | +| | Counter/Bộ đếm | Counter | Display | +| | Entity /Cấp bộ đếm | Entity counter level Cust- CU Account – PA Card – CA | Display | +| | Entity ID/ID thực thể | The identifier for the Entity to which the counter value in this record belongs. If Entity is : • “Account”, this field contains the Account Number • “Card”, this field contains the Card Number • “Customer”, this field contains the CIF Number | Display | +| | What to count/ Tiêu chí đếm | The data entity that is to be counted or tracked | Display | +| | Counter Value/Giá trị bộ đếm | Counter value | Display as number format | +| | Bucket start date | Start date of the bucket period for the Counter value | Display as date format | +| | Bucket end date | End date of the bucket period for the Counter value | Display as date format | +| | Counter state/Tình trạng bộ đếm | Counter state A: Awared C: New | Display Show state code only | +| **Counter Statistic / Tổng hợp bộ đếm** ![](data:image/png;base64...) **This part will list the details of the counter history statistics for the chosen counter bucket in the listing page** | | | | +| | Reference No/ Số tham chiếu giao dịch | OLS Transaction Reference Number | Display | +| | Post Date /Ngày đăng | The post date of the transaction | Dipslay as date time format The date format must adhere to the configured format | +| | Counter Value/Giá trị bộ đếm | Counter value which is updated on this transaction | Display as number format | +| | Bucket Number/Số bộ đếm | The bucket number of selected counter | Display as interger number format | +| | Update Date | The system date when counter value is updated | Dipslay as date time format The date format must adhere to the configured format | +| | Updated by | The batch/User who post the transaction that make counter value is changed. | Display | + +### Post-condition + +N/A + +### Exception flow + +N/A + +## Adjustment + +### Requirement Definition + +1. Adjustment transactions can be manually posted through the Customer Management module in the administration screen function under. +2. This screen display all manually adjustment transaction of customer. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + 1. User would like to review/ verify manually adjustment transaction of customer. + 2. There is some wrong in balance of customer then user have to manually adjust via OA screen. + +### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Adjustment Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Adjusment Entry" tab +3. Depending on the user’s access rights, they can view/edit/add or approve manually Adjustment transaction records. + +### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Active record + +Record detail + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +1. Create/Edit form + +Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - After selected/inputted card/Account/CIF click to quick view icon to see right panel information + +![](data:image/png;base64...) + +### Business rules + +1. While under “Transaction Management” module in the administration screen function, manually adjustment transaction can be posted for any customer then in “Customer management”module manually adjustment transaction can be posted for selected customer only. +2. Click on the Adjustment Entry tab in the “Customer Profile “sreen to bring up the screen for accessing the Adjustment Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_9). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Adjustment Entry screen is illustrated in the [wireframe](#_Wireframe_9). +4. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +5. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen desscriptions + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | **Desscription** | **Data type** | | +| **Adjustment detail** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: CIF number/ Account / Card must be provided | Radio button Default posted by Card Look up value from master data | | +| | | | Under Customer management module | Under Transaction Management module | +| | Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Customer” API under Customer Management | +| | Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. Refer “==tbd== “ API | Drop-down Select one List all account level in the OLS system. Refer “Product Account Level” API under Code Maintenance service | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. Refer “==tbd== “ API | Drop-down Select one List all account type in the OLS system by selected Account level. Refer “Product Account Type” API under Code Maintenance service | +| | Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer Refer “Account “ API under Customer Management service | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Product Account” API under Customer Management. | +| | CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. Refer “Customer Profile” API under Customer Management. | +| | Quick view/Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF is invalid.t With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink/Icon | | +| | Adjustment Quantity is +ve/-ve \*/ Điều chỉnh âm/dương | Indicates whether the adjustment is a positive adjustment or a negative adjustment | Drop-down Select one Lookup value from “Code_Management” table Refer “list-by-code-type” API with code type is “adj-type” | | +| | Store \*/Đơn vị/Cửa hàng | The store of transaciton | Drop-down Select one Lookup active Store record from “Store” screen Refer “Store” API under Merchant Managemant. | | +| | Pool Id \*/Mã pool | The pool to be adjusted Should respect pool entity level For example: Cant posted txn by Account if pool to be adjusted is card- entity level pool. | Drop-down Select one | | +| | Transaction Date\*/Ngày giao dịch | Transaction date | Time picker within time also DD-MM-YYYYY HH:MM:SSS Allow user input from keybroad | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been adjusted. Present for postive adjustment only Show the balance bucket based on transaciton Date and expire policy of adjusted pool. When update transaction date / Card number (Account /CIF) OR Pool then this value should be automation updated. Allow user modify this value | Time picker without time DD-MM-YYYY Allow user input from keybroad | | +| | Bucket Expiry Date/ … | This is the expiry date of the bucket will be deduct poitn. Present for negative adjustment only If not selected then follow by TP processing for Redemption/Negative adjustment approach. If selected then just adjust on the selected bucket. | Drop-down Select one Loopkup value from customer balance based on adjusted pool/selected card. | | +| | Adjustment Quantiy \* /Số lượng điều chỉnh | The pool units by which to adjust the pool balance. | 9(12,2) Should be greater than 0 if provided | | +| | Reason Code \*/Mã lí do điều chỉnh | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the adjustment. | Drop-down Lookup value from Reason Code screen | | +| | Transaction Code \*/Mã giao dịch | OLS transaciton code of transaction | Drop- down Lookup value from OLS Transaction Code screen | | +| | Remarks/Ghi chú | A description of the adjustment. | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** ![](data:image/png;base64...) The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | + +* + - 1. Edit Action just be applied for Pending/Rejected record. + 2. For Active Record just view only. + 3. After the transaction has been saved, it is put in the pending tab. + 4. An authorised user has to retrieve the transaction and approve it before it is processed and pool is updated: + +**Based on entity level/account selection alog** + +* 1. For postive adjustment transaction then: + + If have negative balance bucket then adjusted point used to offset negative balance bucket to 0 first. + + The remaining points will be added for selected bucket. + 2. For negative adjustment transaction then: + +![](data:image/png;base64...) + +* + - 1. Approved transaction is putted in the active tab. + +### Post-condition + +* + - Pool balance buckets are updated. + - Transaciton is posted and viewable on the transaction history screen. + +### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + +## Transfer balance + +### Requirement Definition + +1. Transfer balance transactions can be manually posted through the Customer Management module in the administration screen function under. +2. Change in UI/UX and change to support both user can transfer balance from their account to other customer or transfer between its own self. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + 1. The user would like to review/verify the manually transferred points from a customer to another customer or between the customer's own accounts/cards. + +### Pre-Condition + +1. User have to have the access rights in both “Customer Profile” and “Transfer Balance” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Transfer Balance" tab. +3. Depending on the user’s access rights, they can view/add/Edit or Approve manually transfer points transaction records. + +### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. View detail form + +![](data:image/png;base64...) + +* + - 1. Create/Edit form + +![](data:image/png;base64...) + +### Business Rules + +1. Click on the “Transfer Balances” tab in the “Customer Profile “screen to bring up the screen for accessing the Transfer Points listing page. The detail is illustrated in the [wireframe](#_Wireframe_10). +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the Transfer Balance screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that the Edit icon (!) and Delete icon just display for pending and rejected records only. +4. The point transfer function will transfer all pools linked directly from the “From” to the “To”. +5. Expiry Dates will be preserved unless a specific date is provided. +6. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. F**orm descriptions:** + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| | Transfer mode \*/ Phương thức điều chuyển | Use transfer mode to determine the relationship between from transfer source and the transfer destination. Check on the “Internal” mode to transfer balances itself. Check on the “External” mode to transfer the balance from a customer to another customer in the OLS system. Use Application Parameter to allow/disallow transfer mode: Apply both or only Internal or only external | Radio button Default “Internal” transfer Lookup value from “Code_Management” table where code type is ‘transfer-mode’. Refer “list-by-code-type” API under Master Data. | +| | Transfer Type\*/Loại điều chuyển | Condition field Depend on Transfer Mode to disable/enable as follows: Note: “X” stands for enable | | | | | | --- | --- | --- | --- | | **Transfer mode** | **Transfer Type disable/enable** | | | | **Card** | **Account** | **Client** | | Internal | X | X | | | External | X | X | x | | Radio button Default “Card”. Lookup value from “Code_Management” table where code type is ‘entity-lvl’. Refer “list-by-code-type” API under Master Data. | +| | From \*/Từ | A card/Account/CIF number must be present which depends on the transfer mode. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account type of the selected source account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account level of the selected source account | Drop-down Select one | +| | Quick view/Xem nhanh | Click on each quick view icon to retrieve the available balances of the customer after entering/selecting the card number. The details will be displayed in the right panel. See more in the Quick view part Show an error message if the Requesting Card is invalid. With Edit/Create mode the system will expand/collapse on the same screen to user can see and continue input needed information but with View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon See more in Quick view part | Hyperlink | +| | To \*/Đến | Card /Account/CIF number must be present which depened on transfer mode. If Transfer Type is “Account” then Account type is present. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout type of selected destination Account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout level of selected destination Account | Drop-down Select one | +| | Pool ID\*/Mã pool | The pool from which to transfer Just show the pool of “From” balance buckets as following: X: Display | | | | | | --- | --- | --- | --- | | **Transfer Type** | **Pool balance bucket of “From” Customer.** | | | | **Pool Level Card** | **Pool level Account** | **Pool Level cust** | | Card | X Display distinct Card- entity Pool of balance bucket of Inputed card only | X Display distinct account -entity Pool of balance bucket of Account of Inputed card | X Display distinct customer -entity pool of balance bucket of customer of inputed card | | Account | | X Display distinct account- entity Pool of balance bucket of inputed account only | X Display distinct customer- eintiy pool of balance bucket of customer of inputed account | | Client | | | X Display distinct customer-entity pool of balance bucket of inputed CIF Number | | Drop- down Based on Transfer Type and “From” to lookup pool from LAB and Pool Definition table. | +| | Store\*/Cửa hàng-Đơn vị | The store which transaciton is logged | Drop -down Lookup value from Store screen- Store table. Refer “Store” API under Merchant Management | +| | Amount to Transfer \*/Mức điều chuyển | The amount to transfer. Defaults to the whole pool balance. | 9(14,2) Should be greater than 0 if provided | +| | Expiry Date (after transfer)/Ngày hết hạn | The expiry date of the points after the transfer. By default the expiry date will be the source expiry date. | Date time | +| | Transaction Code\*/Mã giao dịch | OLS transaction code which transaction is logged | Drop -down Lookup value from OLS TC screen. Refer “OLS Transaction Code” API under Campaign Management | +| | Reason Code \*/Mã lí do điều chuyển | Select from a list of pre-defined codes to identify the reason for the transfer | Drop-down Lookup value from Reason Code screen (Reason_Code table). Refer “Reason Code” API under Code Maintenance | +| | Remarks/Ghi chú | Remarks to be appended to the transaction, for reference | Text box X(100) | +| **Bucket Balance Detail view of Source** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | +| **Bucket Balance Detail view of Destination** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. OLS will validate the status permission and block code permission for both “From” and “To”, the transfer transaction will be rejected if any permission disallowed to perform adjustment. +4. Transfer transaction will be rejected if Pool balance of “From” is insufficient. +5. The Approved transfer transaction is logged as Adjustment transactions and following by TP processing: + 1. Each bucket in the “From” is transferred as a negative adjustment to the “From” and logged as a positive Adjustment to the “To”. + 2. The Reason Code will be selected from a list of Adjustment Reason codes. + 3. The Adjustment Reason Code is important for determining the GL posting accounts. + +### Post-conditions + +* + 1. Pool balance buckets are updated. + +### Exception flow + +* + 1. Pool balance of “From” is insufficent. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 3. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Re-instatement + +### Requirement Definition + +1. This screen is used to re-instatement for expired balance bucket which have not been forfeited. +2. If balance have been forfeited, then “re-instatement” does not apply and an adjustment transaction should be used to return points to the customer. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + - 1. User want to review/verify Re-Instatement transaction + 2. User want to re-instate expired bucket. + +### Pre-Condition + +1. User have to have access righsts in s both “Customer Profile” and “Re-Instatement” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Re-Instatement" tab. +3. Customers have pool expired bucket which have not been forfeited. +4. Depending on the user's access rights, they can view, add, edit, or approve manually Re-Instatement Transaction records. + +### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +### Business rules + +1. Click on the “Re-Instatement” tab in the “Customer Profile “sreen to bring up the screen for accessing the Re-Instatement listing page. The detail as illustrated in the [wireframe](#_Wireframe_11). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_11). +3. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +2. Form description: + +| **Seq** | **Field** | **Description** | **Data type** | | +| --- | --- | --- | --- | --- | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | +| | | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available/expired balances of the customer after entering the customer information. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF are invalid. With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | +| | Store \*/Cửa hàng_Đơn vị | Store | Drop -down Select one | | +| | Pool Id \*/Mã pool | The pool to be adjusted. The pool of the bucket to Re-instate. Just list the pool have balance which has already expired, but are still within the grace period (haven’t forfeited), while respecting the pool entity-level based on transfer mode. E.g Use account to re-instate then cant select card pool entity-level | Drop-down Select one | | +| | Bucket to Re-instate \*/Số lô cần gia hạn | The drop-down displays the expired buckets of the selected pool which have not been forfeited The bucket to be re-instated must be selected individually and the new expiry date must be provided in the “Expiry Date” field. | Drop-down Select one Lookup value based on LAB table. | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been re-instated. | Date The date format must adhere to the configured format | | +| | Reason Code \*/Mã lí do | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the re-instatement. | Drop-down Select one Lookup value from Reason Code screen with Reason type is Re-instatement Refer “Reason Code” API under Code Maintenance | | +| | Remarks/Ghi chú | Additional remarks on the re-instatement. | X(100) | | +| Quick View Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card. | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. The re-instatement will be posted as an Adjustment, with the Reason Code set to the selection. +4. The balance in the expired buckets will be set to 0. +5. If the bucket with the required expiry date exists, the adjustment amount will be added to the bucket. +6. Otherwise, a new bucket with the new expiry date as entered in the Re-instatement edit form is created with the balance from the expired bucket. + +### Post-condition + +### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Item Redemption + +### Requirement Definition + +1. Customers call the customer service (call center) and requests to redeem an item, giving identification and item code. +2. Item redemption requests are processed against the catalogue item set-up parameters. The details are described against the relevant parameter in the catalogue item set-up description in section 7. +3. All redemptions are in real-time. +4. Redemption through administration screens that requires approval is real-time only at time of approval. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + - 1. Users use this screen to assist customers in exchanging points for items. + 2. Users want to review and verify the redemption item transaction details of customers, which includes all online transactions via the OA screen or M as well. + +### Pre-Condition + +1. Users have to have access rights in both “Customer Profile” and “Item Redemption Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer to access the “Item Redemption Entry” tab. +3. Depending on the user's access rights, they can view, add, edit, or approve manually Item Redemption Transaction records. + +### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +Click on each item to bring up item detail view + +![](data:image/png;base64...) + +* 1. **Create** + +**Step 1: Add General information** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Physical /Evoucher item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Miles item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add cash rebate item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add other items** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +### Business rules + +1. Click on the “Item Redemption Entry” tab in the “Customer Profile “screen to bring up the screen for accessing the Item Redemption Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_12). +3. User can’t modify transaction after transaction is posted. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | | +| --- | --- | --- | --- | --- | +| **Seq** | **Field** | **Description** | **Data type** | | +| **General information** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from master data | | +| | Condition fileds as following descriptions | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any card belonging to the customer can be used for making a redemption Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of the choosen customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the choosen customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (Balance Detail or Buket Balance Detail View Or Expired Balance View) to retrieve the available balances of the customer after entering the card number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card invalid. | Hyper link | | +| | Redemption Channel \*/Kênh đổi thưởng | Redemption Channel | Drop-down Select one Lookup value from master data | | +| | Redemption Date \*/Ngày đổi thưởng | The redemption transaction date | Date time Date time format must respect the date configuration format | | +| | Store\*/Đơn vị | The drop-down list to select any acitive Store in the OLS. Redemption Transaciton will be logged under this store. | Drop -down Select one | | +| | Appliable Fee/ Áp dụng phí | The fee will be applicable for this transaction if item has a fee See more about fee on Item price section. | Switch button Default OFF | | +| **Item details** | | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The drop-down to select the effected catalog | Drop – down Select one Use Redemption Date to determine effected catalogue. | | +| | Item\*/Vật phẩm | The drop-down to select the item code to be redeemed. The item must belong to the selected catalogue. Display an error message if item has no matched price. | Drop-down Select one Use Redemption Date and selected catalogue to determine effected item. From selected item and inputed data to determine price of the item. Please refer Item price to get more detail | | +| | Redemption Mode\*/Loại đổi thưởng | A drop-down list with the following choices: * Fixed Partial (Cash + Points) * Fixed Points If Price configuration did not allow Partial Redeem then just Fixed Partial is disable. If Price configuration allow “Partial Redemption” mode then both mode are enable. | Radio button Defaut fixed points Look up value from master data | | +| | Unit Price \*/Giá mỗi đơn vị | Point required **For Fixed points Mode then this is Price in point in item price configuration and user can’t change.** **For Fixed Partial Mode, the sytem must automation populate than “Minimum Partial Redeem Points” in item price configuration and user can modify this value but Unit Price must be equal to or greater than “Minimum Partial Redeem Points”.** | 9(12,2) | | +| | Unit Cash Amount required./Tiền phải trả mỗi đơn vị | Condition field This field is only active and required Fixed Partial mode only. The system must automation populate as: ( **Full Price in Point – Unit Price** ) \* **Price in Cash (per point) ( from item Price Configuration)** | Display | | +| | Unit Face value/Giá trị mỗi đơn vị | Condition field Active only when this item required face value on the configruration **Get face value from Item price cofiguration with higher priority. Otherwise this is base face value from item master.** | Display as 9(14,2) format | | +| | Quantity on hand/Số lượng còn lại | Available item can be redeemed. Just display if the item is tracked by quantity. | Display as 9(9) format | | +| | Redemption Quantity\*/Số lượng đổi thưởng | Redemption quantity If the item is tracked by quantity, then the redemption quantity must not be greater than the quantity on hand. Don’t allow to redeem if redemption quantity is greater than quantity on hand | 9(5) Should be greater than 0 if provided | | +| | Total price\*/Tổng cộng | **The system must automation populate as Unit Price \* redemption quantity** | Display | | +| | Total Cash amount required/Tổng tiền phải trả | Condition field This field is only active and required Fixed Partial mode only. **The system must automation populate as** **Unit Cash Amount required\* Quantity.** | Display | | +| | Total face value/ Tổng giá trị | Condition field. Active only when this item required face value on the configruration **The system must automation populate as** **Unit Face value \* redemption quantity** | Display as 9(14,2) format | | +| | FFP Ship number/ Mã số thẻ | FFP ship number | X(50) Condition fields Display and required for Miles items and should be configurable. Automation populate value from Attribute value based on configuration attribute ID and allow user modify this one. These fields to be used to send to partner. | | +| | FFP First Name/Tên | FFP First Name | +| | FFP last name /Họ | FFP last name | +| | Delivery Address/Địa chỉ | Delivery Address 1 Condition field Only active for Evoucher item and Physical item Auto populate from customer’s address 1 and allow user modify. | X(100) | | +| | Zip code/Mã bưu điện | Zip code Condition field Only active for Evoucher item and Physical item. Auto populate from customer’s Zip code and allow user modify. | Drop-down Select one | | +| | Recipient Name/Người nhận | Recipient Name Condition field Only active and required for Evoucher item and Physical item. Auto populate from customer’s Full Name and allow user modify. | X(50) | | +| | Email adress /Địa chỉ email | Email address Auto populate from customer’s email and allow user modify. | X(50) | | +| | Mobile Phone/Số điện thoại | Mobile Auto populate from customer’s email and allow user modify. | X(50) | | +| | Remark/ Ghi chú | Additional remarks on the item redemption transaction | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | +| Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card/Account/Customer | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card os present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +### Post-condition + +* + 1. Transactions are logged into the related table in the database. The transaction listing includes not only transaction which to be posted under the OA but also transaction to be posted from the member site. + 2. Balance are updated. Quantity on hand are updated if transaction is posted successfully in the system. + 3. The net transaction of the redemption transaction is the sum of the tax amount, total fee, and total cash required. + 4. At the end of day (EOD), all approved items include are output in a OLS output file to be sent to parnter to be tracking or created back to the account/customer used in the item redemption, etc. + 5. TP process to approve Transaction + +![](data:image/x-emf;base64...) + +### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation… + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Award Transaction + +### Requirement Definition + +### Process flow + +Process follow for award transaction (Award service on TP side: ) + +![](data:image/png;base64...) + +### Trigger + +### Pre-condition + +### Wireframe + +* + - 1. Create /Edit + +![](data:image/png;base64...) + +### Business Rules + +1. Click on the “Award Transaction” tab in the “Customer Profile” screen to bring up the screen for accessing the Award Transaction Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Descriptions** | **Data type and data source** | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | | +| | Condition fileds as following descriptions | | Under Customer profile | | Under Transaction Management | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Account number to find card. | | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | | +| | Quick view | Click on each quick view icon “Balance” to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | | +| | Transaction Code\* /Mã giao dịch | OLS Transaction Code This TC is used to locate the Campaign Rule to use for processing. | Drop-down Select one Lookup value from “Transaction_Code” table. Refer “OLS Transaction Code” API under Campagin Management | | | +| | Transaction Date \*/Ngày giao dịch | Must be valid date. Transaction rejected if not valid. Transaction rejected if this date is older than sysdatetime by N days, where N is a system setting. | Date time | | | +| | Source Reference Number/Số giao dịch gốc | Source Transaction Reference Number Unique transaction identifier from source system | X(20) | | | +| | Store\*/Đơn vị/Cửa hàng | Transaction Store Id | Drop-down Select one Lookup value from “Store” table Refer “Store” API under merchant management | | | +| | Terminal /Thiết bị đầu cuối | Transaction Terminal Id | Drop-down Select one Lookup value from “Terminal” table Refer “Terminal” API under merchant management | | | +| | Transaction Amount\*/ Giá trị giao dịch | Transaction Gross amount Note: It is dependent on each project, Lets it be gross transaction amount first. | 9(14,2) Should be greater than 0 if provided | | | +| | Transaction Description/ Mô tả giao dịch | Shopname from Source system or OLS transaction description | X(100) | | | +| | Transaction Currency Code/ Mã tiền tệ giao dịch | It can be anpha code or number code. Let’s it be anpha code first | Drop-down Select one Lookup data from “Currency_code” table Refer “Currency Code” API under Code Maintenance | | | +| | Transaction Mode/Phương thức giao dịch | Mode of transaction at point of payment | Radio button Lookup value from “Code_Management” table where code type is “txn-mode’. Refer “get-by-code-type” API under master data | | | +| | POS Entry Mode/Phương thức thiết bị bán hàng | POS Entry Mode | X(04) This field is subdivided as follows: 0 – Unknow , 1- Manual (key entered) 3- Bar code ---Etc | | | +| | MCC code/Mã MCC | Merchant category code | Drop-down Select one Lookup value from “MCC” table Refer “MCC” API under merchant management | | | +| | Country Code/Mã quốc gia | Country code | Drop-down Select one Lookup value from “Country_Code” table Refer “country code”API under Code Maintenance | | | +| | Salary Crediting Indicator/ Tài khoản nhận lương | Indicates bundled deposit account is receiving regular salary credits | Switch button Default OFF | | | +| | Transaction Channel/Kênh giao dịch | Transaction channel | Drop-down Select one Lookup value “Code_Management” table where type code is “txn-channel” Refer “get-by-code-type” API under master data | | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buck Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | | + +### Post-Codition + +Refer Process flow to get more detail for post-conditon when transaction is approved. + +### Exception -flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation. + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +# OneMarketing + +## Overview + +OneMarketing Module includes 2 function modules: + +* **Marketing Message:** Manage (CRUD features) all message templates that are used in the system. +* **OneMarketing Request (OMR):** Filter the target customers who satisfy the set-up-criteria to send messages or get reward transactions. +* **A/Bn Testing:** to compare at least two versions of a SMS, email, or other marketing elements to determine which one performs better. +* **Frequency Capping:** The function to practice of controlling the frequency and volume of notifications or channel delivered to customers to avoid overwhelming them +* **Blacklist:** A list of customer who will be blocked for reward/promotion notification from a business. +* **Whitelist:** A list of customer who has given their consent to receive specifc types of marketing message from business. + +## Marketing message + +### Requirement definition + +1. The marketing message module is used to define a communication message that will be sent to the target list. +2. A Message Template can be built based on a message with pre-defined parameters or HTML file. +3. User can build different messages for different marketing channels (e.g: SMS / Notification Push/ Email/ OTT …). + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +N/A + +### Pre-conditions + +1. Users have to have access rights in “Marketing Message” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually message template. +3. Assume that all OMR criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +### Wireframe + +* + - 1. Message summary listing page + +![](data:image/png;base64...) + +* + - 1. Filter + +![](data:image/png;base64...) + +* + - 1. SMS + +1. Create SMS + +**Step1 : Choose message chanel : SMS and choose create new or re-use existing message template** + +![](data:image/png;base64...) + +**Step 2: Step up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up message content** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Finish by save.** + +1. SMS detail view + +![](data:image/png;base64...) + +* + - 1. **Email** + +1. Create Email message + +**Step 1: Choose message chanel : Email and choose create new or re-use existing Email template** + +![](data:image/png;base64...) + +**Step 2: Set up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up “Sender information”** + +![](data:image/png;base64...) + +**Step 4: Setup Email content** + +![](data:image/png;base64...) + +**Upload email template** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. **Push notification** + +Create Push notification message + +**Step 1: Choose message chanel : Push and choose create new or re-use existing Push template** + +![](data:image/png;base64...) + +**Step 2: Update “Generate information”** + +![](data:image/png;base64...) + +**Step 3.1: Message content configuration for “Richer push”** + +![](data:image/png;base64...) + +**Step 3.2: Message content for “Carousel push”** + +![](data:image/png;base64...) + +**View mode** + +![](data:image/png;base64...) + +### Business Rules + +1. OLS system can send a message to target customer through a notification on the app, an email, an SMS, and so on. These varied media used for message delivery are known as “channels”. +2. In this version, OLS support to user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. Just enter the email adress or phone number user wish to check the message preview. +3. Besides, OLS support to user can setup message template to re-use in the furture. +4. Click on the “Marketing Message” in Main icon to bring up the screen for accessing the Markting Message listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for marketing message screen is illustrated in the [wireframe](#_Wireframe_10). +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Create /Edit mode** | | | | +| **SMS message** | | | | +| | **Step 1: General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | SMS Type | Drop-down to select SMS type: Promotion/Marketing Transaction | Check box type Select one value only Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date Date time format must respect the date configuration format | +| | Effective End Date \* | The end date of the effective period of the message | Date Date time format must respect the date configuration format | +| | **Step 2: SMS Content Configuration** | | | +| | SMS Brand Name \* | Drop -down to select SMS Sender | Drop-down Lookup value from master data | +| | Message \* | The message content of the SMS. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. SMS message don’t support : 1. Images 1. A subject line 2. Attachments **SMS messages are written in Unicode (non –GSM standard). Standard single message or multi-part message are credited based on the message content.** | X(5000) | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Preview | The message will be automation displayed in the preview part. | Displaya | +| | The number of characters in the message\* | This value will be automatically upadated when the user update the message content. | Display as number format | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a phone number is dispalyed 2. When user click on “Send sample” a confirm message is display. It use to user confirm that the system will send a testing message into inputed phone number. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a sms message into inputed phone number. 3. Mobile phone number should be required when user click on” Send sample”. If not found should reject with error message | Button | +| **Email message** | | | | +| | **Step 1 : General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Email Type | Drop-down to select Email type: **Promotion/Marketing** **Transaction** | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. Lookup value from master data | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format | +| | Use type \* | 2 options to config email message : * + 1. Use messge. 2. Upload template. | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | **Step 2: Sender information** | | | +| | Sender Name\* | The name of sender | X(100) | +| | From email\* | The email addess used to send email to target customer | Display This email is configured. | +| | Subject\* | Subject of email | X(100) | +| | Preview Text | Preheader of Email Preheader can help user connect with customer and increase customer’s open rate. If Prejeader is not provided then the first line of email content will be display instead | X(100) | +| **3.** | **Step 3: Email content figuration** | | | +| | Message | Conditon field The message content of the Email. If “Use message” is selected then this field is actived. System must allow to edit HTML format. The system should support to generate into text format. System must allow to put image/url… as message content. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. | Character | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Upload file | This filed is actived when “Use template” is selected. ![](data:image/png;base64...) Allow users to drag and drop an HTML template file, or they can choose a file from their computer to upload it into the system. After uploading, the system displays message content based on the uploaded file and allows the user to review and make modifications. | Button | +| | Re-Upload | Use this button to re-upload the email template. | Button | +| | Preview the email | The message will be automation displayed in the preview part. Sender / Subject and Preheader will be displayed here. If Preheader is not provided then the first line of message will be display instead. | Display | +| | Send sample | This functions to support the user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter an email address. This entry should adhere to the email format field. 2. When click on “Send sample” a confirm button to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test email into inputed email address. 3. The email address should be required when user click on” Send sample”. If not found should reject with error message. | Button | +| **Notification Push** | | | | +| | **Step 1: General information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Notification Type | Drop-down to select Notification type: Promotion/Marketing Transaction | Check box Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format. | +| | **Step 2: Notification Content configuration** | | | +| | Message Title \* | The primary text that appears at the top of the notification | X(50) | +| | Message \* | The main content of the notification, providing additional information, context, or details related to the notification's purpose. The list of message parameters are included to be used. User can drop/drag message paramters into message. System must allow to put image/url as message content. | Text Area | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Image type\* | Drop- down to selcte image type: SingerEicheer push (No image ) Richer Push (one image) Carousel Push (One or more than one image) | Drop- down Select one only Lookup value “Code Management” table where type code is “image-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Upload Image | Condition field * + - 1. This field is not actived for Single Push 2. Image URL : Click on the Image URL field and type or paste the URL of the image 3. Upload: Drag/Drop image or click the uploaded from computer. If the Image type is 'Carousel Push,' then users can upload more than one image. The sequence sorting will be the same as the sequence displayed in the mobile app. Users can rearrange the images to adjust the sortinng. Image is required for “Richer push” and “Carousel Push”. | | +| | Preview the notification | The message will be automation displayed in the preview part: content/ image. Preview on IOS or Android | Display | +| | Link URL \* | Enter or paste the URL to which the user needs to navigate to. | X(100) | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a CIF Number. From CIF Number the system will locate device's registration token, a device group's notification key, or a single topic. 2. A confirm message to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test notification. 3. The token or key or something else which one the system used determine destination of the push message should be required when user click on” Send sample”. If not found should reject with error message. | Button | + +### Post -codition + +* + 1. All message which will be sent to target customer are availble to config on following modules : + ++ Marketing Request + ++ Campaign Rule + ++ Item master …. + +### Exception flow + +* + 1. Input data are not passed all validations and then the user choose cancel the action then use case ends in failure. + +## Marketing Campaign + +### Requirement Definition + +* + - 1. Marketing Campagin Module is used to filter out a list of target customers that satisfy the marketing criterions. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +N/A + +### Pre- Conditon + +1. Users have to have access rights in “Marketing Request” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. +3. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. +4. To send marketing messange when an envent is triggered (real time events or batch events + ) then : + 1. Pre-Defined Event: Define the action to indentify when event triggers: such as login/ Get balance detail view/ leave feedback on portal app. + 2. FE Events: APIs or services can be used to initiate the action and make a call to the backend (BE) to determine whether the event has been triggered; if so, the assigned message for this event should be sent. + 3. Batch job: marketing message can be automatically sent by the system via batch jobs. + +### Wireframe + +* + - * 1. Marketing request summary listing page + +![](data:image/png;base64...) + +1. Filter + +![](data:image/png;base64...) + +1. Create/Edit mode + 1. Step 1: General information + +![](data:image/png;base64...) + +* 1. Step 2: Run schedule + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Step 3: Targeting + +![](data:image/png;base64...) + +4. Detail view + +### Business Rule + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_12). +2. OLS system will use Query Builder to build query for marketing criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same request. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. Click on the “Marketing Request” in Main icon to bring up the screen for accessing the Marketing Request listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Marketing Request screen is illustrated in the [wireframe](#_Wireframe_12). +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: General Information** | | | | +| | Request ID \* | Unique identifier of the OneMarketing Request Not allow special characters | X(20) | +| | Description \* | Description of the OneMarketing Request | X(100) | +| | Effective Date From\* | The start date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Effective Date To \* | The end date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Marketing Function \* | * Including 2 main functions of OneMarketing Request: + Notification [N] - The message template set up at section [Marketing Message](#_Marketing_message) is sent to target customers + Triger Campain Rule [TCR] - A campaign is applied to add/redeem/adjust points to target customers based on Transaction Code. | Check box Allow to select only one value Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| **Step 2: Run schedule and message content** | | | | +| | Trigger method \* | Two methods to select when message will be sent to target customer: Schedule Event trigger | Radio button Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | Run Schedule \* | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Radio button Lookup value from “Code_Management” table where type code is ‘run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | One time | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\*: This field is only active and required when “One time” schedule is selected. This field is date format (Date time format must respect the date format configuration). This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 2. Request will occur only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n day at the selected time. | | +| | Weekly | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n weeks on selected day of the week and at the selected time | | +| | Monthly | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is selected on “Repeat on the” filed. This is multiple select field. - Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. - In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. - Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occurred every n year on the selected day and selected month. | Drop-down Select one | +| | Business Event | This filed is actived and requied when “Event trigger” method is selected. A drop-down list is used to select the event. When the event occurs, a request is triggered to send a message to the target customer. | Drop-down Multiple select. | +| | Message template\* | This filed is actived and required only when “Notification” marketing function is selected. | Drop-down Lookup value from martketing message screen. | +| | OLS Transaction Code | This filed is actived and required only when “Trigger Campaign Rule” marketing function is selected. | Drop-down Lookup value from OLS Transaction Code screen. Refer “OLS Transaction Code” API under Campaign Management | +| **Step 3: Targeting** **This step is used to config the conditions to get target customer.** | | | | +| | Trigger method \* | There are two options to setup targeting. * + - OMR Criteiria - Upload file | Radio button Lookup value from master data. | +| | **OMR Criteira is selected** | | | +| | ![](data:image/png;base64...) | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each request. The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| | **“Upload file” is selected** ![](data:image/png;base64...) | | | +| | Browse File | Allow users to drag and drop an upload file, or the user can choose a file from their computer to upload it into the system. Use the 'Upload file' option when users have a specific targeting list that they want to use for the campaign. | Button | + +* 1. “Save as draft” and “Save as template” feature are applied on this screen. + 2. **OMR batch job will trigger marketing request as following processing:** + +OMR job (OMR) just trigger effectived marketing requests based on Effective period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + +OMR creates notification messages to be sent to customers selected based on criteria configured by users in the step 3 -OMR criteria – e.g., to send an SMS message to customers whose birthday is due in the next N days. + +OMR can also be configured to trigger awarding batches generated by extracting transactions from Transaction log table. + +OMR can be configrured to trigger CP rule for the customer selected based on based on criteria configured by users in the step 3 -OMR criteria – e.g., to award 100 cash back to customers whose birthday in Tet holiday. + +OMR will stop send message when limit is reached. The limit based on frequency capping configurued by user in step 4- Frequency capping. + +| | | +| --- | --- | +| Batch id | OMR job ==tbd== | +| Description | Processes OneMarketing Requests (OMR) on the configured schedule | +| File Id | Nil | +| Input file | Nil | +| input staging table | ==TBD== | +| Tables read | Its depending in OMR criteria list which should be defined as an attribute for each criteira. == TBD==== | +| Tables updated | =TBD=== | +| Output staging table | Nil | +| Output file | Nil | +| Unwind job | ==TBD== | + +### Post – Condition + +* + - 1. Marketing content is sent to target customer or Target customer trigger CP rule. + +### Exception Flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +## Marketing Frequency Cap + +### Requirement Defintion + +* + - 1. By controlling frequency capping, business can provide a more personalized customer expirence. Beside, frequency capping can provide a high level overview of the need for a notification capping system and the expected benefits for the business and its customers. + 2. Business able to setup the daily, weekly, monthly capping per customer. + 3. The system should automaticly enforcement of notification caps across different communication channels. + +### Process flow + +### Trigger + +### Pre-condition + +1. Users have to have access rights in “Frequency Capping” module to able to access this screen. +2. Depending on user’s access right to user can modify the frequency capping of the marketing campaign. + +### Sktech + +* + - * 1. Listing page + +![](data:image/png;base64...) + +* + - * 1. Edit mode + +![](data:image/png;base64...) + +* + - * 1. View mode + +![](data:image/png;base64...) + +### Business Rule + +1. This step is used to set up a limit to the number of times a message has been sent to per uniquie customer on specific period. +2. This step is also used to setup a limit the number of message that a business allow to send to customer through specific message channel. +3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | Notification Channel/Kênh thông báo | The name of the notification channel | Display | +| | Effective Date From /Hiệu lực từ ngày | The start date of the cap | Display as date format. The display format should respect the configured format. | +| | Effective Date To/Hiệu lực tới ngày | The last effective date of the cap | +| | Frequency Cap/Giới hạn tần suất | The frequency cap on each channel. Each period unit is displayed as a separate record with the cap | Display | +| | Include White List/Bao gồm danh sách trắng | Whitelist who are excluded from the cap or not | Display | +| **Edit mode** | | | | +| | Frequency Cap Id\*/ Id giới hạn tần suất | The Record inditifier | X(10) | +| | Notification Channel\*/Kênh thông báo | Marketing Frequecny Capping identifier A drop-down to select one channel to apply the capping rules. A list incluse following channel: * + - SMS - Email - Push Notifications | Drop-down Select one | +| | Effective Date From \*/ Hiệu lực từ ngày | The start date of the effective period of the cap | Date The system should only have one effective cap applied on each channel at any given time | +| | Effective Date To\*/Hiệu lực tới ngày | The end date of the effective period of the cap | +| | **Frequency Cap/ Giới hạn tần suất** **Require at least one period unit** | | | +| | + Add Period Unit/ Thêm chu kì | Click to add new period unit to limit for chosen channel. | Button | +| | Capping Period \*/Chu kì | A drop-down to select the following period: * + 1. Daily: Maximum number of notifications per day. 2. Weekly: Maximum number of notifications per week 3. Monthly: Maximun number of notifications per month. | Drop-down Select one Each period should only be configured with one cap value at the same time. | +| | Maximum number \*/Số lần gửi thông báo tối đa | The maximum the number of times a message has been sent to per uniquie customer. | 9(12) | +| | Include Whitelist/Không bao gồm danh sách trắng | This option disallows/allows the white customer list allow to receive a higher notification than normal customer for spefic scenario. | Swith button Defaut OFF | +| | Customer list /Danh sách khách hàng | A drop-down to select the white customer list. This allows the system to recognize the white list customers and ignore the frequency capping rules. This is a condition filed and only active and required if the capping rules include the white customer list. | Drop – down Multiple select | +| | Description /Mô tả | The description of the capping. For refer only | X(100) | + +* 1. Frequency Capping are applied to all marketing campaigns in the system for customer level. + 2. The system should automaticallytrack the number of notifications a customer has received across all notification channels as well as the period unit. + 3. If the customer has reached the notification cap then the notification is not delivered to customer. + 4. The white list who are excluded from the frequency cap rules should be tracked also. + +### Post –condition + +### Exception flow + +## A/Bn Testing + +### Requirement Definition + +* + - 1. This function is used to evaluate and optimize various elements of the marketing program to improve customer engagement, retention, and overall performance. + 2. OLS support both A/Bn content testing and A/Bn target customer testing. + 3. For A/Bn content testing, one variation (content A) of the marketing request is sent to a subset of target customers, and one or more different variations (content sample B/ content sample n) are sent to the same subset of target customers. The goal is to identify which content in the marketing request yields the best results. + 4. Unlike A/B content testing, A/Bn target customer testing focuses solely on the target customers. In the same testing request, one variation is designated for 'target customer A,' while one or more variations are designated for 'target customer B' or 'target customer n.' The goal is to identify which OMR criteria in the marketing request will reach more customers. + +### Process flow + +![](data:image/x-emf;base64...) + +### Trigger + +N/A + +### Pre-Condition + +* + - * 1. For A/Bn messsage content testing, result testing must be provied from third-party to OLS can collect data and analyze result to introduce report which user can use to make decision which on is better. + 2. Users have to have access rights in “A/Bn Testing” module to able to access this screen. + 3. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + 4. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. + +### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +* 1. Filter + +![](data:image/png;base64...) + +* 1. Content marketing testing configuration + +**Step1: Choose testing type is “Content message testing”** + +![](data:image/png;base64...) + +Step 2: Setup general information + +![](data:image/png;base64...) + +Step 3: Choose target customer + +![](data:image/png;base64...) + +Step 4: Setup variant content message + +![](data:image/png;base64...) + +Step 5: Set up run schedule + +![](data:image/png;base64...) + +* 1. Target customer testing configuration + +Step 1: Choose “Target customer testing” + +![](data:image/png;base64...) + +Step 2: Set up general information + +![](data:image/png;base64...) + +Step 3: Setup variant target customer + +![](data:image/png;base64...) + +Step 4: Setup run schedule + +![](data:image/png;base64...) + +### Business rules + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wireframe. +2. OLS system will use Query Builder to build query for OMR criteria when user setup target customer. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. Click on the “A/Bn Testing” in Main icon to bring up the screen for accessing the A/Bn Testing listing page. The detail as illustrated in the [wireframe](#_Wireframe_16). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for A/B testing screen is illustrated in the [wireframe](#_Wireframe_16)s. +6. **Screen description:** + +**Create/Edit mode** + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | **Data type** | +| * + - * 1. **A/B message content testing** | | | | | +| **Step 1: Campaign information** | | | | | +| | | Campaign ID \* | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Message channel \* | SMS Email Push | Checkbox Allow to select only one value Lookup from master data. | +| **Step 2: Choose target customer** The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). | | | | | +| | ![](data:image/png;base64...) | | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | | Each criteria can be drag one more time on each request . The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| **Step 3: Set up varial content** ![](data:image/png;base64...) | | | | | +| | Variant A Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial A will be added here. | Tab | +| | Varial B Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial B will be added here. | | +| | Add | | Click to add to introduce new tab to create new content varial. System will automation populate varinant name as default and users can rename and should be unique value on one each campaign. | Button | +| **Step 4: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format . This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | +| **II: A/B target customer testing** | | | | | +| **Step 1: General information** | | | | | +| | Campaign ID \* | | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | Campaign Description | | Description of Marketing Campaign ID | X(100) | +| | Effective Date From | | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| **Step 2: Set up variant target customer** | | | | | +| | Variant A User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial A will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Varial B User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial B will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Add | | Click to add to introduce new tab to create new target customer varial. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). System will automation populate variant name as default and User can rename and should be unique value on one each campaign. | Button | +| **Step 3: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format. This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. * Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | + +**Content marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | OMR criteria | View as Rule criteria view mode for this part | Display | +| | Variant A | View as Message Template view mode for message content part | Tab | +| | Variant B | View as Message Template view mode for message content part | Tab | +| | Variant N | View as Message Template view mode for message content part | Tab | +| | Result | =TBD== It is depened on the third-party partner and the goal. We can want to see the total result on each content variation or detail result for each target customer on each content variation. | ==tbd== | + +**Targeting marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Variant A | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant B | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant N | View as Marketing request view mode for OMR criteria part. | Tab | +| | Result | One gird to view the customer list on each variation | | | | | | | --- | --- | --- | --- | --- | | **Variation** | **Total number of customers** | **Total Female customer** | **Total male customer** | **….** | | Variation A | 100 | 10 | 90 | | | Variation B | 150 | 100 | 50 | | | Variation n | 140 | 50 | 90 | | | ==tbd== **Which criteria should be summarized??** | + +* 1. **A/Bn batch job will trigger marketing request as following processing:** + 1. A/Bn testing job (ABn) just trigger effectived A/Bn testing requests based on effectived period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + 2. For content testing, ABn creates A/Bn message content selected based on the variation content configured by user. These message to be sent to the same customers selected based on criteria configured by users. E.g to send 3 promotion messages to customers whose birthday is due in the next N days. The result testing should be provied by parter so that OLS can provide the report to user can decide which content messge is better. + 3. Regarding to target customer testing, A/Bn locates the target customer based on criteria configured by users. User can verify the result testing after batch job is completed. + 4. For A/Bn SMS content testing, we can track click-through rates if SMS includes links or calls to action. By including unique links for different messages or recipients, we can measure how many people clicked on those links to interact with each content. From this result we can have the temporary open rate to user can decide which one is better. + 5. For A/Bn Email content testing, open rate = (Number of opens / Number of delivered emails)/100. Number of opens is provided by third-party or we have to send email is in HTML format, as tracking pixels work with HTML emails. The number of opens willl be is the number of times the tracking pixel was downloaded when recipients opened the email. + 6. ==tbd== + +### Post-condition + +### Exception flow + +## BlackList + +### Requirement Definition + +* + - 1. The business need to exclude specific customer or groups from marketing campaigns for strategic reasons, such as fraud customers. + 2. Ensuring marketing efforts are focused on the most relevant and engaged audience to improve efficiency and return on investment. + 3. A set of customer who will be blocked for reward/promotion notification from a business wil be pre-definiton in this module. + +### Process flow + +### Trigger + +* + - * 1. The customer who has fraud behaviors will need to be added into black list. + +### Pre-Condition + +* + - * 1. Users have to have access rights in “Black List” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +### Business rules + +Users are able to upload a list of customers who will be blocked from the marketing campaign by uploading a file into the system. + +Additionally, users are able to assign customers to the blacklist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this blacklist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the black list. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be blocked from the marketing campaign if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +### Post-condition + +The blacklist is stored and accessible to another module. + +### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +## Whitelist + +### Requirement Definition + +* + - 1. The business need to exclude a list of customers that are excluded from the standard frequency cap rules. + 2. The whitelist ensures your top customers continue receiving your marketing messages without limit. We can use the whitelist for testing and optimizing campaign purposes. We can aslo use the whitelist for user who have shown strong interest in your marketing campaigns. + +### Process flow + +### Trigger + +* + - * 1. A set of customers needs to be added to the whitelist to exlcuse them from the frequency cap rules. + +### Pre-Condition + +* + - * 1. Users have to have access rights in “Whitelist” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +### Business rules + +Users are able to upload a list of customers who will be excluded from the frequency cap rules by uploading a file into the system. + +Additionally, users are able to assign customers to the whitelist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this whitelist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the whitelist. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be excluded from the frequency cap rules if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +### Post-condition + +The whitelist is stored and accessible to another module. + +The whitelist is excludes from the frequency cap rules as default. If there is any cap rules should need to include the whitelist then the user should indicate those whitelist. + +### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +# OneCatalogue + +## About Redemption Item in OLS system + +### Overview + +1. The catalogue is used to set up items for online (web site, Mobile App) redemptions. +2. Redemption items such as Cash-back rebates, frequent flyer miles conversion and merchant vouchers can be set up in the redemption catalogue. +3. Front-end systems access the catalogue through web services to display available items. +4. Front-end systems accept user requests to redeem and send these requests to OLS for authorization (deduction of the relevant points) and to generate the fulfilment files for sending to designated recipient systems. +5. Catalogues are managed through the browser-based administration screens, which update the catalogue in real-time. Once “Approved” the item is available commencing on the Start Date. +6. Functions include adding catalogues to the system, adding items to catalogues, setting price rules and processing redemption requests from front-end systems. +7. OLS also provides an administration function for back-office staff to redeem items through the administration screens directly on behalf of customers. + +## Catalogue + +### Requirement Definition + +* + - 1. A Catalogue must be defined and all items to be included in the Catalogue must be tagged with the Catalogue code before customers access the items. + 2. A Catalogue code is tagged against each Item Master record. + 3. More than one Catalogue can be configured at the same time, but each Catalogue must have its own set of Item master records. + 4. Each Catalogue has a Start / End date range and items in the Catalogue will be picked for presentation to customer only if the current date falls in the Start / End date range for that Catalogue. + +### Process Flow + +==tbd== + +### Trigger + +* + - * 1. If an item is to be tagged to a Catalouge that has not yet been defined. + +### Pre-condition + +1. Users have to have access rights in “Catalogue” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve catalogue records. + +### Mockup + +![](data:image/png;base64...) + +### Business Rule + +1. Click on Catalouge icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Catalouge is illustrated in section 7.2.5. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin chung** | | | | +| | Catalogue Code \*/Mã nhóm danh mục | User-specified code identifying the catalogue. Used by front-end system when requesting for item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this catalogue. For user reference only. Default description which will be used in case there is no specific description for chosen language. | X(50) | +| | Effective From Date \*/Có hiệu lực từ ngày | Catalogue is effective only when the processing date is between Start Date and End Date, inclusive. | Date | +| | Effective To Date \*/Có hiệu lực đến ngày | Date | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of catalogue | Image | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this catalogue. For user reference on MP only. | X(100) | + +### Post- Conditon + +The Catalouge information for each item can be returned to the front-end during an Item Enquiry response message for the front-end to use in searching the catalogue for items. + +### Exception Flow + +N/A + +## Category + +### Requirement Definition + +A catalog is the main folder to organize categories and items for materials. A category is a group within a catalog that contains items. All items to be included in the Catalogue must be tagged with the Category code. Multiple Categories can be linked to form a hierarchy of categories. The hierarchy of categories is used on Member site. + +### Process Flow + +### Trigger + +If an item is to be tagged to a catagory that has not yet been defined. + +### Pre-Condition + +1. Users have to have access rights in “Category” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve category records. + +### Mockup + +![](data:image/png;base64...) + +### Business Rule + +1. Click on the category icon in the navigation panel under OneCatalouge to get a listing of existing catalogues. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the category is illustrated in section 7.3.4. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin Chung** | | | | +| | Category Code \*/Mã danh mục vật phẩm | User-specified code identifying the category. Used by front-end system when requesting item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this category. For user reference only. Default description which will be used in case there is no specific description for the chosen language. | X(100) | +| | Effective From Date /Có hiệu lực từ ngày | Category is effective only when the processing date is between the Start Date and the End Date, inclusive. If an effective date is not provided then this is a non-expire category. | Date | +| | Effective To Date /Có hiệu lực đến ngày | Date | +| | Parent Category | Multiple Categories can be linked to form a hierarchy of categories. | Drop-down Select one The parent categories value from master data. | +| | Display Ordering /Thứ tự hiển thi | The display ordering sequence on the Member Site. | 9(3) | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of the category. | Image | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condition field This field is only active and required when the image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this category in the choosen language. For user reference on MP only. | X(100) | + +### Post –Condition + +### Exception Flow + +## Item master + +### Requirement Definition + +Describe details about a particular item: e.g. prices, quantities, availability dates, terms and conditions, etc. Item Master Records cannot be created unless the Stock Code is in place. + +### Process Flow + +### Trigger + +New items need to be defined. + +### Pre –Condition + +1. Users have to have access rights in the “Item Master” screen under the “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Item Master records. + +### Mockup + +![](data:image/png;base64...) + +### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Master is illustrated in section 7.4.4 +3. **Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information: Mandatory Step** | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The Catalogue for which this item is being configured. | Drop-down Select one | +| | Category/Danh mục vật phẩm | Select the category under which this item is to be tagged, to facilitate searching in the customer-facing page – e.g. Retailer Vouchers, Frequent Flyer Points, Cash Rebate, etc. | Drop-down Multiples select | +| | Item Code\*/Mã vật phẩm | Enter the item code to be added to the catalogue. This is Item identify. | X(10) | +| | Item Name \*/Tên vật phẩm | Short description field used by customer-facing application for display for Catalogue item. The text can include control characters. This is default name in case there is no specific item name of chosen language in the member site. | X(50) | +| | Redemption From Date From\*/Có hiệu lực từ ngày | “**From Date**” & “**To Date**” specify the period within this item is available and may be included in the Catalogue display and when after which it becomes unavailable and is excluded from the Catalogue display. OLS will reject the Start Date and End Date if they are outside the Catalogue/Category Start Date and End Date period. Once the item has been started for redemption, only End date will be allowed to modify. | Date | +| | Redemption To Date \*/ Có hiệu lực đến ngày | Date | +| | Redemption Store /Đối tác | Supplier of this item. The merchant (Store) that has to be configured appropriately in order for straight-through settlement processing. | Drop-down Select one | +| | Redemption Transaction Code\*/Mã giao dịch đổi thưởng | OLS TC used for redemption processing and logging. | Drop-down Select one | +| | Award Transaction Code/Mã giao dịch tặng thưởng | OLS TC If selected, the **OLS** **Transaction Code”** used to locate any award campaign rules to be executed as a result of the catalogue item redemption. | Drop-down Select one | +| | Item Type \*/ Loại vật phẩm | The type of item Choose one of following types : * + 1. Miles 2. Physical 3. eVoucher 4. Donation 5. Cash rebate 6. Other | Radio button Item type list from master data | +| | Voucher Code /Mã voucher | Condition field A drop-down to select voucher code This field is only active and required when item is an eVoucher | Drop-down Select one | +| | Face value/ Partner Point / Giá trị vật phẩm | Condition field This field is only active and required for Cash rebate/eVoucher/Miles item. This is the value of the cash rebate/voucher /miles that customer sees. This value is not used if the Face Value is also specified in the Item Price set-up | 9(14,2) Should be positive value | +| | Display on Member Site | Turn off to restrict this item in member site. | Switch button Default ON | +| | Hot item /Vật phẩm hot | Condition field This field is active only when this item is displayed on the member site Choose to indicate this is a hot item. Used to display on Member Site. | Switch button Default OFF | +| | Display Ordering/ Thứ tự hiển thị | Condition filed This field is active only when this item is displayed on the member site The ordering sequence to display on member site | 9(3) Should be greater than 0 if provided | +| | Track Quantiy on Hand/ Theo dõi số lượng vật phẩm | ON mode if the item is an item and that requires inventory control: the “Quantity-on-Hand” is updated for such items during redemption. If this is a Voucher Code item, this field is force-set to Yes and cannot be changed. | Switch button Default OFF | +| | Initialize Quantity of Stocks/ Số lượng ban đầu | Condition filed This field is only active and required if track quantity on hand. Canot edit this value if this item has been redeemed. This field is not activated for the Evoucher item due to the number of voucher being generated by another feature (via the Voucher Code screen or batch file). | 9(9) Should be positive value. In case item has been redemmed, then not allow to modify this field. Just display only | +| **Item detail : Mandatory step** **This step involves configuring the details of each item in multiple languages. By doing so, the system can utilize the specific details tailored to each language.** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific item detail. | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Item name\*/Tên vật phẩm | Specific item name in the choosen language. | X(50) | +| | Item Description/Mô tả vật phẩm | Specific item description in the chosen language. | X(100) | +| | Item content/Thông tin chi tiết | The content of item in the choosen language | X(2000) | +| | How to use /Cách sử dụng | The way to use the item in the choosen language | X(2000) | +| | Term and Conditon/ Điều khoản | Term and Conditon Free text to be returned in the Terms and Conditions field in the Web Service message and in redemption output template letters and email. | X(2000) | +| **Item Image /Ảnh vật phẩm** Optional step | | | | +| | Select image | Click to add image for item | Button | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condiiton field This field is only active and required when image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Sort Order | The display odering sequence on Member Site. | 9(3) Should be greater than 0 if provided | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Contact and Address information** Optional step | | | | +| | Add Address | Click to add item address where we can to use this item | Button | +| | City\* | The drop-down to select the city where can use this item | Drop-down Select one | +| | Address | Address detail | X(200) | +| | Email | Email address | X(100) | +| | Phone | Phone number | X(20) | + +### Post-Condition + +* + 1. The newly created item should have all required fields populated with valid data. + 2. The system should add/updated items in the database. + 3. Other screen which lookup to item screen must be able to use new item. + +### Exception Flow + +## Item price + +### Requirement Definition + +* + - 1. Outlines the specifc criteria, functionalities and parameter that determine and manage item prices in the OLS: + 1. Point valuation: Define the conversion rate between reward points and redemption quanity (e.g 100 point = 1 Ticket movie voucher) to establish the baseline for item redemption. + 2. Criterions pricing: specify if different pricing tiers will be available for customer based on their account type or redemption channel or specific criterions such as gender, redemption quantity,etc. + 3. Redemption options: Define the types of items price available for redemption, including using point only or both cash and points. + +### Process Flow + +![](data:image/x-emf;base64...) + +### Trigger + +* + - 1. New item is defined and must define item price to process redemption processing for this item. + 2. If an item is to be tagged to a price that has not yet been defined. + +### Pre-Condition + +1. Users have to have access rights in “Item Master” screen under “OneCatalouge” module. +2. User have to have access rights in “Item Price” Screen under “OnCatalouge” module. +3. Depending on the user's access rights, they can view, add, edit, or approve Item Price records. + +### Wireframe + +![](data:image/png;base64...) + +### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing item master. +2. Click to view detail any active item master records to bring up the “Item Price” screen as a new tab under item master detail record. +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Price is illustrated in section 7.5.5 +4. **Edit Screen Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | Item Code \*/ Mã vật phẩm | Item code | Display if configure item pirce under specific item. Drop-down list to select an item code to configure the item price | +| | Price Code\*/Mã giá | The identify of the item price For user refrence only | X(10) | +| | Pirce Name \*/Tên giá | Default name of the price For user reference only | X(100) | +| | Effective Start Date \*/ Hiệu lực từ ngày | **From Date**” & “**To Date**” specify the period within this price. | Date | +| | Effective End Date \*/ Hiệu lực tới ngày | Date | +| | Redemption Channel \*/Kênh đổi thưởng | The drop-down to select the redemption channel. Supported channels are: Call Center Mobile Application Internet Banking Etc | Drop-down Select one | +| | Account Type Group/Nhóm loại tài khoản | Optional filed If Account Type or Account level is selected then account type group is blocked and vice versa. | Drop-down Multi-select | +| | Product Account Level /Hạng tài khoản | Optional field The drop-down to select the Account level (Card Level) to this this price applies. Leave as empty if all Account level are applies to this prce. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Select one | +| | Product Account Type/Loại tài khoản | Optional field Optional field Multi-select drop-down to select the Account Type (Card Type) of selected account level in previous step which will be applies to this price. Leave as empty if all account types of selected PAL are applies to this price. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Multi-select | +| | Redemption Pool\*/Pool đổi thưởng | Select the Pool from which to deduct points for redeeming this item | Drop-down Select one | +| | Use Only Points from Selected PA Type/Chỉ sử dụng điểm từ các loại nhóm tai khoản được chỉ định | Restrict the use of points for redemption of this item at this price to only points earned by the selected account Type/ATG | Switch button Default OFF | +| | Face value /Trị giá vật phẩm | If transacting Customer/Account meets the criteria in this set-up, what the Customer receives is this “Face Value”. E.g. if this is 500 KrisFlyer Miles, Customer receives 500 KrisFlyer Miles for redeeming one of this item. | 9(12,2) Should be greater than 0 if provided | +| | Price in point \*(Full redemption) / Giá trị điểm | Price of item if paid for fully in points from the selected Pool | 9(12,2) Should be greater than 0 if provided | +| | Original price /Giá gốc | The original price of the item For user reference only | 9(12,2) Should be greater than 0 if provided | +| | Partial Redemption Allowed/Cho phép đổi thưởng 1 phần | If allowed, customer can use a mix of points and cash to pay for this item. The number of points and amount of cash are derived from “Price in Cash Value-per Point” and “Minimum Partial Redeem Points”. See the description for these fields. | Swith button Default OFF | +| | Minimum Partial Redeem Points/Số điểm tối thiểu | Condition field This field is only active and required when Partinal Redemption is allowed. Customer must use at least this number of points to redeem this item. | 9(12,2) Should be greater than or equal to 0 if provided 0 for full cash redemption | +| | Cash per point/ Số tiền chi trả | Condition field This field is only active and required when Partinal Redemption is allowed. This is used to calculate the amount of cash required to redeem this item after taking into account the points redeemed, if any. | 9(12,2) Should be greater than 0 if provided | +| | Appliable Taxes | The drop-down list to select the tax rate to be applicable. | Drop –down Select one Get data from “Tax Rate Maintenance” Screen | +| **Price detail :** **Optional step. If not provide then use default item price name to display if needed** | | | | +| | Select language /Chọn ngôn ngữ | Click to add item price detail on each language For user reference only | Button | +| | Language \*/Ngôn ngữ | The drop-down to select the language to setup the specific item price detail | Drop-down Select one | +| | Item price Name \*/Tên giá | The specific name of chosen language For user reference only | X(100) | +| | Description/ Mô tả | The description of the price For user reference only | X(500) | +| **Item criteria** A part to add criteria to meet the price The approach the same as Rule criteria but just display all criteria which be tagged to “Item price “ module only | | | | +| | | ![](data:image/png;base64...) | Click to add new criteria | +| | | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | +| | | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | +| | | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute and to be tagged for “Item Price “ module | +| | | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. | +| | | ![](data:image/png;base64...) | Click to delete criteria | +| | | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | + +### Post-Condition + +With the item price configuration then here is the flow to get item price. + +Valid price + +![](data:image/x-emf;base64...) + +What is the price of the transaction + +![](data:image/x-emf;base64...) + +### Exception Flow + +## Voucher Code + +### Requirement Definition + +1 If the Item to be set up is for distribution of Voucher Numbers to customers, and these Voucher Numbers are from external partner merchants, then the Voucher Numbers must first be set up in OLS by uploading/creating the stock of Voucher Numbers. + +2 This voucher upload file must contain the Voucher Code (which identifies what this voucher is for – e.g. “$5 Lazada Voucher”), the period within which the vouchers are accepted at the partner merchant, and the individual voucher serial numbers (Voucher Numbers). + +3 The file format is set out later (to be decided). + +4 This upload can be done using the “Upload” functions in this screen. + +### Process Flow + +### Trigger + +N/A + +### Pre-Condition + +1. Users have to have access rights in “Voucher Management” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Voucher records. + +### Wireframe + +* + - 1. **Create/Edit mode** + +![](data:image/png;base64...) + +* + - 1. **View mode** + +![](data:image/png;base64...) + +1. Listing page +2. **Voucher Detail view** + 1. Listing Page + +![](data:image/png;base64...) + +* 1. View + +Click to any record on the listing page to bring up the detail view as following: + +![](data:image/png;base64...) + +### Business Rule + +1. Click on Voucher icon in navigation panel under OneCatalogue to get a listing of existing Voucher Code as illustrated in section Wireframe. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Voucher is illustrated in section Wireframe. +3. Double click on any existing record in Active Tab then the Voucher Detail listing is illustrated in section 7.6.5. +4. The system just allow to view the Voucher detail only. +5. Can not allow deleting the voucher Code if voucher have been redeemed. +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Screen 1: Voucher Code** | | | | +| | **Voucher statistic / Tổng hợp thông tin voucher** **This is displayed for active record only** | | | +| | Total Voucher /Tổng voucher | Total the serial number voucher belong to the choosen voucher code | Display as interger format | +| | Available Vouchers /Số voucher khả dụng | Total the valid voucher and ready to use: The voucher has not yet been redeemed and non- expired. | +| | Redeemed Vouchers/ Voucher đã đổi thưởng | Total the numner of the successfully redeemed vouchers. | +| | Cancelled Vouchers/ Voucher đã hủy | Total the number of the fail redeemed vouchers which is cancelled by customers/system by specific reason. | +| | Expired Vouchers/Voucher đã hết hạn | Total the number of expired voucher that has not yet been redeemed. Use processing date to compare with expiry date of the voucher. | +| | **Voucher Code Detail information** | | | +| | Voucher Code\*/Mã voucher | Identifies the voucher. | ~~X(20)~~ X(10) | +| | Description /Mô tả | The description of the voucher. For user reference only. | X(100) | +| | Supplier / Nhà cung cấp | The partner/ organization that issues or provides the voucher | Drop-down Select one | +| | Expiry Policy \*/ Hạn sử dụng | A drop-down list with the following choices: * Fixed Date: Voucher will expire after the date specified in the “Expiry Date” parameter. * N days from Transaction Date: Voucher will expire after N days from Redemption Date (Transaction Date). * N days from Post Date: Voucher will expire after N days from redemption transaction is posted on the OLS. * N Months from Transaction Date: Voucher will expire after N months from redemption Date. * N months from Post Date: Voucher will expire after N moths from the moment a redemption transaction is posted on the OLS. | Drop-down Select one | +| | Expiry Date / Ngày hết hạn | Condition field This field is only active and required when the expiry policy is “Fixed Date”. **A transaction which redeem this voucher is not allowed to have Transaction Date later than this date.** Can not allow editing the policy (including the relative field that be used to determine expiry date of the voucher) | Date | +| | N Param/ Tham số N | Condition field This field is only active and required when the Expiry Policy selected in the previous step requires a parameter N param. e.g. “N days from Transaction Date” | 9(3) Should be greater than or equal to 0 if provided | +| | Generate Voucher /Khởi tạo voucher | Turn on when the voucher is generated by OLS instead partner. The system will automation create the number of vouher which user will provide on next step. This field can’t be changed if the voucher have been redeemed. | Swith button Default OFF | +| | Quantity /Số lượng | Condition filed This filed is only active and required if “Generate Voucher” in the previous step under ON mode. Specifies the number of voucher codes to be generated. **When a voucher code record is approved in the system, the system should automatically generate voucher numbers corresponding to the entered quantity.** This field can’t be changed if the voucher have been redeemed. In case users want to change then it should be “re-stock”/ “void” voucher use case instead. | 9(5) Should be greater than 0 if provided | +| | This is a promo code/ Đây là mã khuyến mãi | Turn on when this is a promo code. For user reference only | Swith button Default OFF | +| | ~~Voucher Type/Loại voucher~~ Promotion Type/Loại khuyến mãi | Conditon filed This field is only active and required when this voucher is a promo code. A drop-down list with the following choices: * Fixed Percentage Discount: This type of voucher offers a discount as a percentage of the total purchase amount. * Fixed Monetary Value Discount: Instead of a percentage, this voucher provides a fixed monetary discount. * Cashback Voucher: For this type of voucher, the customer receives a certain percentage of the purchase amount back as cashback to use on future purchases. * Gif Voucher: This type of voucher is often purchased as a gift for someone else. It typically has a fixed monetary value that the recipient can use towards their purchases. | Drop-down Select one | +| | Value /Giá trị | The specific value which customer can get from chosen voucher type. Condition field This field is only active and required when “Fixed Monetary Value” / “Fixed Percentation Discount” are selected on the previous step. | 9(14,2) Should be greater than 0 if provided | +| **Screen 2: Voucher Detail** **Each voucher No is displayed under one detail record in listing page** **Voucher detail is introduced as a subtab of Active voucher record.** | | | | +| | Voucher Code | Choosen voucher code | Display | +| | Voucher No | The serial voucher number of choosen voucher | +| | Redemption Date | The date when voucher is redeemed | +| | Expiry Date | Expiry date of the voucher number which is based on choosen expiry policy of the choosen voucher | +| | Redemption Indicator | One of following values: * No: If voucher is not used for any redemption transaction. * Yes: If voucher have been redeemed by customer. | +| | Fulfillment Status | One of following values: * New: When voucher is created/uploaded in OLS then the fuillment status should be new to indicator that voucher to be availbale to redeem. * Issued: The FFS is changed into Issued when voucher is successfully redeemed in the OLS. * **Fulfilled: The FFS is changed into Fulfilled when voucher is successfully redeemed and partner accept this voucher.** * Cancelled: FFS is changed intpo “Cancelled” if the customer cancels the transaction or if there are issues with the voucher that prevent its redemption. * Rejected: The vendor has rejected the voucher due to some reasons such as term and conditions, policy changes.etc. The fufillment status is updated when fulfilment status is changed. | + +* + - 1. User who can create new voucher can use “upload” function to upload the voucher file into OLS + +### Post-Condition + +### Exception Flow + +# OneTargeting + +## Segmentation Definiiton + +### Requirement Definition + +* 1. Segmentation is one proessing to divide a customer base into smaller, that provides a way to narrow down the target audience based on the types of products or services the customers have previously purchased. + 2. This screen allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. + 3. In the system sides, segement is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup the targeting customer. + +### Process Flow + +### Trigger + +* + 1. User access to the OneTargeting Module to create/update new segment. + +### Pre-Condition + +1. Users have to have access rights in “Segmentation” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. +3. Assume that all criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +### Sktech + +* + - 1. Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. View mode + +### Business Rule + +1. The same approach as Campaing Rule Crireria screen, OLS system will use Query Builder to build query for this screen. +2. Refer to [Rule Criteria](#_Business_rules_1) section to get more detail about the business rule of this screen. The criterion list are described in the #3. +3. Here are some way that business segment their targeting customer : + +| **Index** | **Segement Group** | **Criteria Group** | **Combination by following Criteia** | **Segment Example** | +| --- | --- | --- | --- | --- | +| | Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children: 0 -14 Youth: 15- 24 Adults: 24- 64 Seniors: 65 and above | +| Last Name | | +| First Name | | +| Income | **Income segment**: High-Income Customer Middle –Icome Customer Low-Income Customer | +| Gender | Male customer Female customer | +| Marital Status | Singel customer Married customer | +| DOB | **Generation segment:** Gen Z: Year DOB from 1997 – 2012 Gen Y: 1981 – 1996 Gen X: 1965 – 1980 Gen W (Baby Boomers): 1946- 1964 | +| Location: Country/State/City/Zip Code | **Geography segement:** International customer Urban customer Suburban customer Mountain Customer | +| Customer’s Tenure | **Customer’s Tunure** **Segment** (Use Customer Registration) : New customer: under 1 year Early- tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long - tenured customer: above 5 years | +| Account ‘s Tenure | **Account’s Tunure** **Segment** (use AOD) : New customer: under 1 year Early - tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long tenured customer: above 5 years | +| Account’s Status | | +| Next AOD | | +| Customer’s staus | Used in the many segment that | +| | Behavior Segmentation | Transaction | Last transaction /Integration | **Churned customer :** E.g Last transaction is more than 6 months ago and customer status is active | +| Transaction Frequency: Should be tracked in the specific period such as day/week/month / Quarter/Year/Custom period to determine for following criteria : * + 1. **Total number txn frequency on the specific period.** 2. **Avegare txn frequency** | **Customer Segment:** High-Value Customers: frequency range depend on each business rule Medium-Value Customers: frequency range depend on each business rule Low-Value Customers: frequency range depend on each business rule | +| Customer Recency: When was the last transaction/ integration. | +| Total spending value: How much customer spends (total nett transaction amount) | +| Transaction Date | **Peak –Time customer:** E.g Transaction date is on special day Transaction date on weekend (day of the week) Midnight transaction (Time of the transaction) **Consistent-Time Customers**: E.g Transaciton do on each the first day of the month **Flexible-Time Customers** E.g Transaciton is on specific day | +| Transaction Time | +| Merchant: Coporation/Chain/Store/MCC | Use with another crieteria or itself only to create specific segment | +| Merchant Group: Coporation/Chain/Store/MCC Group | +| Transaction Description | +| Transaction Category | +| Transaction Gross Amount | +| Transaction Nett Amount | +| | Flexible segment | Attribute | Attribute Criteria | | +| | Psychographic Segmentation | Item | Favorite Category | **Life Style segment** **Interest segment** **Opinion segment** | +| Favorite Item | +| To be added when implement onedisplay so that we can have the data source for collect the Psychographic Segmentation from survey to decision the marketing strategy | + +### Post-Condition + +* + - * 1. Each segment are used to define the targeting customer on the marketing module. + +### Exception Flow + +## Audience Upload + +### Requirement Definition + +Provide a user –friendly interface to marketers to manage audience uploads. + +### Process flow + +### Trigger + +### Pre-Condition + +1. Users have to have access rights in “Audience Upload” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. + +### Sktech + +### Business rules + +Users are able to upload a customer data for targeted marketing campaigns by uploading a file into the system. + +The system should allow users map data from their source files to the required platform fields by accepting the CSV, excel spreadsheets. + +The system validates the uploaded data to ensure all required fields are present and in the correct format + +Screen descrition + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data Type** | +| **Listing page** | | | | +| | Audience Name /Tệp khán giả | Name of the audience | Dipslay | +| | Description /Mô tả | Audience description For use refer only | Display | +| | File size /Dung lượng tệp | The file size | Display as number format | +| | ![](data:image/png;base64...) | By clicking here to download the audience. This should be orginal file tha user already uploaded. | Button | +| **Create/Edit Mode** | | | | +| | File ID \*/ ID tệp | Audience identifier For system refer only | X(10) | +| | Audience Name \*/ Tệp khán giả | The name of the audience Should be uniquie value in the system. | X(50) | +| | Description /Mô tả | Audience description | X(200) | +| | Upload file \*/ Đăng tệp tin lên | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse file from their device. | Button | +| | | | | + +### Post-condition + +### Exception Condition + +## Customer Audience + +### Requirement Definition + +### Process flow + +### Trigger + +### Pre-Condition + +### Wireframe + +### Business rules + +### Post-condition + +### Exception flow + +End of Document \ No newline at end of file diff --git a/docs/staging/raw/formula.md b/docs/staging/raw/formula.md new file mode 100644 index 0000000..793598b --- /dev/null +++ b/docs/staging/raw/formula.md @@ -0,0 +1,131 @@ +--- +title: "Formula" +source: "docs/Formula.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula + +## Formula 1 + +**Enter # of Pool Units (N)**] is the number of pool units to add to Result for every D units of Amount in the **[Enter Block Size (D)]** input field. E.g. if N = 5, D=50: + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Amount** | $60 | $65 | $119 | $160 | $210 | +| **Result =** | 5 | 5 | 10 | 15 | 20 | + +**Result = [Round Down to Integer for (Transaction Amount / D)] \* N** + +Then apply precision and rounding type handling to the formula 1 result. + +**Finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +**Example 1:** + +Txn Amt = 52.87, N=1, D =1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 1)] \* 1 = [Round Down to Integer for (52.87)] \*1 = 52\* 1 = 52 + +Then apply precision and rounding type handling to the formula 1 result = 52 + +**Example 2:** + +Txn Amt = 52.87, N=0.1, D =0.1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 0.1)] \* 0.1 = [Round Down to Integer for (528.7)] \* 0.1 = 528 \* 0.1 = 52.8 + +Then apply precision and rounding type handling to the formula 1 result = 53. + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 2 + +![](data:image/png;base64...) + +“N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. + +## ~~Formula 3~~ + +~~![](data:image/png;base64...)~~ + +~~The Result is multiplied by “M” if transaction date matches the selected Event Date(s). Event Date(s) is a multi-select field.~~ + +## Formula 4 + +![](data:image/png;base64...) + +Selects one of two calculation algorithms as the Award Basis: + +A. “Highest Tier in Which Amount Falls” + +B. “Each Tier, applied to the part of Amount that Falls within that Tier” + +- If Award Basis “A” is selected, and AF is a Percentage, then the AF in the highest Tier in which Amount falls is applied to the whole Amount, i.e. Result = AF x Amount, where AF is the AF of the highest Tier where Amount is greater than the lower bound but less than the upper bound). + +- If “B” is selected, and if AF is a Percentage, then the AF for each Tier is applied to the part of Amount that falls within that Tier (AF x amount in Tier = D), and Result is the sum of D from all the applicable Tiers. + +- If “A” is selected and AF is “Pool Units”, then the number of Pool Units awarded is AF as specified in the highest Tier in which Amount falls is applied to the whole Amount. + +- If “B” is selected, and AF is “Pool Units”, then AF Pool Units are awarded for each Tier whose upper bound is less than Amount, i.e. Result = Sum AF of all Tiers with upper bound less than Amount. + +![](data:image/png;base64...) + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 5 + +![](data:image/png;base64...) + +1. Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with: + +- Amount (spend counter) + +- Formula Result (points counter) or + +- Incremented by one (frequency counter), depending on the counter method selected in Counter Definition. + +-The first input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. + +Conclude: If transaction hit F5 then Counter value is updated: + +Normal transaction: New counter value = Counter value + (F5 result \* multiplier), except multiplier is 0 + +Reversal transaction: new counter value = Counter value - (F5 result \* multiplier), except multiplier is 0 + +2. For point counter and point amount counter then: + +Just update point counter/point counter value with the point /point amount form that Rule only. If there is no point but have F5 to update point counter then throw message to reject transaction. + +## Formula 6 + +![](data:image/png;base64...) + +Formula 6 is for computation on a tiered basis, similar to Formula 4, but Formula 6 is different in that the tier is determined not by the Amount (as is the case in Formula 4), but instead it is by the value of a separately selected Counter. + +“Decide Tier based in value in” is a drop-down to select all of 3 counter buckets: Current bucket/ Previous bucket/ before last bucket of each counter (in the next phase should support N bucket with N is configurable value by user). Based on “Effective Period Is Based On” of rule to determine counter value of Selected counter bucket. + +![](data:image/png;base64...) + +## Formula 9 + +Update counter state + +![](data:image/png;base64...) + +1. “Counter” is drop-down list to select the counter to update counter state if transaction trigger CP rule. +2. “Select state” is drop-down list to select the state to be updated. + +There is 2 options to select “Next state” or “Previous State”. Depended in reversal indicator of transaction to process as following: + +* Next State non reversal --> look for oldest C and update to A +* Next State reversal --> look for newest A and update to C +* Previous State non-reversal --> look for newest A and update to C +* Previous State reversal --> oldest C and update to A + +![](data:image/png;base64...) + +## Formula 8 + +Update attribute value conditionally =tbd= \ No newline at end of file diff --git a/docs/staging/raw/formula_validation.md b/docs/staging/raw/formula_validation.md new file mode 100644 index 0000000..c828125 --- /dev/null +++ b/docs/staging/raw/formula_validation.md @@ -0,0 +1,50 @@ +--- +title: "Formula Validation" +source: "docs/Formula validation.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +**Formula validation** + +| | | | +| --- | --- | --- | +| **Field** | **Description** | **Data type** | +| Right panel | List all active formula on the system. In the right panel, the list to selects a Formula to use. Each formula derives a Result which is used as the award quantity or the redemption quantity, depending on the Rule Type selected in the Rule Header. The supported formulae for deriving Result are:  Formula 1 – Add “P” to Result for every D of Amount  Formula 2 – Result = “P” (a fixed amount)  Formula 4 – Derive Result based on Amount Tier and a parameter “P”  Formula 5 – Update selected Counter  Formula 6 – Derive Result based on Counter Tier and a parameter “P”  Formula 7 – Derive Result based on Rate table  Formula 8 – Update Attributes  Formula 9 – Update State of selected Counter ![](data:image/png;base64...) | View only | +| Drag/Drop formula | Allow user drag/drop the formula from right panel to set up rule. Drag the selected Formula will be added as a panel for the edit and displaying the Formula parameters below the Formula part. A Formula panel can be removed by clicking on the exit icon (X) in the panel header. | Action | +| Formula order | Formula Executing Seq. It defaults to the ascending ordering sequence. User can re-arrange it if needed. For example. If user select F1 and F5 then the default formula order must be F1=> F5 and user can re-arrange into F5=>F1. The formula list is getting from “Code_Management”table where code type is “formula-list”. Refer “Get-by-code-type” API under Master data. | Action | +| **Formula 1: Add [ N ] to Result for Every [ D ] Unit(s) of Transaction Amount, where Transaction Amount is the Gross Transaction Amount or Nett Transaction Amount as selected in Amount-To-Use, in Base Currency Units.** **Only one formula 1 allow to configure on each campaign rule** | | | +| **If “Apply After Cap Value” button is on OFF** ![](data:image/png;base64...) | | | +| N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical ) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| D | The block size of transaction Amount before cap. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| **If “Apply After Cap Value” button is on ON** ![](data:image/png;base64...) | | | +| Before Amount Cap N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. | 9(14,2) Allow positive value only | +| D | The block size of transaction Amount before cap. | 9(14,2) Allow positive value only | +| After Amount Cap N | N result apply for after Cap value This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| D | The block size of transaction amount after cap. This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| **Formula 2:  Add [ N ] to Result** **Only one formula 2 allow to configure on each campaign rule** | | | +| N\* | “N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. | 9(14,2) | +| **Formula 4: Tiered Calculation. Select Factor from row where Transaction Amount A is between [Start]-[End] in that row. If Percent is chosen in the corresponding drop-down box, then add (Factor XA) to Result. If Points is selected, then add Factor to Result** | | | +| Factor Type is \*/Loại hệ số | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Factor per Block or Full Amount\*/Hệ số theo mỗi khối hay trên toàn bộ giá trị | Selects one of two calculation algorithms as the Award Basis: A. “Highest Tier in Which Amount Falls” B. “Each Tier, applied to the part of Amount that Falls within that Tier | Drop-down Select one Lookup value from “Code_Management” table where code type is “f4-factor-option”. Refer “get-by-code-type” API under master data | +| Add tier | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. 1. If “Apply After Cap Value” button is on OFF mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : ![](data:image/png;base64...) Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Should be greater than or equal 0. For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number specifying AF. | 9(14,2) Positive value only | 1. If “Apply After Cap Value” button is on ON mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : ![](data:image/png;base64...) | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | **Before Cap** | | | | Before Cap | The label is only active when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | **After cap: This row is active on each tier when Apply after cap only** | | | | After cap | The label is only active only when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | Button | +| **Formula 5** | | | +| Multiplier\*/Hệ số nhân | Input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. | 9(14,2) ~~Should be greater than or equal 0~~ | +| Counter ID \*/Bộ đếm | The input field is a drop-down for selecting the Counter to update. Note that Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with * Amount (spend counter) * Formula Result (points counter) or * Incremented by one (frequency counter), depend on the counter method selected in Counter Definition. **Each counter is assigned to only one F5 per each campaign rule.** | Drop-down Select one Refer “Counter Definition” API under Campaign management | +| Add counter | After the fields in this row have been filled in, the “+ Add counter” icon is active, and when it is clicked will add the details from the input fields in the display area as a new row. | Button | +| **Formula 6** | | | +| Factor Type is \*/ Loại hệ số là | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Decide Tier based on value in\*/ | The input box is a drop-down for selection of a Counter to be used for determining the AF to use in deriving Result. This drop-down allow to select all of 3 counter buckets: Current bucket/ Previous bucket/ Before last bucket of each counter. E.g : Current -Counter Name [Counter ID] Previous – Counter Name [Counter ID] Before last – Counter Name [Counter ID] | Drop-down Select one Lookup value from “Counter_Definition” table Refer “get-by-code-type” API under master data | +| Add Tier /Thêm | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : ![](data:image/png;base64...) Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | The first input field is a number field to enter the lower bound of a Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number fields to enter the upper bound of a Tier | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number field specifying the value of AF, which is either the number of Pool Units to award or the percentage of Amount to award in Pool Units | 9(14,2) Positive value only | | Button | +| **Formula 9** **Allow Only one formula 9 per each campaign rule** | | | +| Counter Id\*/ Bộ đếm | The “Counter” drop-down field lists all valid Counters as defined in Counter Definition. | Drop-down Select one Lookup value from “Counter_Definition” table. Refer “Campaign Counter Definition” API under Campaign management. | +| Select State \*/Chọn trạng thái | The “Next State” drop-down provides the following choices: “Next State” , which will update the State as follows: If the State before update is “C”, the State will be updated to “A” If the State before update is “A”, the State will be updated to “O” If the State before update is “O”, no action is taken (Counter State is not changed) | Drop-down Select one Lookup value from “Code_Management” table where code type is “f9-counter-sate”. Refer “get-by-code-type” API under master data. | +| **Formula 8: Please consider and advise to change UI/UX for this** **Following items are explained for existing version** | | | +| Attribute group/Nhóm thuộc tính | Group of attribute | Drop- down Select one | +| Attribute ID\*/ Thuôc tính | Attribute ID to update attribute value/expire date If Attribute group is selected then just list all attribute of selected atrribute group If attribute group is not selected then list all active attribute on the system. | Drop-down Select one Lookup value “Attribute_Definition” table. Refer “Attribute Definition” API under Code Maintenance | +| Condition | After an Attribute has been selected, depending on the data type of the Attribute, condition appear to allow input of the conditional arguments as illustrated in the following figures Bellow image shows the a Date Attribute has been selected in the selection row : ![](data:image/png;base64...) Bellow image shows a boolean attribtue has been selected in the seclection row: ![](data:image/png;base64...) Bellow image show a character attribute has been selected in the selection row ![](data:image/png;base64...) Bellow image show a character attribute has been selected in the selection row ![](data:image/png;base64...) | | +| Set \* | Attribute ID need to be updated attribute value | Drop-down Select one Lookup value from “Attribute_Definition” table. Refer “Atrribute Defintion” API under code maitenance | +| Set to value | Value is depened on selected "Data type": * if "Boolean" data type is selected then swith button true/false is actived for default value field. Default False. * If "Character" datatype is selected then a textbox is actived for default value. * If " Date" datatype is selected hen a Date field is actived for default value field. * If "Number" datatype is selected then a Numberic filed (double data type) is actived for default value fied. | | +| Expiring | 2 choices for user: 1) User can enter a fixed date (1st input field) (Expiring ) or 2) user can enter N followed by the drop-down choice of "End of Month" or "End of Quarter" (Set Expiry Date to). if user enters a Fixed Date, we update the Expiry Date = value (Fixed Date) entered if user select period we update the expire date into selected period 1. Admin screen allows only choice of FIXED DATE or N [Period Unit]. If Expiring is provided then “Set Expire Date to “ is inactived and vice versa. 2. If “Set Expire Date To “ is selected and “Period is not No Expire / Post Date “ then “N” field is actived. 3. Have to choose at least one option: Fixed or period type | | +| Set Expire Date to | Drop -down Select one Refer “get-by-code-type” API under master data with code type is “ | +| N | 9(2) | \ No newline at end of file diff --git a/docs/staging/specs/campaign/account_type_group.md b/docs/staging/specs/campaign/account_type_group.md new file mode 100644 index 0000000..9f5b0d8 --- /dev/null +++ b/docs/staging/specs/campaign/account_type_group.md @@ -0,0 +1,65 @@ +| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | + +#### Post-condition + +* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. + +#### Exception flow + +### Account Type Group + +#### Requirement Definition + +* + - 1. An account type is a combination of Product account level and product account type. + 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) + 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. + 4. There is no ATG checking for redemption and negative adjustment. + 5. An ATG Sequence number is assigned to each Account Type in an ATG. + 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New account type is coming then need to be added this account under ATG of reward pools. +2. Some points need to be corrected for existing ATG. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to can view/update or approve these records. +2. Account type which apply for ATG have to be actived on OLS. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Listing page + +![](data:image/png;base64...) + +Figure 2- Filter + +* + - * 1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status (history) + +![](data:image/png;base64...) + +* + - * 1. Create/Update form + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. + 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): + 4. **Screen descriptions:** + diff --git a/docs/staging/specs/campaign/campaign_rule.md b/docs/staging/specs/campaign/campaign_rule.md new file mode 100644 index 0000000..02cf032 --- /dev/null +++ b/docs/staging/specs/campaign/campaign_rule.md @@ -0,0 +1,577 @@ +| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | +| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | +| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | +| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | +| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | +| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | +| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | +| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | +| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | +| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | + +#### Post-condition + +Amount to use feature with Transaction Processing. + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Exception flow + +### Campaign Rule Criteria + +#### Requirement Definition + +1. Rule criteria are divided into 5 categories for ease of maintenance: + +| | | | +| --- | --- | --- | +| Customer | Account | Transaction | +| Atttribute | Counter | Merchant | + +1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Exsiting Campaign require at least one campagin rule validate criterions. + +#### Pre-Condition + +1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== + +![](data:image/png;base64...) + +1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. + +#### Wireframe + +![](data:image/png;base64...) + +Figure 1 - Query builder + +![](data:image/png;base64...) + +Figure 1 – Rule criteria + +![](data:image/png;base64...) + +Figure 2- Drag criteria into Rule + +![](data:image/png;base64...) + +Figure 3 – Rule criteria screen after complete setup + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). +2. OLS system will use Query Builder to build query for Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same campaign rule. +4. **Screen description:** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | ![](data:image/png;base64...) | Click to add new criteria | Button | +| | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. ![](data:image/png;base64...) | Action | +| | ![](data:image/png;base64...) | Click to delete criteria | Button | +| | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | +| | Criteria | **Criteria Structure:** **![](data:image/png;base64...)** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | + +1. **Right panel** + +In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. + +Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== + +Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== + +**Some use case for each criteia group:** + +| | | | +| --- | --- | --- | +| **Index** | **Use case** | **Criteria group** | +| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | +| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | +| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | +| | MCC group Store group Chain group Corporation group | Transaction criteria | +| | ATG criteria | Account Criteria | +| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | + +1. **Query builder structure** + +*For example:* + +*+ Account type criteria has data type as string and filter value is account type list from PRODUCT_ACCOUNT_TABLE.* + +*+ Transaction description criteia has data type as string but filter value is enterted by user.* + +*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | +| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: ![](data:image/png;base64...) | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | +| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. ![](data:image/png;base64...) | +| | Is empty ( NULL) | This condition checks whether the comparison value is empty. ![](data:image/png;base64...) | MUST not display filter value field and input type | +| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. ![](data:image/png;base64...) | +| | Contains | This condition checks whether the comparison value contains the filter value. ![](data:image/png;base64...) | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example ![](data:image/png;base64...) | +| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. ![](data:image/png;base64...) | +| | Is in | This condition checks whether the comparison value is in one of the filter value. ![](data:image/png;base64...) | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example ![](data:image/png;base64...) 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | +| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. ![](data:image/png;base64...) | +| | Begins with | This conditon checks whether the comparison text begins with the filter value. ![](data:image/png;base64...) | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example ![](data:image/png;base64...) Should not be case sensitive | +| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. ![](data:image/png;base64...) | +| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. ![](data:image/png;base64...) | +| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. ![](data:image/png;base64...) | +| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. ![](data:image/png;base64...) | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. ![](data:image/png;base64...) | +| | Is less than (<) | This condition checks Comparison value is less than filter value. ![](data:image/png;base64...) | +| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. ![](data:image/png;base64...) | +| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. ![](data:image/png;base64...) | +| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. ![](data:image/png;base64...) | +| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) ![](data:image/png;base64...) | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* ![](data:image/png;base64...) *For example 2: Customer’s birthday from Jul 01 to Jul 15* ![](data:image/png;base64...) | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | +| | Is fixed date | This condition checks whether the comparison value is equal to filter value ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | +| | Is null | The comparison value must be null value | There is no filter value | +| | Is not null | The comparison value must be null value | +| | Is betweenperiod from N (min to max value). | ![](data:image/png;base64...) **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* ![](data:image/png;base64...) ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) ![](data:image/png;base64...) ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** ![](data:image/png;base64...) | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | +| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | +| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | +| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | + +#### Post-condition + +* 1. User able to proceed next step to complete campagin rule setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Campaign Rule Formula + +#### Requirement Definition + +1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. +2. Sometimes we was using campaing formula to update the counter value or attribute value as well. +3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +See more detail in attached file + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Post-condition + +#### Exception flow + +### Campaign Rule – Contributor Settings + +#### Requirement Definition + +1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. +2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Campaign require a list of Contributors configured for the Rule. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. +2. The merchant as a “contributor” of the award transaction should availble on OLS system. + +#### Wireframe + +* + 1. Contributor setting + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. + +1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Type** | +| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | +| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | +| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | +| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | +| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | +| | ![](data:image/png;base64...) | Clicking Click on the “![](data:image/png;base64...)” icon removes the Contributor row | Button | + +1. The total contribution must be 100%. +2. Contributor must be uinique on each campaign rule. +3. If contributors are configured then must have one and only one contributor is “absord remider”. +4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) + +#### Post-condition + +* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Extract & Process (CEP) Request + +#### Requirement Definition + +* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. +2. All drop-down value must avaiable in the system. + +#### Wireframe + +Please refer figma to get more detail. + +#### Business rules + +* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | +| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter_Definition" table. Refer "Counter Definition" API under Campaign Management | +| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | +| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | +| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | +| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | +| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | +| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | +| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: + 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== + 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== + 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== + +| | | | | +| --- | --- | --- | --- | +| | **Counter Bucket To Extract** | | | +| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | +| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | +| * Monthly on Day N of Month | +| * Statement Cycle Date | +| * N Days after AOD | +| * Annually, on Day N of Month M | + +* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run + 2. Counter state is update when CEP extract based on Counter definition setup : + + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. + + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. + + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. + +#### Exception flow + +N/A + +### Redemption Extract & Process (REP) Rule + +#### Requirement Definition + +1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. +2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. +3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. + +#### Process flow + +#### Trigger + +* + - 1. The campaigns require the system automation extract the pool balances. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +* + - 1. Please help to refer on the figma. + +#### Business rules + +* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool_Definition” table. Refer “Pool Definition”API under Campaign Management | +| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | +| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | +| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction_Code”table Refer “OLS Transaction Code” API under Campaign Management | +| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | +| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | +| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually/Hàng năm | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +--- +title: "Formula" +source: "docs/Formula.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula + +## Formula 1 + +**Enter # of Pool Units (N)**] is the number of pool units to add to Result for every D units of Amount in the **[Enter Block Size (D)]** input field. E.g. if N = 5, D=50: + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Amount** | $60 | $65 | $119 | $160 | $210 | +| **Result =** | 5 | 5 | 10 | 15 | 20 | + +**Result = [Round Down to Integer for (Transaction Amount / D)] \* N** + +Then apply precision and rounding type handling to the formula 1 result. + +**Finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +**Example 1:** + +Txn Amt = 52.87, N=1, D =1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 1)] \* 1 = [Round Down to Integer for (52.87)] \*1 = 52\* 1 = 52 + +Then apply precision and rounding type handling to the formula 1 result = 52 + +**Example 2:** + +Txn Amt = 52.87, N=0.1, D =0.1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 0.1)] \* 0.1 = [Round Down to Integer for (528.7)] \* 0.1 = 528 \* 0.1 = 52.8 + +Then apply precision and rounding type handling to the formula 1 result = 53. + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 2 + + +“N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. + +## ~~Formula 3~~ + +~~~~ + +~~The Result is multiplied by “M” if transaction date matches the selected Event Date(s). Event Date(s) is a multi-select field.~~ + +## Formula 4 + + +Selects one of two calculation algorithms as the Award Basis: + +A. “Highest Tier in Which Amount Falls” + +B. “Each Tier, applied to the part of Amount that Falls within that Tier” + +- If Award Basis “A” is selected, and AF is a Percentage, then the AF in the highest Tier in which Amount falls is applied to the whole Amount, i.e. Result = AF x Amount, where AF is the AF of the highest Tier where Amount is greater than the lower bound but less than the upper bound). + +- If “B” is selected, and if AF is a Percentage, then the AF for each Tier is applied to the part of Amount that falls within that Tier (AF x amount in Tier = D), and Result is the sum of D from all the applicable Tiers. + +- If “A” is selected and AF is “Pool Units”, then the number of Pool Units awarded is AF as specified in the highest Tier in which Amount falls is applied to the whole Amount. + +- If “B” is selected, and AF is “Pool Units”, then AF Pool Units are awarded for each Tier whose upper bound is less than Amount, i.e. Result = Sum AF of all Tiers with upper bound less than Amount. + + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 5 + + +1. Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with: + +- Amount (spend counter) + +- Formula Result (points counter) or + +- Incremented by one (frequency counter), depending on the counter method selected in Counter Definition. + +-The first input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. + +Conclude: If transaction hit F5 then Counter value is updated: + +Normal transaction: New counter value = Counter value + (F5 result \* multiplier), except multiplier is 0 + +Reversal transaction: new counter value = Counter value - (F5 result \* multiplier), except multiplier is 0 + +2. For point counter and point amount counter then: + +Just update point counter/point counter value with the point /point amount form that Rule only. If there is no point but have F5 to update point counter then throw message to reject transaction. + +## Formula 6 + + +Formula 6 is for computation on a tiered basis, similar to Formula 4, but Formula 6 is different in that the tier is determined not by the Amount (as is the case in Formula 4), but instead it is by the value of a separately selected Counter. + +“Decide Tier based in value in” is a drop-down to select all of 3 counter buckets: Current bucket/ Previous bucket/ before last bucket of each counter (in the next phase should support N bucket with N is configurable value by user). Based on “Effective Period Is Based On” of rule to determine counter value of Selected counter bucket. + + +## Formula 9 + +Update counter state + + +1. “Counter” is drop-down list to select the counter to update counter state if transaction trigger CP rule. +2. “Select state” is drop-down list to select the state to be updated. + +There is 2 options to select “Next state” or “Previous State”. Depended in reversal indicator of transaction to process as following: + +* Next State non reversal --> look for oldest C and update to A +* Next State reversal --> look for newest A and update to C +* Previous State non-reversal --> look for newest A and update to C +* Previous State reversal --> oldest C and update to A + + +## Formula 8 + +Update attribute value conditionally =tbd= +--- +title: "Formula Validation" +source: "docs/Formula validation.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula Validation + +| | | | +| --- | --- | --- | +| **Field** | **Description** | **Data type** | +| Right panel | List all active formula on the system. In the right panel, the list to selects a Formula to use. Each formula derives a Result which is used as the award quantity or the redemption quantity, depending on the Rule Type selected in the Rule Header. The supported formulae for deriving Result are:  Formula 1 – Add “P” to Result for every D of Amount  Formula 2 – Result = “P” (a fixed amount)  Formula 4 – Derive Result based on Amount Tier and a parameter “P”  Formula 5 – Update selected Counter  Formula 6 – Derive Result based on Counter Tier and a parameter “P”  Formula 7 – Derive Result based on Rate table  Formula 8 – Update Attributes  Formula 9 – Update State of selected Counter | View only | +| Drag/Drop formula | Allow user drag/drop the formula from right panel to set up rule. Drag the selected Formula will be added as a panel for the edit and displaying the Formula parameters below the Formula part. A Formula panel can be removed by clicking on the exit icon (X) in the panel header. | Action | +| Formula order | Formula Executing Seq. It defaults to the ascending ordering sequence. User can re-arrange it if needed. For example. If user select F1 and F5 then the default formula order must be F1=> F5 and user can re-arrange into F5=>F1. The formula list is getting from “Code_Management”table where code type is “formula-list”. Refer “Get-by-code-type” API under Master data. | Action | +| **Formula 1: Add [ N ] to Result for Every [ D ] Unit(s) of Transaction Amount, where Transaction Amount is the Gross Transaction Amount or Nett Transaction Amount as selected in Amount-To-Use, in Base Currency Units.** **Only one formula 1 allow to configure on each campaign rule** | | | +| **If “Apply After Cap Value” button is on OFF** | | | +| N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical ) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| D | The block size of transaction Amount before cap. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| **If “Apply After Cap Value” button is on ON** | | | +| Before Amount Cap N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. | 9(14,2) Allow positive value only | +| D | The block size of transaction Amount before cap. | 9(14,2) Allow positive value only | +| After Amount Cap N | N result apply for after Cap value This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| D | The block size of transaction amount after cap. This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| **Formula 2: Add [ N ] to Result** **Only one formula 2 allow to configure on each campaign rule** | | | +| N\* | “N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. | 9(14,2) | +| **Formula 4: Tiered Calculation. Select Factor from row where Transaction Amount A is between [Start]-[End] in that row. If Percent is chosen in the corresponding drop-down box, then add (Factor XA) to Result. If Points is selected, then add Factor to Result** | | | +| Factor Type is \*/Loại hệ số | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Factor per Block or Full Amount\*/Hệ số theo mỗi khối hay trên toàn bộ giá trị | Selects one of two calculation algorithms as the Award Basis: A. “Highest Tier in Which Amount Falls” B. “Each Tier, applied to the part of Amount that Falls within that Tier | Drop-down Select one Lookup value from “Code_Management” table where code type is “f4-factor-option”. Refer “get-by-code-type” API under master data | +| Add tier | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. 1. If “Apply After Cap Value” button is on OFF mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Should be greater than or equal 0. For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number specifying AF. | 9(14,2) Positive value only | 1. If “Apply After Cap Value” button is on ON mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | **Before Cap** | | | | Before Cap | The label is only active when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | **After cap: This row is active on each tier when Apply after cap only** | | | | After cap | The label is only active only when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | Button | +| **Formula 5** | | | +| Multiplier\*/Hệ số nhân | Input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. | 9(14,2) ~~Should be greater than or equal 0~~ | +| Counter ID \*/Bộ đếm | The input field is a drop-down for selecting the Counter to update. Note that Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with * Amount (spend counter) * Formula Result (points counter) or * Incremented by one (frequency counter), depend on the counter method selected in Counter Definition. **Each counter is assigned to only one F5 per each campaign rule.** | Drop-down Select one Refer “Counter Definition” API under Campaign management | +| Add counter | After the fields in this row have been filled in, the “+ Add counter” icon is active, and when it is clicked will add the details from the input fields in the display area as a new row. | Button | +| **Formula 6** | | | +| Factor Type is \*/ Loại hệ số là | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Decide Tier based on value in\*/ | The input box is a drop-down for selection of a Counter to be used for determining the AF to use in deriving Result. This drop-down allow to select all of 3 counter buckets: Current bucket/ Previous bucket/ Before last bucket of each counter. E.g : Current -Counter Name [Counter ID] Previous – Counter Name [Counter ID] Before last – Counter Name [Counter ID] | Drop-down Select one Lookup value from “Counter_Definition” table Refer “get-by-code-type” API under master data | +| Add Tier /Thêm | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | The first input field is a number field to enter the lower bound of a Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number fields to enter the upper bound of a Tier | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number field specifying the value of AF, which is either the number of Pool Units to award or the percentage of Amount to award in Pool Units | 9(14,2) Positive value only | | Button | +| **Formula 9** **Allow Only one formula 9 per each campaign rule** | | | +| Counter Id\*/ Bộ đếm | The “Counter” drop-down field lists all valid Counters as defined in Counter Definition. | Drop-down Select one Lookup value from “Counter_Definition” table. Refer “Campaign Counter Definition” API under Campaign management. | +| Select State \*/Chọn trạng thái | The “Next State” drop-down provides the following choices: “Next State” , which will update the State as follows: If the State before update is “C”, the State will be updated to “A” If the State before update is “A”, the State will be updated to “O” If the State before update is “O”, no action is taken (Counter State is not changed) | Drop-down Select one Lookup value from “Code_Management” table where code type is “f9-counter-sate”. Refer “get-by-code-type” API under master data. | +| **Formula 8: Please consider and advise to change UI/UX for this** **Following items are explained for existing version** | | | +| Attribute group/Nhóm thuộc tính | Group of attribute | Drop- down Select one | +| Attribute ID\*/ Thuôc tính | Attribute ID to update attribute value/expire date If Attribute group is selected then just list all attribute of selected atrribute group If attribute group is not selected then list all active attribute on the system. | Drop-down Select one Lookup value “Attribute_Definition” table. Refer “Attribute Definition” API under Code Maintenance | +| Condition | After an Attribute has been selected, depending on the data type of the Attribute, condition appear to allow input of the conditional arguments as illustrated in the following figures Bellow image shows the a Date Attribute has been selected in the selection row : Bellow image shows a boolean attribtue has been selected in the seclection row: Bellow image show a character attribute has been selected in the selection row Bellow image show a character attribute has been selected in the selection row | | +| Set \* | Attribute ID need to be updated attribute value | Drop-down Select one Lookup value from “Attribute_Definition” table. Refer “Atrribute Defintion” API under code maitenance | +| Set to value | Value is depened on selected "Data type": * if "Boolean" data type is selected then swith button true/false is actived for default value field. Default False. * If "Character" datatype is selected then a textbox is actived for default value. * If " Date" datatype is selected hen a Date field is actived for default value field. * If "Number" datatype is selected then a Numberic filed (double data type) is actived for default value fied. | | +| Expiring | 2 choices for user: 1) User can enter a fixed date (1st input field) (Expiring ) or 2) user can enter N followed by the drop-down choice of "End of Month" or "End of Quarter" (Set Expiry Date to). if user enters a Fixed Date, we update the Expiry Date = value (Fixed Date) entered if user select period we update the expire date into selected period 1. Admin screen allows only choice of FIXED DATE or N [Period Unit]. If Expiring is provided then “Set Expire Date to “ is inactived and vice versa. 2. If “Set Expire Date To “ is selected and “Period is not No Expire / Post Date “ then “N” field is actived. 3. Have to choose at least one option: Fixed or period type | | +| Set Expire Date to | Drop -down Select one Refer “get-by-code-type” API under master data with code type is “ | +| N | 9(2) | \ No newline at end of file diff --git a/docs/staging/specs/campaign/counter_definition.md b/docs/staging/specs/campaign/counter_definition.md new file mode 100644 index 0000000..929b115 --- /dev/null +++ b/docs/staging/specs/campaign/counter_definition.md @@ -0,0 +1,125 @@ +### Counter Definition + +#### Requirement Definition + +* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. +* The Counters can then be referenced in Campaign Rules are criteria. +* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. +* A Counter is structured + + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. + + The cut-over from one period to the next can be: + - 1. Automatic based on the Transaction Date or the Batch Date, or + 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” +* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. + + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. + + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” + + A new “current” bucket is automatically created by subsequent updates. +* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 + + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules + + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month + + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. + +#### Process flow + +![](data:image/png;base64...) + +#### Trigger + +* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. +* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 +* For example: + + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter + + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter + + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter + +#### Pre-Condition + +N/A + +#### Wireframe + +* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition_Grid.png](data:image/png;base64...) + +* Use the search filter to locate the counter required: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition- filter.png](data:image/png;base64...) + +* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition.png](data:image/png;base64...) + +* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail.png](data:image/png;base64...) + +* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail2.png](data:image/png;base64...) + +#### Business Rules + +The key data entities making up Counter are defined in the following table: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | +| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | +| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | +| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | +| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | +| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | +| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | +| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | +| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | +| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | +| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | +| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | +| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | +| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | +| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | +| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | +| **Validation:** - If the Counter Id already exists counter value (counter_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter_stock table. | | | | + +#### Post-condition + +* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: + +[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) + +1. Late counter transaction posting + +**When late transaction is comming:** + +If "Late Transaction Posting Option" = "Update Late Value" + +& State! = C then update + +Else if "Late Transaction Posting Option" = "Update Current Bucket" + +& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. + +**Scenario: ![](data:image/x-emf;base64...)** + +#### Exception flow + +### Transaction Category + +#### Requirement Definition + +* 1. Transaction Category help business can define each processed transaction under pre-defined category. + 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. + 3. **Business case:** + +3.1 Enrollment Program + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | +| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | +| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | +| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | +| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | + diff --git a/docs/staging/specs/campaign/pool_conversion_rate.md b/docs/staging/specs/campaign/pool_conversion_rate.md new file mode 100644 index 0000000..6231949 --- /dev/null +++ b/docs/staging/specs/campaign/pool_conversion_rate.md @@ -0,0 +1,87 @@ +### Pool Conversion Rate + +#### Requirement Definition + +1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. +2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. +2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +1. Detail view + 1. Detai view + +![](data:image/png;base64...) + +Figure 1 - Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +* 1. Record status + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +1. Create/Edit form + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2 – Currency Rate + +#### Business Rules + +1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. +3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 +4. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. +5. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | +| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | +| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | +| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | +| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | +| | Effective End Date\*/ Ngày kết thúc | + +#### Post-condition + +* 1. User able to proceed Pool Definition setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/campaign/pool_definition.md b/docs/staging/specs/campaign/pool_definition.md new file mode 100644 index 0000000..27a74aa --- /dev/null +++ b/docs/staging/specs/campaign/pool_definition.md @@ -0,0 +1,139 @@ +### Pool Definition + +#### Requirement Definition + +1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. +2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. +3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. +4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. +5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). +6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Reward pool is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to view/update or approve these records. +2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). +3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). +4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1- Empty page + +![](data:image/png;base64...) + +Figure 2- Listing page + +![](data:image/png;base64...) + +Figure 3- Filter + +1. Detail view + 1. Pool detail + +![](data:image/png;base64...) + +* 1. Record history + +![](data:image/png;base64...) + +* 1. Pending record + +![](data:image/png;base64...) + +1. Create/Edit form + 1. General information + +![](data:image/png;base64...) + +* 1. Product Specific Expiry + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Velocity Control + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| Seq | Field (EN /VN) | Description | | Type | +| --- | --- | --- | --- | --- | +| **Statistic information** | | | | | +| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | +| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | +| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | +| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| **Step 1: General information** | | | | | +| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | +| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | +| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | +| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | +| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool_Conversion_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | +| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | +| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | +| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account_Type_Group table). Refer “Account Type Group” API under “Campaign Management” | +| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | +| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | +| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product_Account_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | +| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product_Account_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | +| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | +| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | +| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | +| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | +| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | +| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | +| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | +| **Effected Campaign Rule listing linked this reward pool** ![](data:image/png;base64...) | | | | | +| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN_TC_LINKAGE table | +| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | +| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | + +1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each reward pools to be added/edited. + +#### Post-condition + +1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. +2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. +3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. +4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). + +#### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/campaign/reward_campaign.md b/docs/staging/specs/campaign/reward_campaign.md new file mode 100644 index 0000000..b264d8a --- /dev/null +++ b/docs/staging/specs/campaign/reward_campaign.md @@ -0,0 +1,437 @@ +### Highlights + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. +3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: + +Customer + +Account # 1 + +Account # 2 + +Account # 3 + +Smart$ + +Cash Rebates + +UNIRM + +Product Holdings + +Reward Pools PoolsBalances + +Account # 4 + +* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type + +Loyalty Account Acct + +Figure 9 – Customer View + +1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. + 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. + 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. +2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. +3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. +4. A single transaction can trigger multiple concurrent award programs. +5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. +7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. +8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. + 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: + 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) + 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. + 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically + 5. Instant discounts (specific to SKU codes i.e. purchased item codes). +9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. +10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). +11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. +12. Practically unlimited number of reward campaign rules can be run concurrently. +13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: + 1. Demographic attributes: Age group, Gender, etc. + 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week + 3. Location of transaction + 4. Instant transaction amount + 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) + 6. Transaction count (number of transactions in a period + 7. Average balance over a specified period, period-end balance over a specified period + 8. Card type (product account type) + 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) + 10. User-defined attributes associated with customer and / or product accounts, etc. +14. Rewards can be tracked at + 1. Customer level: single reward balance for customer + 2. Product level: rewards tracked as a separate balance per Product Account. +15. Customer can redeem their incentives and rewards through any of the following: + +| | | +| --- | --- | +| * 1. EDC terminals at partner outlets | * 1. Call center | +| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | + +### Structure of a Campaign (HAVE TO BE ADJUSTED) + +#### Types of Campaign Mechanics + +1. Reward campaigns can be broadly divided into two types or models: + 1. Those that award on every transaction (“Award on Every Transaction”) and + 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward +2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. + +#### Award on Every Transaction + +1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: + 1. The reward is determined at the time the transaction is processed in BLP. + 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: + +![](data:image/png;base64...) + +Figure 10 – Process Flow for Award Per Transaction + +1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules + 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. + 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems +2. Campaign Rules are set up as described in the rest of this section 4. +3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. + +#### Accumulate Then Award + +1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. + 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. + 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P + 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters + 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. + 3. The structure and mechanism of how Counters work are described in section 4.2.6. + 3. The Campaign structure of such a Campaign is broadly outlined in the following: + +![](data:image/png;base64...) + +Figure 11 – Structure of “Accumulate Then Award” Campaigns. + +1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules +2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. + +#### Auto-redemption Campaigns + +1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. + +#### Reward Pool Structure & Bucket Deduction Sequence + +1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. +2. Pools belong to “Loyalty Accounts” or LAs. +3. One LA is created per Customer (per unique CIF Number). +4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. +7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): + +| | | | | +| --- | --- | --- | --- | +| UNIRM Pool | Account Type | Expiry Date | Balance | +| A | 31-Mar-2015 | 100 | +| B | 31-Mar-2015 | 50 | +| A | 30-Jun-2015 | 110 | +| B | 30-Jun-2015 | 510 | +| A | 31-Sep-2015 | 140 | +| C | No Expiry | 215 | +| TOTAL BALANCE | | 1,125 | + +1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. +2. When customer redeems: + 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. + 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. +3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. + +#### Counters – Structure and Mechanics + +1. A Counter is a conceptual entity that tracks a quantity over a defined period of time +2. For example, a Counter may track: + 1. Customer’s total spend per month + 1. Use Case example: to award customers who spend more than 1,000 a month + 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. + 2. The total points earned by an Account in the entire Campaign + 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign ![](data:image/png;base64...) + 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. + 3. The number transactions awarded at individual merchants (Store Ids) per month + 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign + 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. +3. The key data entities making up Counter are defined in the following table: + +| | | | | | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | **Data Entity** | | **Description** | | | | | | | | | | | +| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | +| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | +| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | +| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | +| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | +| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | +| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | +| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | +| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | +| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | +| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | +| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | +| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | +| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | +| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | +| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | +| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | +| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | +| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | +| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | +| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | +| | | | DY | | SD = FSD | | | | | | | | | +| | | | MN | | SD = Start of Month of FSD | | | | | | | | | +| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | +| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | +| | Reset Value | 9(16,2) | | | | | | | | | | | | +| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | +| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | +| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | +| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | +| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | +| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. ![](data:image/png;base64...) | | | | +| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool_Definition table where ATG of the pool is selected ATG. | +| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | +| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign_Rule table by specific pool Id | +| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign_Rule” table by specific Campaign Rule ID~~ | +| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign_Rule” table by specific Campaign Rule ID | + +#### Post-condition + +1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: + 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. + 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). + 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. + 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. + +* Example of an ATSP comprising 2 Account Types + +ATSP Id PA Level PA Type Sequence Number + +| 11 | | 830 550 | | 10 | + +| 11 | | 830 630 | | 20 | + +When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account + +*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. + +*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. + +1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: + +* A = set of all Acct Types of Cust +* B = set of Acct Type in ATG of Pool +* C = Intersection of A and B + +**Therefore**: + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. + +**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. + +1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. + +* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. +* If CIF number is provided only then TP base on following process to find eligible account to process: + +A = set of all Acct Types of Customer + +B = set of Acct Type in ATG of Award Pool + +C = Intersection of A and B + +**Therefore:** + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. + +**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. + +1. ATG is used to validate blocked transaction. +2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Reward Campaign + +#### Requirement Definition + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. +3. A single transaction can trigger multiple concurrent award programs. +4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +5. Type of campaign in OLS: + +* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: + +![](data:image/png;base64...) + +* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: + +![](data:image/png;base64...) + +1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. + +#### Wireframe + +Refer wireframe on figma. + +#### Business rules + +* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) + +1. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) +2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Create/Edit mode** | | | | +| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | +| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | +| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | +| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | +| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | +| | **Campaign Target** | | | +| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | +| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | +| **View mode: Display all field of create mode and add following fields:** | | | | +| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | +| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | +| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | + +#### Post-condition + +#### Exception flow + +### Reward Campaign Rule + +#### Requirement Definition + +* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. + 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. + 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. + 4. In this version we support following Campaign Rule type: +* Award +* Redeem +* Adjust +* Item Redemption +* Counter Extract and Process +* Redeem Extract and Process +* Transaction Extract and Process + 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust + +#### Process flow + +#### Trigger + +#### Pre-condition + +* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. + +#### Wirefame + +Refer to Figma. + +#### Business rule + +* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe + 3. Campaign Rule Screen can be display as a submodule of Campaing module as well + 4. **Screen description for Edit/Create mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Choose rule type to configurate campaign Rule** | | | | +| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool_Definition" table. Refer "Pool Definition" API under Campaign Management. | +| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | +| **Step 4: Formula setting** | | | | +| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | +| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code_Management" table where code type is "amt-to-use-formula" | +| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | +| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code_Management" table | + +#### Post-condition + +* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. + +#### Exception flow + +N/A + +### One tester (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition diff --git a/docs/staging/specs/campaign/special_rule_types.md b/docs/staging/specs/campaign/special_rule_types.md new file mode 100644 index 0000000..5a60f4d --- /dev/null +++ b/docs/staging/specs/campaign/special_rule_types.md @@ -0,0 +1,264 @@ +| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +REP batch job extract balance based on REP rule type configure. + +=tbd== + +#### Exception flow + +### Item Redemtion Rule Type (ITRD) + +#### Requirement Definition + +Item redemption Rule Type is used to to evaluate item redemption transactions. + +The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. + +Redemption pool which be used to redeem wil be configured in item price instead. + +#### Process flow + +Update later + +#### Trigger + +If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +Please refer Award Rule Type. + +#### Business rules + +* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". + 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | + +#### Post-condition + +To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Transaction Rule Analysis (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +### Campaign Insight + +#### Requirement Definition + +* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. + +#### Process flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. +2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. +3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. +4. OLS support following chart: + +##### Top 10 Best customer of the campaign + +* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter key** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | +| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | +| **Layout:** ![](data:image/png;base64...) | | | +| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | +| | View all | Use scroll bar to view full list top 10 best customer. | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | + +##### Number of enrrolled customers not - eligible because of criteria + +This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. + +Dashboard descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | +| **I: Layout 1** ![](data:image/png;base64...) | | | | +| **Filter key** | | | | +| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | +| | Period | | Last 12 months | +| **Layout description** | | | | +| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | +| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | +| **II : Layout 2** ![](data:image/png;base64...) | | | | +| **Filter** | | | | +| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | +| **Layout description** | | | | +| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | +| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last_update_date of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | + +##### Number of enrolled customers eligibe vs not- eligible because of criteria + +This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. + +1. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Descriptions** | +| **Filter** | | | +| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | +| | Period | Last 12 months | +| **Layout:** ![](data:image/png;base64...) | | | +| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | +| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | +| **Data source** | | | +| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS_ORPHAN_TXN_NO_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | + +##### Earned points Vs redemmed points + +* + 1. This chart used to compare total earned point with total redeemed point during each selected period. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | +| **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | +| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | +| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | + +##### Redemptions point on each channel + +* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Icon ![](data:image/png;base64...) | Icon for each channel: Item redemption Automation redemption Pay with Points. | +| | Total redemmed points and rate ![](data:image/png;base64...) | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | + +##### Redemption on each item type + +* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | +| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | +| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | + +##### Customer’s activities + +* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. + 2. **Dashboard descriptions** + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Month | Last 12 months | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | +| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | +| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | +| **Data source** | | | +| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last_update_date in OLS system to determine period. | | + +##### Campagin statistic + +* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter: Just use for detail listing only** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | +| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Campagin statistic ![](data:image/png;base64...) | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | +| | Detail listing ![](data:image/png;base64...) | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | diff --git a/docs/staging/specs/campaign/transaction_codes.md b/docs/staging/specs/campaign/transaction_codes.md new file mode 100644 index 0000000..bfcfeaf --- /dev/null +++ b/docs/staging/specs/campaign/transaction_codes.md @@ -0,0 +1,208 @@ +### External Transaction Code + +#### Requirement Definition + +* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. + 2. The External System TC is the first key is located OLS TC for processing the transaction. + 3. The TC values will be agreed with users at the time of setting up the system. + 4. Each External Transaction Code must have an OLS Transaction Code associated with it. + +For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. New transaction code coming from external system then user have to define new external TC in OLS. + 2. Some description should be adjusted then user have to modify. + 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. + +#### Pre-Condition + +* 1. Users have to have the access right on this screen in order to accesss this screen. + 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Detail view + 2. Detail view + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | +| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | + +1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/Edited. + +#### Post-condition + +1. User able to proceed to OLS Transaction Code screen. See in section 4.5 + +#### Exception flow + +1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. + +### OLS Transaction Code + +#### Requirement Definition + +1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. +2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. +3. For example: + 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New transaction code coming from external system then the user has to define new OLS TC also. +2. New OLS transaction coming from internal transaction. +3. Some detailed information should be adjusted then the user has to modify it. +4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. +3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Summary listing page + +![](data:image/png;base64...) + +Figure 2 – Filer and quick search + +1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status ( History) + +![](data:image/png;base64...) + +1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | +| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | +| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | +| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | + +1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/edited. + +#### Post-condition + +1. User able to proceed to Campaign Rule Set-up. See section>>>>> + +#### Exception flow + +1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. + +If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. + +Therefore If the 4 conditions are are captured as transaction category then we have: + +TxCat1 = Dining txns, local currency + DCC + +TxCat2 = Entertainment txns, local currency + DCC + +TxCat3 = Dining txns, foreign currency + not DCC + +TxCat4 = Entertainment txns, foreign currency + DCC + +To archive this campaign, when define the transaction category we just need: + +* One counter under Account-TxnCat couter level +* One CEP rule to extract counter value to trigger award rule to get award points/cash back. +* One Campaing Rule using F6 to fulfilment this requirement. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup + +#### Sktech + +* + - 1. Create/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. +2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same category. +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **General information** | | | | +| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | +| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | +| | Description/Mô tả | Description for refer only | X(100) | diff --git a/docs/staging/specs/catalogue/catalogue_category.md b/docs/staging/specs/catalogue/catalogue_category.md new file mode 100644 index 0000000..405b212 --- /dev/null +++ b/docs/staging/specs/catalogue/catalogue_category.md @@ -0,0 +1,105 @@ +### Catalogue + +#### Requirement Definition + +* + - 1. A Catalogue must be defined and all items to be included in the Catalogue must be tagged with the Catalogue code before customers access the items. + 2. A Catalogue code is tagged against each Item Master record. + 3. More than one Catalogue can be configured at the same time, but each Catalogue must have its own set of Item master records. + 4. Each Catalogue has a Start / End date range and items in the Catalogue will be picked for presentation to customer only if the current date falls in the Start / End date range for that Catalogue. + +#### Process Flow + +==tbd== + +#### Trigger + +* + - * 1. If an item is to be tagged to a Catalouge that has not yet been defined. + +#### Pre-condition + +1. Users have to have access rights in “Catalogue” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve catalogue records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Catalouge icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Catalouge is illustrated in section 7.2.5. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin chung** | | | | +| | Catalogue Code \*/Mã nhóm danh mục | User-specified code identifying the catalogue. Used by front-end system when requesting for item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this catalogue. For user reference only. Default description which will be used in case there is no specific description for chosen language. | X(50) | +| | Effective From Date \*/Có hiệu lực từ ngày | Catalogue is effective only when the processing date is between Start Date and End Date, inclusive. | Date | +| | Effective To Date \*/Có hiệu lực đến ngày | Date | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of catalogue | Image | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this catalogue. For user reference on MP only. | X(100) | + +#### Post- Conditon + +The Catalouge information for each item can be returned to the front-end during an Item Enquiry response message for the front-end to use in searching the catalogue for items. + +#### Exception Flow + +N/A + +### Category + +#### Requirement Definition + +A catalog is the main folder to organize categories and items for materials. A category is a group within a catalog that contains items. All items to be included in the Catalogue must be tagged with the Category code. Multiple Categories can be linked to form a hierarchy of categories. The hierarchy of categories is used on Member site. + +#### Process Flow + +#### Trigger + +If an item is to be tagged to a catagory that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Category” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve category records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on the category icon in the navigation panel under OneCatalouge to get a listing of existing catalogues. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the category is illustrated in section 7.3.4. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin Chung** | | | | +| | Category Code \*/Mã danh mục vật phẩm | User-specified code identifying the category. Used by front-end system when requesting item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this category. For user reference only. Default description which will be used in case there is no specific description for the chosen language. | X(100) | +| | Effective From Date /Có hiệu lực từ ngày | Category is effective only when the processing date is between the Start Date and the End Date, inclusive. If an effective date is not provided then this is a non-expire category. | Date | +| | Effective To Date /Có hiệu lực đến ngày | Date | +| | Parent Category | Multiple Categories can be linked to form a hierarchy of categories. | Drop-down Select one The parent categories value from master data. | +| | Display Ordering /Thứ tự hiển thi | The display ordering sequence on the Member Site. | 9(3) | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of the category. | Image | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condition field This field is only active and required when the image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this category in the choosen language. For user reference on MP only. | X(100) | + +#### Post –Condition + +#### Exception Flow + diff --git a/docs/staging/specs/catalogue/item_master.md b/docs/staging/specs/catalogue/item_master.md new file mode 100644 index 0000000..a57f03d --- /dev/null +++ b/docs/staging/specs/catalogue/item_master.md @@ -0,0 +1,78 @@ +### Item master + +#### Requirement Definition + +Describe details about a particular item: e.g. prices, quantities, availability dates, terms and conditions, etc. Item Master Records cannot be created unless the Stock Code is in place. + +#### Process Flow + +#### Trigger + +New items need to be defined. + +#### Pre –Condition + +1. Users have to have access rights in the “Item Master” screen under the “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Item Master records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Master is illustrated in section 7.4.4 +3. **Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information: Mandatory Step** | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The Catalogue for which this item is being configured. | Drop-down Select one | +| | Category/Danh mục vật phẩm | Select the category under which this item is to be tagged, to facilitate searching in the customer-facing page – e.g. Retailer Vouchers, Frequent Flyer Points, Cash Rebate, etc. | Drop-down Multiples select | +| | Item Code\*/Mã vật phẩm | Enter the item code to be added to the catalogue. This is Item identify. | X(10) | +| | Item Name \*/Tên vật phẩm | Short description field used by customer-facing application for display for Catalogue item. The text can include control characters. This is default name in case there is no specific item name of chosen language in the member site. | X(50) | +| | Redemption From Date From\*/Có hiệu lực từ ngày | “**From Date**” & “**To Date**” specify the period within this item is available and may be included in the Catalogue display and when after which it becomes unavailable and is excluded from the Catalogue display. OLS will reject the Start Date and End Date if they are outside the Catalogue/Category Start Date and End Date period. Once the item has been started for redemption, only End date will be allowed to modify. | Date | +| | Redemption To Date \*/ Có hiệu lực đến ngày | Date | +| | Redemption Store /Đối tác | Supplier of this item. The merchant (Store) that has to be configured appropriately in order for straight-through settlement processing. | Drop-down Select one | +| | Redemption Transaction Code\*/Mã giao dịch đổi thưởng | OLS TC used for redemption processing and logging. | Drop-down Select one | +| | Award Transaction Code/Mã giao dịch tặng thưởng | OLS TC If selected, the **OLS** **Transaction Code”** used to locate any award campaign rules to be executed as a result of the catalogue item redemption. | Drop-down Select one | +| | Item Type \*/ Loại vật phẩm | The type of item Choose one of following types : * + 1. Miles 2. Physical 3. eVoucher 4. Donation 5. Cash rebate 6. Other | Radio button Item type list from master data | +| | Voucher Code /Mã voucher | Condition field A drop-down to select voucher code This field is only active and required when item is an eVoucher | Drop-down Select one | +| | Face value/ Partner Point / Giá trị vật phẩm | Condition field This field is only active and required for Cash rebate/eVoucher/Miles item. This is the value of the cash rebate/voucher /miles that customer sees. This value is not used if the Face Value is also specified in the Item Price set-up | 9(14,2) Should be positive value | +| | Display on Member Site | Turn off to restrict this item in member site. | Switch button Default ON | +| | Hot item /Vật phẩm hot | Condition field This field is active only when this item is displayed on the member site Choose to indicate this is a hot item. Used to display on Member Site. | Switch button Default OFF | +| | Display Ordering/ Thứ tự hiển thị | Condition filed This field is active only when this item is displayed on the member site The ordering sequence to display on member site | 9(3) Should be greater than 0 if provided | +| | Track Quantiy on Hand/ Theo dõi số lượng vật phẩm | ON mode if the item is an item and that requires inventory control: the “Quantity-on-Hand” is updated for such items during redemption. If this is a Voucher Code item, this field is force-set to Yes and cannot be changed. | Switch button Default OFF | +| | Initialize Quantity of Stocks/ Số lượng ban đầu | Condition filed This field is only active and required if track quantity on hand. Canot edit this value if this item has been redeemed. This field is not activated for the Evoucher item due to the number of voucher being generated by another feature (via the Voucher Code screen or batch file). | 9(9) Should be positive value. In case item has been redemmed, then not allow to modify this field. Just display only | +| **Item detail : Mandatory step** **This step involves configuring the details of each item in multiple languages. By doing so, the system can utilize the specific details tailored to each language.** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific item detail. | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Item name\*/Tên vật phẩm | Specific item name in the choosen language. | X(50) | +| | Item Description/Mô tả vật phẩm | Specific item description in the chosen language. | X(100) | +| | Item content/Thông tin chi tiết | The content of item in the choosen language | X(2000) | +| | How to use /Cách sử dụng | The way to use the item in the choosen language | X(2000) | +| | Term and Conditon/ Điều khoản | Term and Conditon Free text to be returned in the Terms and Conditions field in the Web Service message and in redemption output template letters and email. | X(2000) | +| **Item Image /Ảnh vật phẩm** Optional step | | | | +| | Select image | Click to add image for item | Button | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condiiton field This field is only active and required when image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Sort Order | The display odering sequence on Member Site. | 9(3) Should be greater than 0 if provided | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Contact and Address information** Optional step | | | | +| | Add Address | Click to add item address where we can to use this item | Button | +| | City\* | The drop-down to select the city where can use this item | Drop-down Select one | +| | Address | Address detail | X(200) | +| | Email | Email address | X(100) | +| | Phone | Phone number | X(20) | + +#### Post-Condition + +* + 1. The newly created item should have all required fields populated with valid data. + 2. The system should add/updated items in the database. + 3. Other screen which lookup to item screen must be able to use new item. + +#### Exception Flow + diff --git a/docs/staging/specs/catalogue/item_price.md b/docs/staging/specs/catalogue/item_price.md new file mode 100644 index 0000000..6897622 --- /dev/null +++ b/docs/staging/specs/catalogue/item_price.md @@ -0,0 +1,85 @@ +### Item price + +#### Requirement Definition + +* + - 1. Outlines the specifc criteria, functionalities and parameter that determine and manage item prices in the OLS: + 1. Point valuation: Define the conversion rate between reward points and redemption quanity (e.g 100 point = 1 Ticket movie voucher) to establish the baseline for item redemption. + 2. Criterions pricing: specify if different pricing tiers will be available for customer based on their account type or redemption channel or specific criterions such as gender, redemption quantity,etc. + 3. Redemption options: Define the types of items price available for redemption, including using point only or both cash and points. + +#### Process Flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. New item is defined and must define item price to process redemption processing for this item. + 2. If an item is to be tagged to a price that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Item Master” screen under “OneCatalouge” module. +2. User have to have access rights in “Item Price” Screen under “OnCatalouge” module. +3. Depending on the user's access rights, they can view, add, edit, or approve Item Price records. + +#### Wireframe + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing item master. +2. Click to view detail any active item master records to bring up the “Item Price” screen as a new tab under item master detail record. +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Price is illustrated in section 7.5.5 +4. **Edit Screen Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | Item Code \*/ Mã vật phẩm | Item code | Display if configure item pirce under specific item. Drop-down list to select an item code to configure the item price | +| | Price Code\*/Mã giá | The identify of the item price For user refrence only | X(10) | +| | Pirce Name \*/Tên giá | Default name of the price For user reference only | X(100) | +| | Effective Start Date \*/ Hiệu lực từ ngày | **From Date**” & “**To Date**” specify the period within this price. | Date | +| | Effective End Date \*/ Hiệu lực tới ngày | Date | +| | Redemption Channel \*/Kênh đổi thưởng | The drop-down to select the redemption channel. Supported channels are: Call Center Mobile Application Internet Banking Etc | Drop-down Select one | +| | Account Type Group/Nhóm loại tài khoản | Optional filed If Account Type or Account level is selected then account type group is blocked and vice versa. | Drop-down Multi-select | +| | Product Account Level /Hạng tài khoản | Optional field The drop-down to select the Account level (Card Level) to this this price applies. Leave as empty if all Account level are applies to this prce. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Select one | +| | Product Account Type/Loại tài khoản | Optional field Optional field Multi-select drop-down to select the Account Type (Card Type) of selected account level in previous step which will be applies to this price. Leave as empty if all account types of selected PAL are applies to this price. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Multi-select | +| | Redemption Pool\*/Pool đổi thưởng | Select the Pool from which to deduct points for redeeming this item | Drop-down Select one | +| | Use Only Points from Selected PA Type/Chỉ sử dụng điểm từ các loại nhóm tai khoản được chỉ định | Restrict the use of points for redemption of this item at this price to only points earned by the selected account Type/ATG | Switch button Default OFF | +| | Face value /Trị giá vật phẩm | If transacting Customer/Account meets the criteria in this set-up, what the Customer receives is this “Face Value”. E.g. if this is 500 KrisFlyer Miles, Customer receives 500 KrisFlyer Miles for redeeming one of this item. | 9(12,2) Should be greater than 0 if provided | +| | Price in point \*(Full redemption) / Giá trị điểm | Price of item if paid for fully in points from the selected Pool | 9(12,2) Should be greater than 0 if provided | +| | Original price /Giá gốc | The original price of the item For user reference only | 9(12,2) Should be greater than 0 if provided | +| | Partial Redemption Allowed/Cho phép đổi thưởng 1 phần | If allowed, customer can use a mix of points and cash to pay for this item. The number of points and amount of cash are derived from “Price in Cash Value-per Point” and “Minimum Partial Redeem Points”. See the description for these fields. | Swith button Default OFF | +| | Minimum Partial Redeem Points/Số điểm tối thiểu | Condition field This field is only active and required when Partinal Redemption is allowed. Customer must use at least this number of points to redeem this item. | 9(12,2) Should be greater than or equal to 0 if provided 0 for full cash redemption | +| | Cash per point/ Số tiền chi trả | Condition field This field is only active and required when Partinal Redemption is allowed. This is used to calculate the amount of cash required to redeem this item after taking into account the points redeemed, if any. | 9(12,2) Should be greater than 0 if provided | +| | Appliable Taxes | The drop-down list to select the tax rate to be applicable. | Drop –down Select one Get data from “Tax Rate Maintenance” Screen | +| **Price detail :** **Optional step. If not provide then use default item price name to display if needed** | | | | +| | Select language /Chọn ngôn ngữ | Click to add item price detail on each language For user reference only | Button | +| | Language \*/Ngôn ngữ | The drop-down to select the language to setup the specific item price detail | Drop-down Select one | +| | Item price Name \*/Tên giá | The specific name of chosen language For user reference only | X(100) | +| | Description/ Mô tả | The description of the price For user reference only | X(500) | +| **Item criteria** A part to add criteria to meet the price The approach the same as Rule criteria but just display all criteria which be tagged to “Item price “ module only | | | | +| | | ![](data:image/png;base64...) | Click to add new criteria | +| | | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | +| | | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | +| | | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute and to be tagged for “Item Price “ module | +| | | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. | +| | | ![](data:image/png;base64...) | Click to delete criteria | +| | | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | + +#### Post-Condition + +With the item price configuration then here is the flow to get item price. + +Valid price + +![](data:image/x-emf;base64...) + +What is the price of the transaction + +![](data:image/x-emf;base64...) + +#### Exception Flow + diff --git a/docs/staging/specs/catalogue/voucher_code.md b/docs/staging/specs/catalogue/voucher_code.md new file mode 100644 index 0000000..b4e8fc2 --- /dev/null +++ b/docs/staging/specs/catalogue/voucher_code.md @@ -0,0 +1,90 @@ +### Voucher Code + +#### Requirement Definition + +1 If the Item to be set up is for distribution of Voucher Numbers to customers, and these Voucher Numbers are from external partner merchants, then the Voucher Numbers must first be set up in OLS by uploading/creating the stock of Voucher Numbers. + +2 This voucher upload file must contain the Voucher Code (which identifies what this voucher is for – e.g. “$5 Lazada Voucher”), the period within which the vouchers are accepted at the partner merchant, and the individual voucher serial numbers (Voucher Numbers). + +3 The file format is set out later (to be decided). + +4 This upload can be done using the “Upload” functions in this screen. + +#### Process Flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have access rights in “Voucher Management” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Voucher records. + +#### Wireframe + +* + - 1. **Create/Edit mode** + +![](data:image/png;base64...) + +* + - 1. **View mode** + +![](data:image/png;base64...) + +1. Listing page +2. **Voucher Detail view** + 1. Listing Page + +![](data:image/png;base64...) + +* 1. View + +Click to any record on the listing page to bring up the detail view as following: + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Voucher icon in navigation panel under OneCatalogue to get a listing of existing Voucher Code as illustrated in section Wireframe. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Voucher is illustrated in section Wireframe. +3. Double click on any existing record in Active Tab then the Voucher Detail listing is illustrated in section 7.6.5. +4. The system just allow to view the Voucher detail only. +5. Can not allow deleting the voucher Code if voucher have been redeemed. +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Screen 1: Voucher Code** | | | | +| | **Voucher statistic / Tổng hợp thông tin voucher** **This is displayed for active record only** | | | +| | Total Voucher /Tổng voucher | Total the serial number voucher belong to the choosen voucher code | Display as interger format | +| | Available Vouchers /Số voucher khả dụng | Total the valid voucher and ready to use: The voucher has not yet been redeemed and non- expired. | +| | Redeemed Vouchers/ Voucher đã đổi thưởng | Total the numner of the successfully redeemed vouchers. | +| | Cancelled Vouchers/ Voucher đã hủy | Total the number of the fail redeemed vouchers which is cancelled by customers/system by specific reason. | +| | Expired Vouchers/Voucher đã hết hạn | Total the number of expired voucher that has not yet been redeemed. Use processing date to compare with expiry date of the voucher. | +| | **Voucher Code Detail information** | | | +| | Voucher Code\*/Mã voucher | Identifies the voucher. | ~~X(20)~~ X(10) | +| | Description /Mô tả | The description of the voucher. For user reference only. | X(100) | +| | Supplier / Nhà cung cấp | The partner/ organization that issues or provides the voucher | Drop-down Select one | +| | Expiry Policy \*/ Hạn sử dụng | A drop-down list with the following choices: * Fixed Date: Voucher will expire after the date specified in the “Expiry Date” parameter. * N days from Transaction Date: Voucher will expire after N days from Redemption Date (Transaction Date). * N days from Post Date: Voucher will expire after N days from redemption transaction is posted on the OLS. * N Months from Transaction Date: Voucher will expire after N months from redemption Date. * N months from Post Date: Voucher will expire after N moths from the moment a redemption transaction is posted on the OLS. | Drop-down Select one | +| | Expiry Date / Ngày hết hạn | Condition field This field is only active and required when the expiry policy is “Fixed Date”. **A transaction which redeem this voucher is not allowed to have Transaction Date later than this date.** Can not allow editing the policy (including the relative field that be used to determine expiry date of the voucher) | Date | +| | N Param/ Tham số N | Condition field This field is only active and required when the Expiry Policy selected in the previous step requires a parameter N param. e.g. “N days from Transaction Date” | 9(3) Should be greater than or equal to 0 if provided | +| | Generate Voucher /Khởi tạo voucher | Turn on when the voucher is generated by OLS instead partner. The system will automation create the number of vouher which user will provide on next step. This field can’t be changed if the voucher have been redeemed. | Swith button Default OFF | +| | Quantity /Số lượng | Condition filed This filed is only active and required if “Generate Voucher” in the previous step under ON mode. Specifies the number of voucher codes to be generated. **When a voucher code record is approved in the system, the system should automatically generate voucher numbers corresponding to the entered quantity.** This field can’t be changed if the voucher have been redeemed. In case users want to change then it should be “re-stock”/ “void” voucher use case instead. | 9(5) Should be greater than 0 if provided | +| | This is a promo code/ Đây là mã khuyến mãi | Turn on when this is a promo code. For user reference only | Swith button Default OFF | +| | ~~Voucher Type/Loại voucher~~ Promotion Type/Loại khuyến mãi | Conditon filed This field is only active and required when this voucher is a promo code. A drop-down list with the following choices: * Fixed Percentage Discount: This type of voucher offers a discount as a percentage of the total purchase amount. * Fixed Monetary Value Discount: Instead of a percentage, this voucher provides a fixed monetary discount. * Cashback Voucher: For this type of voucher, the customer receives a certain percentage of the purchase amount back as cashback to use on future purchases. * Gif Voucher: This type of voucher is often purchased as a gift for someone else. It typically has a fixed monetary value that the recipient can use towards their purchases. | Drop-down Select one | +| | Value /Giá trị | The specific value which customer can get from chosen voucher type. Condition field This field is only active and required when “Fixed Monetary Value” / “Fixed Percentation Discount” are selected on the previous step. | 9(14,2) Should be greater than 0 if provided | +| **Screen 2: Voucher Detail** **Each voucher No is displayed under one detail record in listing page** **Voucher detail is introduced as a subtab of Active voucher record.** | | | | +| | Voucher Code | Choosen voucher code | Display | +| | Voucher No | The serial voucher number of choosen voucher | +| | Redemption Date | The date when voucher is redeemed | +| | Expiry Date | Expiry date of the voucher number which is based on choosen expiry policy of the choosen voucher | +| | Redemption Indicator | One of following values: * No: If voucher is not used for any redemption transaction. * Yes: If voucher have been redeemed by customer. | +| | Fulfillment Status | One of following values: * New: When voucher is created/uploaded in OLS then the fuillment status should be new to indicator that voucher to be availbale to redeem. * Issued: The FFS is changed into Issued when voucher is successfully redeemed in the OLS. * **Fulfilled: The FFS is changed into Fulfilled when voucher is successfully redeemed and partner accept this voucher.** * Cancelled: FFS is changed intpo “Cancelled” if the customer cancels the transaction or if there are issues with the voucher that prevent its redemption. * Rejected: The vendor has rejected the voucher due to some reasons such as term and conditions, policy changes.etc. The fufillment status is updated when fulfilment status is changed. | + +* + - 1. User who can create new voucher can use “upload” function to upload the voucher file into OLS + +#### Post-Condition + +#### Exception Flow + diff --git a/docs/staging/specs/customer/account.md b/docs/staging/specs/customer/account.md new file mode 100644 index 0000000..393186a --- /dev/null +++ b/docs/staging/specs/customer/account.md @@ -0,0 +1,112 @@ +### Account + +#### Requirement Definition + +Account tab show all customer’s holding account. + +Account information means anything relating to customer’s holding acccount which sent from external system to OLS or Added by user via OLS system. + +#### Process flow + + +#### Trigger + +N/A + +#### Pre-condition + +1. Users have to have access rights in both “Customer Profile” and “Account” modules under “Customer Mangement” Group in order to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Account” tab. +3. An account type must be available in the OLS system before adding any account of that type. + +#### Wireframe + +Summary listing page + + +Figure 1: Listing page + + +Figure 2: Filter + +Add/Edit mode + + + +Detail view + +* 1. Record detail + + +* 1. Record status and history + + +#### Business Rules + +Account records are updated in the external system and then loaded into OLS. + +Account records can be added by adding functions in administration screens. + +Click on the Account tab in the Customer profile screen to bring up the Account listing as illustrated in the [wireframe](#_Wireframe_4). + +Use the filter to locate a particular Account, which will be listed in the display. + +Click on a row to view details of the Account record, as illustrated in the [wareframe](#_Wireframe_4). + +Screen description + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | | | **Data type** | +| | CIF numnber\* / Số CIF) | CIF number of selected customer | | | Display | +| | Product Account Level (PAL) \* /Hạng tài khoản | Product Account Level of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_LEVEL table Refer to “ Product Account Level” API under “Code Maintenance” | +| 2. | Product Account Type (PAT)\* /Loại tài khoản | Product account type which belongs to selected PAL that assigned to Account Combination PAL and PAT as Account Type of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_TYPE table where PAL as selected PAL Refer “ Product Account Type” API under “Code Maintenance” | +| 3 | Account Number\*/ Số tài khoản | Product Account Number | | | X(20) Combination Account Type + Account Number should be unique. An Combination Account No + Account Type is assigned to an ASN. ASN is unique in the OLS system | +| | Account Open Date \*/Ngày mở tài khoản | Product Account Open Date | | | Date The date format must adhere to the configured format | +| | Account Indicator\*/ Chỉ thị tài khoản | P- Personal account C- Corporate Account | | | Drop-down Select one Lookup value from “Code Management” table where type code is “Acct-indicator”. Refer “List-by-code-type” API under Master Data. | +| | Account block code/ Mã chặn tài khoản | The account block code is used to check block transaction via TP or on some MQ validation | | | X(10) | +| | Block code reason / Mã lí do chặn tài khoản | Reason to block account | | | X(100) | +| | Block code last update date/ Ngày chặn cuối cùng | The day to block account | | | Date The date format must adhere to the configured format | +| | Cycle / Ngày sao kê | Statement cycle date | | | 9(02) Should be greater than 0 if provided | +| | Account status\*/ Trạng thái tài khoản | Product account status The Account status is used to check block transaction via TP or on some MQ validation | | | Drop-down Select one Lookup value from “Account Status” screen (Account_status table). Refer “Account status” API under Code Maintenance | +| **Card information/Thông tin thẻ** When click to view any active account then this pannel is display to show the card of cards belong to selected account. The pannel includes following information: | | | | | | +| | Card number / Số Thẻ | | Card Number | Display Lookup value from Card_Product_Account_Rel table where account is selected account. Refer “Card” API under Customer Management | | +| | Card status/ Trạng thái thẻ | | Card Status Display both code and description of status | Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-status”. Refer “Card” API and “get-by-code-type” API | | +| | Card Indicator/Chỉ thị thẻ | | Card indicator Display both Code and description of indicator | Display Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-indicator”. Refer “Card” API and “get-by-code-type” API | | +| | Card Creation Date/ Ngày tạo thẻ | | Creation Date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card Expiry Date /Ngày hết hạn | | Expiring date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | CIF number/ Số CIF | | CIF number of Card | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card block code/Mã chặn thẻ | | Card block code | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | + +Each account is belong to only one Customer. OLS don’t support to change CIF number of account in this screen. If have to change CIF number of the account then it should be processed via CIF Merge batch if needed. + +Records added thru this screen cannot be updated by records from the OLSACCT batch. Record created/updated by OLSACCT batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + +When an account is added then: + +* If locate any exiting record with the same combination Account No+ Account Type in OLS (record status is “A”) then the record is rejected. +* If not then: + + - Account record is added in PRODUCT_ACCOUNT table. + - The corresponding LOYALTY_ACCOUNT_PRODUCT is created + +When an account is modified then : + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then update Product Account fields with the incoming field values accordingly. The original record is moved to his table after record is approved. +* Upgrade Account case :==tbd=== + +When account is deleted then: + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected +* If locates a Product Account record that has a Card record with record Status “A” linked to it, the incoming delete action is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then move record into history table. The corresponding LOYALTY_ACCOUNT_PRODUCT is moved to his table as well. + +#### Post – Codition + +* 1. Allow to add Card. + 2. Allow to post transaction with new account. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/customer/attribute_counter.md b/docs/staging/specs/customer/attribute_counter.md new file mode 100644 index 0000000..27ab29b --- /dev/null +++ b/docs/staging/specs/customer/attribute_counter.md @@ -0,0 +1,159 @@ +### Attribute + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according attribute: + 1. Customer profile screen dislays customer information and Customer attribute lisitng. + 2. Account Detail screen dislays Account information and Account attribute of customer. + 3. Card detail screen displays Card information and Card attribute of customer. + 1. In new OLS version Attribute will be displayed on separately tab under Customer profile module. + +#### Process flow + + +#### Trigger + +* + 1. User would like to review/ verify attribute detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Attribute” modules under “Customer Mangement” Group to able to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Attribute Enquiry" tab. + +#### Wireframe + +* + - 1. Summary listing page + + +Figure 1: Listing page + + +Figure 2: Filter + +* + - 1. Detail view + 1. Record detail + + +* 1. Record status and history + + +#### Business rules + +* + - * 1. Get data from ATTRIBUTE_VALUE table. The attribute values inserted/update form OLS batch process (Attribute maintenance batchs or OMR batch job) OR can be updated by the Attribute maintenance batch as well as by Campaign Rules. + 2. This screen just display atribute value only. There is no further action. + 3. The Attributes listing screen is accessed from the Attribute Tab in the Customer profile module. Clicking on the Attributes Tab will bring up a listing of Attributes, as illustrated in the [wireframe](#_Wireframe_7). + 4. In this screen will display all attribute of customer including Customer attribute/Account attribute/ Card attribute. + 5. Clicking on the Attribute value row in listing page will bring up the attribute value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Attribute value detail field + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/Vn)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity ID and Effect date. | | | | +| | Entity /Thực thể | Optional field Including: Client/Product_Account/ Card If Client entity is selected then listing all customer attribute of customer. If Product_Account entity is selected then listing all account attribute of customer. If Card entity is selected then listing all card attribute of customer. If Entity is not provided then get all attribute of customer which under Customer/ Account/Card entity level | Drop-down Allow multiple select. Default as empty | +| 2. | Effective Date From /Ngày bắt đầu có hiệu lực | Mandatory Listing attribute value during selected date frame. | Date time | +| 3. | Effective Date To/Ngày kết thúc hiệu lực | +| | Only effective records listed/Chỉ hiển thị các giá trị thực thể có hiệu lực | Use processing date to compare with attribute value effective date. If selected then only effective records listed If non-select then all attribute record including expired attribute value records listed | Check box Default as selected | +| **Attribute value detail field / Thông tin chi tiết thuộc tính** | | | | +| | Attribute Group/Nhóm thuộc tính | Attribute group of attribute | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Attribute ID/ID thuộc tính | Attribute ID | Display Lookup value from ATTRIBUTE_VALUE table | +| | Attribute Name / Tên thuộc tíng | Attribute Name | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity / Thực thể | Entity level of attribute Indicates the Entity to which this Attribute belongs Client: Customer Product_Account : Account Card: Card | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity ID/ ID thực thể | The identifier for the Entity to which the Attribute value in this record belongs. If Entity is : • “Product_Account”, this field contains the PA Number • “Card”, this field contains the Card Number • “Client”, this field contains the CIF Number * “Store”, this field contains the Store ID * ……etc…. | Entity value will be : * + 1. CSN for customer attribute. 2. ASN for account attribute 3. PSN for Card attribute. Use Entity and Entity_ID of attribute for lookup according value: | +| | Account Type/ Loại tài khoản | Combinaiton of Product Account Level and Product Account Type of Account attribute. Present for Account attribute only | Display Lookup value from PRODUCT_ACCOUNT table | +| | Attribute value /Giá trị thuộc tính | Attribute value | Display Lookup value from ATTRIBUTE_VALUE table | +| | Effective Date From/ Ngày bắt đầu có hiệu lực | Start date of the effective period for the Attribute value | +| | Effective Date To/Ngày kết thúc hiệu lực | End date of the effective period for the Attribute value | +| | Campaign ID/ID chiến dịch | Campaign ID which reference to Campaign Rule | Display Lookup value from “Campaign Rule screen” | +| | Campaign Name | Name of Campaign | Display Refer to “Campaign “ API under Campaign Management Lookup value from “Campaign” table. | +| | Campaign Rule | Campaign Rules which reference to this attribute | Display Lookup value from “Campaign Rule” screen to list all campaign rules which includes this attribute on at least following items: * + 1. Attribute Criteria 2. Formula 8 3. Formula 7 4. Award limit | +| | Campaign Rule Name | Name of Campaign rule | Display Lookup value from “Campaign_Rule” tablle Refer “Campaign Rule” API under Campaign Management | +| | Effect date | The Effect date of Campaign Rule Dislay both Effective from date and effective to dat e | Display The date format must adhere to the configured format | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + +### Counter + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according Counter: + - Customer profile screen dislays customer information and customer -level counter listing + - Account Detail screen dislays Account information and account -level counter of customer. + - Card detail screen displays Card information and card -level counter of customer. + 1. In new OLS version Counter will be displayed on separately tab under Customer profile module. + +#### Process flow + +#### Trigger + +* + 1. Users would like to review and verify the counter detail of the customer. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Counter” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Counter " tab. + +#### Wireframe + +* + - 1. Summary listing page + + +Figure 1: Listing page + + +Figure 2: Filter + +* + - 1. Record detail + 1. Record detail view + + +* 1. Record status + + +#### Business rules + +* + - * 1. Get data from the table that updates the counter value (Campaign_Counter table). The counter values are inserted/updated from the OLS batch process that triggers the Campaign Rules as well as the OA screen. + 2. This screen just displays counnter value only. There is no further action. + 3. The Counter Detail listing screen is accessed from the Counter Tab in the Customer profile module. Clicking on the Counter Tab will bring up a listing of the counter, as illustrated in the [wireframe](#_Wireframe_8). + 4. In this screen will display all counter bucket for the chosen customer, including Customer-level counter/Account -level counter/ Card- level counter. + 5. Clicking on the Counter value row in listing page will bring up the counter value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Counter value detail field: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity level and Counter bucket period | | | | +| | Entity /Thực thể | Optional field Including: **Customer [CU]/ Account [PA] /Card [CA].** If “Customer[CU]“ is selected then listing all customer -level counter of customer. If “Account [PA]” is selected then listing all account- level counter of customer. If “Card [CA]”is selected then listing all card -level counter of customer. If Entity level is not provided then get all counter level of customer which under Customer/ Account/Card entity level. | Drop-down Allow multiple select. Default as empty | +| 2. | Bucket Start Date / Ngày bắt đầu | Mandatory Listing counter value during selected date frame. | Date | +| 3. | Bucket End Date/ | +| | Only effective records listed/Chỉ hiện thị counter hiện tại | Use processing date to compare with counter bucket period. If selected then only effective records listed. Use processing date to determine the effective of the counter bucket. If non-select then all counter value record including expired counter records listed | Check box Default as selected | +| **Counter value detail field** | | | | +| | Counter/Bộ đếm | Counter | Display | +| | Entity /Cấp bộ đếm | Entity counter level Cust- CU Account – PA Card – CA | Display | +| | Entity ID/ID thực thể | The identifier for the Entity to which the counter value in this record belongs. If Entity is : • “Account”, this field contains the Account Number • “Card”, this field contains the Card Number • “Customer”, this field contains the CIF Number | Display | +| | What to count/ Tiêu chí đếm | The data entity that is to be counted or tracked | Display | +| | Counter Value/Giá trị bộ đếm | Counter value | Display as number format | +| | Bucket start date | Start date of the bucket period for the Counter value | Display as date format | +| | Bucket end date | End date of the bucket period for the Counter value | Display as date format | +| | Counter state/Tình trạng bộ đếm | Counter state A: Awared C: New | Display Show state code only | +| | Reference No/ Số tham chiếu giao dịch | OLS Transaction Reference Number | Display | +| | Post Date /Ngày đăng | The post date of the transaction | Dipslay as date time format The date format must adhere to the configured format | +| | Counter Value/Giá trị bộ đếm | Counter value which is updated on this transaction | Display as number format | +| | Bucket Number/Số bộ đếm | The bucket number of selected counter | Display as interger number format | +| | Update Date | The system date when counter value is updated | Dipslay as date time format The date format must adhere to the configured format | +| | Updated by | The batch/User who post the transaction that make counter value is changed. | Display | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + diff --git a/docs/staging/specs/customer/card.md b/docs/staging/specs/customer/card.md new file mode 100644 index 0000000..195f419 --- /dev/null +++ b/docs/staging/specs/customer/card.md @@ -0,0 +1,100 @@ +### Card + +#### Requirement Definition + +Card tab show all customer’s card. + +Card information means anything relating to customer’s card which sent from external system to OLS or added by users on the OLS system. + +#### Process flow + + +#### Trigger + +N/A + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Card” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Card” tab. +3. An account must be available in the OLS system before adding any card of that account. + +#### Wireframe + +Summary listing page + + +Figure 1: Listing page + + +Create/Edit view + + + +Detail record view + +* 1. Record detail + + +* 1. Record status and history + + +#### Business rules + +Card records are updated in external system and then loaded into OLS, so OLS only provides view functions in administration screens for Card records. There is no further actions. + +Click on Card tab in Customer profile screen to brings up the Card listing as illustrated in the [wareframe](#_Wireframe_5). + +Use the filter to locate particular Card, which will be listed in the display. + +Click on a row to view details of the Card record, as illustrated in the [wareframe](#_Wireframe_5). + +Create/Edit screen description + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| | CIF number \*/Số CIF | CIF Number of Card | Drop-down Get data from Client table Default as CIF Number of selected customer but user can modify if Supplement Card is added. Support quick search CIF number by enterd al least 4 digits of CIF number. | +| | Account Type\*/ Loại tài khoản | Combination of Product Account Level and product account type PAT : Visa [001] PAL: Debit [830] Account type : 830-001 | Drop-down Lookup value from PRODUCT_ACCOUNT table where Account Type is Account type of select customer (Use CIF number which is selected from listing page). Refer to “Product account” API under “Customer Management”. | +| | Account number \*/ Số tài khoản | Product Account number | Drop-down All account of selected account type of selected customer. Refer to “Product account” API under “Customer Management” | +| 3 | Card number\* /Số thẻ | Card number | X(20) Must be unique value in whole system. | +| | Masked Card Number/ ==tbd== | Masked Card Number | X(20) | +| | Cardholder Name\*/ Tên chủ thẻ | Cardholder Name | X(50) | +| | Card Indicator\*/ Chỉ thị thẻ | Card indicator: S- Supplement Card P – Principal Card K – Corporate Card …. For principal card then CIF of card must be the same as CIF of Account. | Drop-down Select one Lookup value from “Code management” table where type code is “card-indicator”. Refer “list-by-code-type” API under “Master Data”. | +| | Card status \*/Trạng thái thẻ | Card status The Card status is used to check block transaction via TP or on some MQ validation | Drop-down Lookup value from “Card Status” screen (Card_status table). Refer “Card status” API under Code Maintenance | +| | Card block code/Mã chặn thẻ | Card block code The Card block code is used to check block transaction via TP or on some MQ validation | X(10) | +| | Card activation date /Ngày kích hoạt thẻ | Card activation date | Date | +| | Card creation date\*/ Ngày mở thẻ | Card creation date | Date | +| | Card expiry date \*/ Ngày thẻ hết hạn | Card expiry date | Date | +| | Old Card Number/ Số thẻ cũ. | Old Card Number | Drop-down list Card belong to selected account. In BAU processing, this is the existing card number to be replaced by new Card Number in this record. This field should have a value only if this record is ADDING a NEW CARD NUMBER which is to replace the OLD CARD NUMBER. Both new card and old card should under the same account. | +| | ==tbd== | | | + +1. Records added thru this screen cannot be updated by records from the OLSCARD batch. Record created/updated by OLSCARD batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. +2. When a record is adding with whose Card Number already exists in OLS, the record will be rejected. +3. When a record is adding/updating with whose Account does not exists in OLS, the record will be rejected. +4. When a record is adding/updating with whose CIF Number does not exists in OLS, the record will be rejected. +5. **Processing** + +* Each Card is belong to only one Account and only one customer. OLS don’t support to change CIF number Or Account of Card in this screen. If have to change CIF Numnber of card or account of card then it should be processed via CIF Merge batch if needed. +* When a record is adding with inputed data passed the card record validation then: + + - The card record is added in CARD table. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. +* When a record is updated whose Card Number passes the validations then the Card record and the Card–Account relationship record are updated. Original record is moved to his table. +* When a Card is deleted then the Card record is moved to history table to indicate a logical delete. The corresponding CARD_PRODUCT_ACCOUNT_REL record for this card is also moved to history table. +* For principal card CIF number of account should be the same CIF number of card. +* For replacement case: A new Card issued to the Cardmember in case of loss, theft, mutilation or non-receipt of a Card. Therefore new card is coming to replace old card. When replace card then: + + - Add the incoming record as a new Card record with the same PSN as old card number. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. + - Old Card Number will continue to be processed until the Card Status and/or Block Code is/are updated to make the card ineligible. + - All Attributes, Counters and Pool Buckets which were linked to the old Card number will be automatically linked to the new Card record. + +1. Card listing will be the list card of all account of selected customer. + +#### Post – Codition + +N/A + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/customer/customer_overview.md b/docs/staging/specs/customer/customer_overview.md new file mode 100644 index 0000000..286f12c --- /dev/null +++ b/docs/staging/specs/customer/customer_overview.md @@ -0,0 +1,321 @@ +### Customer profile + +#### Requirement Definition + +1. OLS administration screens include a “Customer Profile” function to view Customer details. +2. Customer records are view-only, and can only be updated from source systems by batch ==TBD=== + +#### Process flow + + +#### Trigger + +* + - 1. User want to verify/ get customer’s information. + +#### Pre-Condition + +1. User have to have the access right on both “Customer Profile module under “Customer Mangement” Group. + +#### Wireframe + +* + - * 1. Summary listing page + + +* + - * 1. Filter + + +* + - * 1. Create/Edit mode + + * + - 1. Detail view + + +#### Business rules + +1. Click on Customer Profile icon in Main Menu to list customer records, as illustrated in the [wrireframe](#_Wireframe_13). +2. Use the filter to locate particular customer, which will be listed in the display. +3. Click on a row to view details of the customer record, as illustrated in the [wireframe](#_Wireframe_13). +4. Filter description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Filter** | | | | +| | Quick search | As common function, OLS allows find customer record by quick search function. Put and press enter any key related to these field to find data. | | +| | Gender / Giới tính | If Gender are provide then just get customer who have selected gender If gender are not provided then get all customer | Drop -down Allow multiple select | +| | Country Origin /Quốc gia | If Country are provide then just get customer who have selected Country Issused If Country are not provided then get all customer | Drop -down Allow multiple select | +| | Date of Birth/Ngày sinh | Find customer who have day of birth matched with selected date | Date Time picker | +| | Card number/ Số thẻ | Find customer who have the account of inputed Card number | Text box | +| | Account number/Số tài khoản | Find customer who have the inputed Account | Text box | + +1. **Screen description** + +Screen description at create/edit mode + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: Customer Profile / Hồ sơ khách hàng** | | | | +| | CIF number \* / Số CIF | Unique CIF Number assingn to each customer. | X(30) | +| | Frist Name \*/ Tên | Customer First Name | X(50) | +| | Last Name \* / Họ | Customer last name Frist Name + Last Name will be customer Name which will be stored in database for refering | X(50) | +| | Date of Birth\*/ Ngày sinh | Customer birth date | Date | +| | Registration Date/ Ngày đăng kí | The date customer open an account | Date | +| | Gender / Giới tính | Customer Gender | Drop-down Select one Lookup value from Code_Management table where code type is “gender”. Refer to “get-type-by-code”API under Master data | +| | Customer Status \*/Trạng thái khách hàng | Customer status | Drop-down Select one Lookup value from Code_Management table where code type is “customer-status”. Refer to “get-type-by-code”API under Master data | +| | Customer Block Code | Customer block code | X(10) | +| | Marital Status/ Tình trạng hôn nhân | Customer marital ima status | Drop-down Select one Lookup value from Code_Management table where code type is “marital-status”. Refer to “get-type-by-code”API under Master data | +| | ID Type/ Loại ID | ID Type of cardholder ID | Drop-down Select one Lookup value from Code_Management table where code type is “cardholder-idtype”. Refer to “get-type-by-code”API under Master data | +| | Cardholder ID/ Số ID | Cardholder ID Condition field. This field is required when Cardholder type is selected otherwise this will be optional field. | X(30) | +| | Country Origin/ Quốc gia | Customer country orgin | Drop-down Select one Lookup value from “Country” table. Refer “Country Code” API under Code Maintenance | +| | Customer Income/Thu nhập | Customer income | 9(14,2) Should be greater than or equal to 0 if provided | +| | Datetime of maitenance date/ Ngày cập nhật thông tin | The sysdate to create/update record via OA screen. The maintenance date from request if input via batch job | Datetime The date format must adhere to the configured format Display for view mode only | +| | Profile Picture /Ảnh hồ sơ | Drag or drop photo Or Browse file to upload image file | | +| **Step 2: Contact Detail/ Thông tin liên hệ** At least one contact detail record should be provided Each customer can have more than one contact detail information such as customer contact and guardian contact…. | | | | +| | Addess Type\*/ Loại địa chỉ | Adress type A drop-down list to select one of following address: Home Address Business Address Shipping Address Billing Address | Drop-down Select one Address type should be unique on each customer | +| | Phone number\*/ Số điện thoại | Phone number | X(30) | +| | Email Address\*/ Địa chỉ Email | Email Adress This field must be under email format | X(50) | +| | Address 1/ Địa chỉ 1 | The main address | X(100) | +| | Address 2/ Địa chỉ 2 | Other address | X(100) | +| | State/Tỉnh-Khu vực | State | Drop-down Select one Lookup value from “State_Code” table Refer to “State code” API under Code maintenance | +| | City/ Thành phố | City | Drop-down Select one Lookup value from “City_Code” table Refer to “City code” API under Code maintenance | +| | Zip Code/ Mã bưu điện | Zip code/postal code | Drop-down Select one Lookup value from “ZIP_CODE” table Refer to “Zip Code” API under Code Maintenance | + +* 1. **Processing** + + If a request is adding a record which whose CIF # locates an existing Client record in OLS with record Status = “A”, the incoming record will be rejected. + + If a request is updating or deleting a CIF # that does not locate an existing Client record with record Status = “A” in OLS, the request will be rejected. + + If a request is deleting a CIF# that locates a Client record that is linked to one or more Account that is still active in OLS, the request will be rejected. + + When new customer is added in OLS then: + ++ Customer record is added in both Client and Client_corr table. + ++ The corresponding LOYALTY_ACCOUNT is created. + +* + - When customer is deleted then: + ++ Logically delete the record by moving it to History table. + ++ Locate record in LOYALTY_ACCOUNT and move that to History table. + +* + - Records added thru this screen cannot be updated by records from the OLS batch. Record created/updated by OLSCUST batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + 1. **View mode of active record is display as customer 360 which is described** **in section 5.2.** + +#### Post -condition + +* + - * 1. Able to access submodule in customer management module which will be described more detail as following section. + +#### Exception flow + +N/A + +### Customer 360 + +#### Requirement Definition + +1. OLS administration screens include a “Customer 360” function to view Customer details. +2. Customer 360 contains key information about customer. User can use it as a strategy guide to creating personalized experiences. + +#### Process flow + +N/A + +#### Trigger + +N/A + +#### Pre-condition + +1. User need to have the access right in Customer Profile module in order to able to view this dashboard. +2. User must select a customer in customer profile listing page to bring up the customer dasboard. + +#### Wireframe + + + +#### Business Rules + +1. Clicking on the chart icon at the top of the main Customer list page will toggle between the Customer list view and the Customer dashboard view. +2. Customer dashboard update constantly, giving user a real-time view of customer behavior and information. +3. Click any customer record in listing page to see the customer profile of each customer. +4. **OLS support following information:** + +##### Customer information + + +* + 1. Click “See profile details” to see customer profile detail. The system bring up the screen as pop-up screen for customer profile as illustrated as following: + + +1. User can edit/delete customer from this screen. + +##### Customer’s rewards statistic + + +* + 1. This part displays statistical indicators related to the customer's rewards. OLS introduces 2 indicators: + ++ Points: The customer’s total available points. Use sysdate to determine the balance bucket periods. + ++ Cash back: The customer’s total available cash back. Use sysdate to determine the balance bucket periods. + +##### Account / Card information + +* + 1. The Customer’s account holdings and all of the customer’s card are displayed, regardless of whether account or card number is used. + 2. **The Account/ Card information listing give user have a general overview of customer’s cards:** + +**+ A = Set of card list of all account in the selected customer** + +**+ B= Set of card lists for the specifically selected customer.** + +**Therefore C= Card in listing page = Distinct cards from the union of A and B** + +* + 1. **In case account there is no card is added then just show the account list of selected customer.** + 2. Quick shortcut to support adding new Card or new Account from this screen. + 3. Detail listing description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Filed** | **Description** | **Data type** | +| | Account type\*/Loại tài khoản | The combination of Product Account Level and Prodcut Account Type of customer. All Customer’s account holding are displayed here. | Display | +| | Account Number\* /Số tài khoản | Product Account No. | Link Click on each Account number to bring up the Account Detail screen to see more about this account. See more on [Account](#_Account) section | +| | Card Number/Số thẻ | Card number | Link Click on each Card number to bring up the Card Detail screen to see more about this card. See more on [Card](#_Card) section. | +| | CIF Number\*/Số CIF | CIF number of card will be the same as selected CIF number for Principal card For supplement card then this is CIF number of Card instead CIF Number of Account. | Display | +| | Card Status/Trạng thái thẻ | Card status | Display Lookup value from Card table | +| | Card indicator/Chỉ thị thẻ | Card indicator | Display Lookup value from Card table | +| | Card block code/Mã chặn tài khoản | Card block code | Display Lookup value from Card table | +| | Card expiry date/Ngày hết hạn thẻ | Card expiry date | Display Lookup value from Card table | +| | Account block code/Mã chặn tài khoản | Account block code | Display Lookup value from Product_Account table | +| | Account status\*/Trạng thái tài khoản | Account status | Display Lookup value from Product_Account table | +| | Account Open Date\*/Ngày mở tài khoản | Account Open Date | Display Lookup value from Product_Account table | + +##### Transaciton statistic + +A combination of two charts is used to describe the transaction statistic for selected period of a customer. + +The line chart describes the fluctuations in a customer's balance for the selected pool over a specified period. + +The combo chart illustrates the relationship between the total number of transactions and the total number of transacted merchants for the selected pool over a specified period. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months 4. Last 6 months Default as “This month” This filter is apply for both graph | | +| | Pool | Mandatory field Allow multiple select Lookup value from Pool Defintion Display Pool ID and Pool Name per each pool. This filter is applied for left graph only | | +| | Account type | Drop-down list to select combination of PAT and PAL. Allow multiple select. This filter is applied for right graph only | | +| | MCC | Drop-down list to select MCC of the transaction. Allow multiple select Display code and description per each MCC This filter is applied for right graph only | | +| | Vertical axis | Total point each selected period/ selected pool Each line is assinged for one transaction type. | | +| | Horizontal axis | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. If Period “Last 6 months” is selected then horizontal axis is including last 6 months from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points/ adjusted points for the date range/time frame defined. | | +| **Data source** | | | | +| Get data from the TRANSACTION table with transaction type = “Award” for earned points/Transaction type = “Redeem” for redeemed points / Transaction type =’ Adjust” for Adjusted points during each selected month on the selected pool. The transaction should not be a cancellation transaction. Use the transaction date to determine the period. | | | | +| | Left vertical axis | | Total number of transacted merchants during selected period of selected pool Use Bar chart to describe total number per each period | +| | Right vertical axis | | Total number of transaction during selected period of selected pool Use line chart to describe total number per each period | +| | Horizontal axis | | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of transaction for the each day/month Hover over the bar graph to view a count of transacted merchant for the each day/month | +| **Data source** | | | | +| | Lookup value from TRANSACTIONS table Use transaction date to determine period Use Store data as merchant to determine transacted merchant Each OLS Reference No should be one and only transaction. | | | + +##### Customer Activities + +* + - * 1. The all customer activites will be triggerd and displayed here. + 2. Some types of customer activities as following: + 1. Loyalty program + +All OLS transaction of customer such as: + +* + - Enrolling in and participating in OLS loyalty programs. + - Redeeming points + - Transfer points + - Earn points + 1. Feedback and Review + + Leaving customer’s feedback on the portal app. + 2. Email engagement + + Receive email from OMR + 3. Account management + +Refering to all bellow action in portal app such as: + +* + - Updating customer information, such as contact details, payment methods, and preferences. + - Password resets and login activity. + +1. Allow user filter data by time frame (Start date and End date). +2. Layout + + +##### Customer Segmentation + +* + - 1. Deviding the customer base into segmentation groups based on specific characteristics, behaviors and demographics. + 2. Introduce the criteritions on each segmentation group and the conditons to meet each criterion. Based on this, OLS introduce a program to collect data and devide customers into each segment. + 3. Demographic segmentation includes following segment: + 1. Gender: Famale or Male + 2. Age: Teenager / Adult/ Middle- Aged person/ Senior Citizens: Based on criteria (Age’s range) to devide customer’s age. + 3. Matirial Status: Single or Married + 4. Income: Low / Medium / High: Based on criteria (customer’s income range) to devide icom segment. + 5. Layout + + +1. Behaviors segmentation includes following segment: + 1. Frequency of purchase: Daily / Weekly/Montly..: Based on the frequency of the transaction to devide this segment. + 2. Membership class: Depending on the organization, business. Some common types of membership class: + * Basic membership + * Premium membership + * Platium membership + * Gold membership + * Daimon membership + * VIP membership + 3. Purchase channel: Categorizing customers based on customer’s preferred purchase channels, such as in-store, online, mobile app, or phone (Call to call center)… + 4. Hobby: Based on customer’s hobby to create siutable loyatly program. + +6. Layout + + +##### Most Redemmed Items + +The top 10 (this value should be configurable value) redeemed items of the customer are displayed here. + +Just show top 5 item on each page. + +Each row contains a summary for an item, including the item code, the total redeemed quantity, and the redeemed points/cash amount to use for the specificed period. + +Shortcut to support quick add new item redemption transaction from this screen. + +Listing page description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| F**ilter** | | | | +| | Period | Period used to filter data. | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. Today 2. This month 3. Last month 4. Last 3 motnhs Default as “To day” | +| | Item type | Optional field The drop-down to select item type to get top N item. If item type is not provided then top N of all item type will be displayed. | Drop down Multiple select Default Evoucher type | +| **Listing page** | | | | +| | Item code/Mã vật phẩm | Item code | Display Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Item Name/Tên vật phẩm | Item Name | Display Lookup value from ITEM table | +| | Category/ | The categories are assigned to item | Display Lookup value from Item table Each item can be assinged more than one category | +| | Quantiy/Số lượng | Total redemmed quantity of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Redemmed points/ Điểm đã sử dụng | Total redemmed point of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Cash Amount used/Tiền đã sử dụng | Cash used to redeem | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| **Data source** | | | | +| | Lookup value from CAT_CATALOGUE_TRANS_DETAIL table Use Post_Date to determine period Order by quantity descending order. | | | + +##### Balance information + +1. The all customer’s pool balances are displayed here. +2. Each row contains the summary for a Pool: the total balance (sum of all buckets in a Pool), redeemable balance and the expiry date of the earliest expiring bucket. +3. Listing page descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| **Fitler** | | | | +| | Pool | Optional field A drop-down to select the reward pools, which quickly retrieves the customer's balance. If Pool is provided then the system display all balance of the selected pool of the customer. If pool is not provided then all pool balance of the customer are displayed. | Drop –down Default as empty Multiple select Lookup from pool definition screen Display only the pools with a non-zero balance. | +| **Listing page** | | | | +| | Pool ID/Mã pool | Pool ID | Link Click on the pool id to bring up the “[Pool Balance Enquiry](#_Balance_Detail_Enquiry) ” detail view of this pool. | +| | Pool Name/Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Balance/Số dư | Sum all balance buckets of a pool of customer. | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of a pool of customer. The bucket should have: Start date <= Processing date <= Expiry date | Display as number format Lookup value from LAB table | +| | Earliest Exp Bal and Date/ Số dư gần nhất | The earliest expiring bucket date for a pool, for non-0 balance buckets. And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | + +#### Post – condition + +* + 1. User can use it as a strategy guide to creating personalized experiences.. + +#### Exception flow + +N/A diff --git a/docs/staging/specs/customer/no_hit_transaction.md b/docs/staging/specs/customer/no_hit_transaction.md new file mode 100644 index 0000000..8b1fb39 --- /dev/null +++ b/docs/staging/specs/customer/no_hit_transaction.md @@ -0,0 +1,90 @@ +### No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT + +#### Requirement Definition + +* + - 1. In the nearest version, there is no screen to be tracking the transaction which did not trigger campaign rule by some reasons. + 2. In this version, we introduce a new screen under the 'Customer Management' module to track all non-eligible transactions (those that did not meet the rule criteria) or transactions with no linked rules + 3. A 'No-Hit Transaction' is a running record of all transactions sent to OLS to trigger a CP rule but not eligible for a campaign rule or incoming transactions with no linked campaign rule. If an incoming transaction hits Rule A but does not hit Rule B, this transaction will still appear on this screen for Rule B + 4. Noted that: Listing is depending on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + + +#### Trigger + +* + - * 1. User would like to verfiy why transaction did not hit campaign rules. + +#### Pre-Conditions + +Incoming transactions trigger campaign but do not hit CP. + +User have to have access rights in both “Customer Profile” and “No hit CP- Transaction” modules under “Customer Mangement” Group in order to view this screen. + +User must select a customer in customer profile listing page to access the “No hit CP- Transaction” tab. + +#### Wireframe + +Summary listing page + + +Detail view + +* 1. Record detail + + +* 1. Record status + + +#### Business rules + +* 1. Click on No Hit CP- Transaction tab to list all No-Hit CP transaction of the customer as illustrated in the [wireframe](#_Wireframe_15). + 2. One transaction detail record is one incoming transaction ( assinged to one Invoice No). + 3. Detail view screen will display all campaign rule which transaction trigger but does not hit. + 4. This screen just view only. There is no further actions. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Lookup no – hit transactions from OLS_ORPHAN_TXN_NO_HIT table for transaction which trigger campaign rule but not meet rule criteria OR transaction no linked any campaign rule. + 7. This screen should desribe detail why transactions do not hit CP rule such as if critertia do not meet then which criteria failed. TP should response detail the error description to can show in this screen. + 8. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Account Information** | | | | +| | CIF Number | Transacted CIF Number If incoming transaction are not provided then lookup by Account/ Card which are provided. | Display | +| | Product Account No | Transacted Product Account Number and combination of Product Account Level and Product Account Type. If Incoming transaction are not provided then lookup by Card Number which is provided | Display | +| | Account Type | +| | Card number | Transacted Card Number | From incoming transaction | +| **Transaction Detail** | | | | +| | Invoice No | Unique Invocie No which generate by OLS system to determine unique incoming transaction. | Display | +| | Transaction Type | Transaction Type of CP rule AWD- Award RED- Redeem ADJ- Adjust | Display | +| | OLS Transaction Code | Transaction code which used to locate CP rule. | | +| | Transaction Date Time | Transaction Date and Time | Display as date time format. The date format must adhere to the configured format From incoming transaciton | +| | Transaction Amount | Transaction Gross Amount from incoming transaction for Award/Redeem transaction Adjust point for Adjustment transction | Display as number format 999,999,999.99 From incoming transaciton | +| | Corporate | Transaction corporate ID Lookup value from transaction store | Display | +| | Chain | Transaction chain ID Lookup value from transaction store | Display | +| | Store | Transaciton Store ID | Display From incoming transaciton | +| | Terminal | Transaction Terminal ID | Display From incoming transaciton | +| | Transaction MCC | Transaction MCC Id | Display From incoming transaciton | +| | Transaction Description | Transaction description | Display From incoming transaciton | +| | Currency Code | Currency code of the original transaction amount | Display From incoming transaciton | +| | Transaction Mode | Mode of transaction at point of payment | Display From incoming transaciton | +| | DCC indicator | DCC indicator From incoming transaciton If empty then mean for non -DCC transaction | Display | +| | Tap2Pay Indicator | Tap2Pay Indicator If empty then mean for transaction is not a Tap2Pay(token) transaction | Display | +| | Token Requestor ID | Token Requestor ID (mobile pay) 3rd party wallet providers (Apple Pay, Samsung Pay, Android Pay etc | From incoming transaciton | +| | Salary Credit | Salary Credit | From incoming transaction Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode | POS entry Mode | From incoming transaction | +| **CP Rule Listing** **Detail error description for each campaign Rule which incoming transaction trigger but do not hit this campaign Rule** | | | | +| | Campaign ID | Campain ID | Lookup value by Campaign Rule ID | +| | Campain Rule | Campaign Rule ID | Display | +| | Pool ID | The reward pool of campaign rule | Display Lookup value by Campaign Rule ID | +| | Error Code | Error response code from OLS | Display | +| | Error Descriptions | Error response description | Display | + +Post-condition + +* + - 1. User can adjust incoming transaciton to meet Campain Rule or explain to customer why they do not get reward. + +#### Exception flow + +N/A + diff --git a/docs/staging/specs/customer/operations_adjustment.md b/docs/staging/specs/customer/operations_adjustment.md new file mode 100644 index 0000000..0211115 --- /dev/null +++ b/docs/staging/specs/customer/operations_adjustment.md @@ -0,0 +1,290 @@ +### Adjustment + +#### Requirement Definition + +1. Adjustment transactions can be manually posted through the Customer Management module in the administration screen function under. +2. This screen display all manually adjustment transaction of customer. + +#### Process flow + + +#### Trigger + +* + 1. User would like to review/ verify manually adjustment transaction of customer. + 2. There is some wrong in balance of customer then user have to manually adjust via OA screen. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Adjustment Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Adjusment Entry" tab +3. Depending on the user’s access rights, they can view/edit/add or approve manually Adjustment transaction records. + +#### Wireframe + +* + - 1. Summary listing page + + +* + - 1. Active record + +Record detail + + + +1. Create/Edit form + +Create /Edit mode + + + +* + - After selected/inputted card/Account/CIF click to quick view icon to see right panel information + + +#### Business rules + +1. While under “Transaction Management” module in the administration screen function, manually adjustment transaction can be posted for any customer then in “Customer management”module manually adjustment transaction can be posted for selected customer only. +2. Click on the Adjustment Entry tab in the “Customer Profile “sreen to bring up the screen for accessing the Adjustment Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_9). +4. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +5. User stories and acceptance criteria + + +1. Screen desscriptions + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | **Desscription** | **Data type** | | +| **Adjustment detail** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: CIF number/ Account / Card must be provided | Radio button Default posted by Card Look up value from master data | | +| | | | Under Customer management module | Under Transaction Management module | +| | Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Customer” API under Customer Management | +| | Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. Refer “==tbd== “ API | Drop-down Select one List all account level in the OLS system. Refer “Product Account Level” API under Code Maintenance service | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. Refer “==tbd== “ API | Drop-down Select one List all account type in the OLS system by selected Account level. Refer “Product Account Type” API under Code Maintenance service | +| | Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer Refer “Account “ API under Customer Management service | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Product Account” API under Customer Management. | +| | CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. Refer “Customer Profile” API under Customer Management. | +| | Adjustment Quantity is +ve/-ve \*/ Điều chỉnh âm/dương | Indicates whether the adjustment is a positive adjustment or a negative adjustment | Drop-down Select one Lookup value from “Code_Management” table Refer “list-by-code-type” API with code type is “adj-type” | | +| | Store \*/Đơn vị/Cửa hàng | The store of transaciton | Drop-down Select one Lookup active Store record from “Store” screen Refer “Store” API under Merchant Managemant. | | +| | Pool Id \*/Mã pool | The pool to be adjusted Should respect pool entity level For example: Cant posted txn by Account if pool to be adjusted is card- entity level pool. | Drop-down Select one | | +| | Transaction Date\*/Ngày giao dịch | Transaction date | Time picker within time also DD-MM-YYYYY HH:MM:SSS Allow user input from keybroad | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been adjusted. Present for postive adjustment only Show the balance bucket based on transaciton Date and expire policy of adjusted pool. When update transaction date / Card number (Account /CIF) OR Pool then this value should be automation updated. Allow user modify this value | Time picker without time DD-MM-YYYY Allow user input from keybroad | | +| | Bucket Expiry Date/ … | This is the expiry date of the bucket will be deduct poitn. Present for negative adjustment only If not selected then follow by TP processing for Redemption/Negative adjustment approach. If selected then just adjust on the selected bucket. | Drop-down Select one Loopkup value from customer balance based on adjusted pool/selected card. | | +| | Adjustment Quantiy \* /Số lượng điều chỉnh | The pool units by which to adjust the pool balance. | 9(12,2) Should be greater than 0 if provided | | +| | Reason Code \*/Mã lí do điều chỉnh | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the adjustment. | Drop-down Lookup value from Reason Code screen | | +| | Transaction Code \*/Mã giao dịch | OLS transaciton code of transaction | Drop- down Lookup value from OLS Transaction Code screen | | +| | Remarks/Ghi chú | A description of the adjustment. | X(100) | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | + +* + - 1. Edit Action just be applied for Pending/Rejected record. + 2. For Active Record just view only. + 3. After the transaction has been saved, it is put in the pending tab. + 4. An authorised user has to retrieve the transaction and approve it before it is processed and pool is updated: + +**Based on entity level/account selection alog** + +* 1. For postive adjustment transaction then: + + If have negative balance bucket then adjusted point used to offset negative balance bucket to 0 first. + + The remaining points will be added for selected bucket. + 2. For negative adjustment transaction then: + + +* + - 1. Approved transaction is putted in the active tab. + +#### Post-condition + +* + - Pool balance buckets are updated. + - Transaciton is posted and viewable on the transaction history screen. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + +### Transfer balance + +#### Requirement Definition + +1. Transfer balance transactions can be manually posted through the Customer Management module in the administration screen function under. +2. Change in UI/UX and change to support both user can transfer balance from their account to other customer or transfer between its own self. + +#### Process flow + + +#### Trigger + +* + 1. The user would like to review/verify the manually transferred points from a customer to another customer or between the customer's own accounts/cards. + +#### Pre-Condition + +1. User have to have the access rights in both “Customer Profile” and “Transfer Balance” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Transfer Balance" tab. +3. Depending on the user’s access rights, they can view/add/Edit or Approve manually transfer points transaction records. + +#### Wireframe + +* + - 1. Summary listing page + + +* + - 1. View detail form + + +* + - 1. Create/Edit form + + +#### Business Rules + +1. Click on the “Transfer Balances” tab in the “Customer Profile “screen to bring up the screen for accessing the Transfer Points listing page. The detail is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that the Edit icon (!) and Delete icon just display for pending and rejected records only. +4. The point transfer function will transfer all pools linked directly from the “From” to the “To”. +5. Expiry Dates will be preserved unless a specific date is provided. +6. User stories and acceptance criteria + + +1. F**orm descriptions:** + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| | Transfer mode \*/ Phương thức điều chuyển | Use transfer mode to determine the relationship between from transfer source and the transfer destination. Check on the “Internal” mode to transfer balances itself. Check on the “External” mode to transfer the balance from a customer to another customer in the OLS system. Use Application Parameter to allow/disallow transfer mode: Apply both or only Internal or only external | Radio button Default “Internal” transfer Lookup value from “Code_Management” table where code type is ‘transfer-mode’. Refer “list-by-code-type” API under Master Data. | +| | Transfer Type\*/Loại điều chuyển | Condition field Depend on Transfer Mode to disable/enable as follows: Note: “X” stands for enable | | | | | | --- | --- | --- | --- | | **Transfer mode** | **Transfer Type disable/enable** | | | | **Card** | **Account** | **Client** | | Internal | X | X | | | External | X | X | x | | Radio button Default “Card”. Lookup value from “Code_Management” table where code type is ‘entity-lvl’. Refer “list-by-code-type” API under Master Data. | +| | From \*/Từ | A card/Account/CIF number must be present which depends on the transfer mode. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account type of the selected source account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account level of the selected source account | Drop-down Select one | +| | Quick view/Xem nhanh | Click on each quick view icon to retrieve the available balances of the customer after entering/selecting the card number. The details will be displayed in the right panel. See more in the Quick view part Show an error message if the Requesting Card is invalid. With Edit/Create mode the system will expand/collapse on the same screen to user can see and continue input needed information but with View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon See more in Quick view part | Hyperlink | +| | To \*/Đến | Card /Account/CIF number must be present which depened on transfer mode. If Transfer Type is “Account” then Account type is present. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout type of selected destination Account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout level of selected destination Account | Drop-down Select one | +| | Pool ID\*/Mã pool | The pool from which to transfer Just show the pool of “From” balance buckets as following: X: Display | | | | | | --- | --- | --- | --- | | **Transfer Type** | **Pool balance bucket of “From” Customer.** | | | | **Pool Level Card** | **Pool level Account** | **Pool Level cust** | | Card | X Display distinct Card- entity Pool of balance bucket of Inputed card only | X Display distinct account -entity Pool of balance bucket of Account of Inputed card | X Display distinct customer -entity pool of balance bucket of customer of inputed card | | Account | | X Display distinct account- entity Pool of balance bucket of inputed account only | X Display distinct customer- eintiy pool of balance bucket of customer of inputed account | | Client | | | X Display distinct customer-entity pool of balance bucket of inputed CIF Number | | Drop- down Based on Transfer Type and “From” to lookup pool from LAB and Pool Definition table. | +| | Store\*/Cửa hàng-Đơn vị | The store which transaciton is logged | Drop -down Lookup value from Store screen- Store table. Refer “Store” API under Merchant Management | +| | Amount to Transfer \*/Mức điều chuyển | The amount to transfer. Defaults to the whole pool balance. | 9(14,2) Should be greater than 0 if provided | +| | Expiry Date (after transfer)/Ngày hết hạn | The expiry date of the points after the transfer. By default the expiry date will be the source expiry date. | Date time | +| | Transaction Code\*/Mã giao dịch | OLS transaction code which transaction is logged | Drop -down Lookup value from OLS TC screen. Refer “OLS Transaction Code” API under Campaign Management | +| | Reason Code \*/Mã lí do điều chuyển | Select from a list of pre-defined codes to identify the reason for the transfer | Drop-down Lookup value from Reason Code screen (Reason_Code table). Refer “Reason Code” API under Code Maintenance | +| | Remarks/Ghi chú | Remarks to be appended to the transaction, for reference | Text box X(100) | +| **Bucket Balance Detail view of Source** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | +| **Bucket Balance Detail view of Destination** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. OLS will validate the status permission and block code permission for both “From” and “To”, the transfer transaction will be rejected if any permission disallowed to perform adjustment. +4. Transfer transaction will be rejected if Pool balance of “From” is insufficient. +5. The Approved transfer transaction is logged as Adjustment transactions and following by TP processing: + 1. Each bucket in the “From” is transferred as a negative adjustment to the “From” and logged as a positive Adjustment to the “To”. + 2. The Reason Code will be selected from a list of Adjustment Reason codes. + 3. The Adjustment Reason Code is important for determining the GL posting accounts. + +#### Post-conditions + +* + 1. Pool balance buckets are updated. + +#### Exception flow + +* + 1. Pool balance of “From” is insufficent. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 3. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Re-instatement + +#### Requirement Definition + +1. This screen is used to re-instatement for expired balance bucket which have not been forfeited. +2. If balance have been forfeited, then “re-instatement” does not apply and an adjustment transaction should be used to return points to the customer. + +#### Process flow + + +#### Trigger + +* + - 1. User want to review/verify Re-Instatement transaction + 2. User want to re-instate expired bucket. + +#### Pre-Condition + +1. User have to have access righsts in s both “Customer Profile” and “Re-Instatement” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Re-Instatement" tab. +3. Customers have pool expired bucket which have not been forfeited. +4. Depending on the user's access rights, they can view, add, edit, or approve manually Re-Instatement Transaction records. + +#### Wireframe + +* 1. Summary listing page + + +* 1. Record detail view + + +* 1. Create/Edit form + + +#### Business rules + +1. Click on the “Re-Instatement” tab in the “Customer Profile “sreen to bring up the screen for accessing the Re-Instatement listing page. The detail as illustrated in the [wireframe](#_Wireframe_11). +3. User stories and acceptance criteria + + +1. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +2. Form description: + +| **Seq** | **Field** | **Description** | **Data type** | | +| --- | --- | --- | --- | --- | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | +| | | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Store \*/Cửa hàng_Đơn vị | Store | Drop -down Select one | | +| | Pool Id \*/Mã pool | The pool to be adjusted. The pool of the bucket to Re-instate. Just list the pool have balance which has already expired, but are still within the grace period (haven’t forfeited), while respecting the pool entity-level based on transfer mode. E.g Use account to re-instate then cant select card pool entity-level | Drop-down Select one | | +| | Bucket to Re-instate \*/Số lô cần gia hạn | The drop-down displays the expired buckets of the selected pool which have not been forfeited The bucket to be re-instated must be selected individually and the new expiry date must be provided in the “Expiry Date” field. | Drop-down Select one Lookup value based on LAB table. | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been re-instated. | Date The date format must adhere to the configured format | | +| | Reason Code \*/Mã lí do | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the re-instatement. | Drop-down Select one Lookup value from Reason Code screen with Reason type is Re-instatement Refer “Reason Code” API under Code Maintenance | | +| | Remarks/Ghi chú | Additional remarks on the re-instatement. | X(100) | | +| Quick View Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card. | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. The re-instatement will be posted as an Adjustment, with the Reason Code set to the selection. +4. The balance in the expired buckets will be set to 0. +5. If the bucket with the required expiry date exists, the adjustment amount will be added to the bucket. +6. Otherwise, a new bucket with the new expiry date as entered in the Re-instatement edit form is created with the balance from the expired bucket. + +#### Post-condition + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/customer/operations_transaction.md b/docs/staging/specs/customer/operations_transaction.md new file mode 100644 index 0000000..8f9a120 --- /dev/null +++ b/docs/staging/specs/customer/operations_transaction.md @@ -0,0 +1,206 @@ +### Item Redemption + +#### Requirement Definition + +1. Customers call the customer service (call center) and requests to redeem an item, giving identification and item code. +2. Item redemption requests are processed against the catalogue item set-up parameters. The details are described against the relevant parameter in the catalogue item set-up description in section 7. +3. All redemptions are in real-time. +4. Redemption through administration screens that requires approval is real-time only at time of approval. + +#### Process flow + + +#### Trigger + +* + - 1. Users use this screen to assist customers in exchanging points for items. + 2. Users want to review and verify the redemption item transaction details of customers, which includes all online transactions via the OA screen or M as well. + +#### Pre-Condition + +1. Users have to have access rights in both “Customer Profile” and “Item Redemption Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer to access the “Item Redemption Entry” tab. +3. Depending on the user's access rights, they can view, add, edit, or approve manually Item Redemption Transaction records. + +#### Wireframe + +* 1. Summary listing page + + +* 1. Record detail view + + +Click on each item to bring up item detail view + + +* 1. **Create** + +**Step 1: Add General information** + + + +**Step 2: Add Physical /Evoucher item** + + + +**Step 2: Add Miles item** + + + +**Step 2: Add cash rebate item** + + + +**Step 2: Add other items** + + + +#### Business rules + +1. Click on the “Item Redemption Entry” tab in the “Customer Profile “screen to bring up the screen for accessing the Item Redemption Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +3. User can’t modify transaction after transaction is posted. +4. User stories and acceptance criteria + + +1. Screen descriptions: + +| | | | | | +| --- | --- | --- | --- | --- | +| **Seq** | **Field** | **Description** | **Data type** | | +| **General information** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from master data | | +| | Condition fileds as following descriptions | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any card belonging to the customer can be used for making a redemption Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of the choosen customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the choosen customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (Balance Detail or Buket Balance Detail View Or Expired Balance View) to retrieve the available balances of the customer after entering the card number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card invalid. | Hyper link | | +| | Redemption Channel \*/Kênh đổi thưởng | Redemption Channel | Drop-down Select one Lookup value from master data | | +| | Redemption Date \*/Ngày đổi thưởng | The redemption transaction date | Date time Date time format must respect the date configuration format | | +| | Store\*/Đơn vị | The drop-down list to select any acitive Store in the OLS. Redemption Transaciton will be logged under this store. | Drop -down Select one | | +| | Appliable Fee/ Áp dụng phí | The fee will be applicable for this transaction if item has a fee See more about fee on Item price section. | Switch button Default OFF | | +| **Item details** | | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The drop-down to select the effected catalog | Drop – down Select one Use Redemption Date to determine effected catalogue. | | +| | Item\*/Vật phẩm | The drop-down to select the item code to be redeemed. The item must belong to the selected catalogue. Display an error message if item has no matched price. | Drop-down Select one Use Redemption Date and selected catalogue to determine effected item. From selected item and inputed data to determine price of the item. Please refer Item price to get more detail | | +| | Redemption Mode\*/Loại đổi thưởng | A drop-down list with the following choices: * Fixed Partial (Cash + Points) * Fixed Points If Price configuration did not allow Partial Redeem then just Fixed Partial is disable. If Price configuration allow “Partial Redemption” mode then both mode are enable. | Radio button Defaut fixed points Look up value from master data | | +| | Unit Price \*/Giá mỗi đơn vị | Point required **For Fixed points Mode then this is Price in point in item price configuration and user can’t change.** **For Fixed Partial Mode, the sytem must automation populate than “Minimum Partial Redeem Points” in item price configuration and user can modify this value but Unit Price must be equal to or greater than “Minimum Partial Redeem Points”.** | 9(12,2) | | +| | Unit Cash Amount required./Tiền phải trả mỗi đơn vị | Condition field This field is only active and required Fixed Partial mode only. The system must automation populate as: ( **Full Price in Point – Unit Price** ) \* **Price in Cash (per point) ( from item Price Configuration)** | Display | | +| | Unit Face value/Giá trị mỗi đơn vị | Condition field Active only when this item required face value on the configruration **Get face value from Item price cofiguration with higher priority. Otherwise this is base face value from item master.** | Display as 9(14,2) format | | +| | Quantity on hand/Số lượng còn lại | Available item can be redeemed. Just display if the item is tracked by quantity. | Display as 9(9) format | | +| | Redemption Quantity\*/Số lượng đổi thưởng | Redemption quantity If the item is tracked by quantity, then the redemption quantity must not be greater than the quantity on hand. Don’t allow to redeem if redemption quantity is greater than quantity on hand | 9(5) Should be greater than 0 if provided | | +| | Total price\*/Tổng cộng | **The system must automation populate as Unit Price \* redemption quantity** | Display | | +| | Total Cash amount required/Tổng tiền phải trả | Condition field This field is only active and required Fixed Partial mode only. **The system must automation populate as** **Unit Cash Amount required\* Quantity.** | Display | | +| | Total face value/ Tổng giá trị | Condition field. Active only when this item required face value on the configruration **The system must automation populate as** **Unit Face value \* redemption quantity** | Display as 9(14,2) format | | +| | FFP Ship number/ Mã số thẻ | FFP ship number | X(50) Condition fields Display and required for Miles items and should be configurable. Automation populate value from Attribute value based on configuration attribute ID and allow user modify this one. These fields to be used to send to partner. | | +| | FFP First Name/Tên | FFP First Name | +| | FFP last name /Họ | FFP last name | +| | Delivery Address/Địa chỉ | Delivery Address 1 Condition field Only active for Evoucher item and Physical item Auto populate from customer’s address 1 and allow user modify. | X(100) | | +| | Zip code/Mã bưu điện | Zip code Condition field Only active for Evoucher item and Physical item. Auto populate from customer’s Zip code and allow user modify. | Drop-down Select one | | +| | Recipient Name/Người nhận | Recipient Name Condition field Only active and required for Evoucher item and Physical item. Auto populate from customer’s Full Name and allow user modify. | X(50) | | +| | Email adress /Địa chỉ email | Email address Auto populate from customer’s email and allow user modify. | X(50) | | +| | Mobile Phone/Số điện thoại | Mobile Auto populate from customer’s email and allow user modify. | X(50) | | +| | Remark/ Ghi chú | Additional remarks on the item redemption transaction | X(100) | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | +| Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card/Account/Customer | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card os present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +#### Post-condition + +* + 1. Transactions are logged into the related table in the database. The transaction listing includes not only transaction which to be posted under the OA but also transaction to be posted from the member site. + 2. Balance are updated. Quantity on hand are updated if transaction is posted successfully in the system. + 3. The net transaction of the redemption transaction is the sum of the tax amount, total fee, and total cash required. + 4. At the end of day (EOD), all approved items include are output in a OLS output file to be sent to parnter to be tracking or created back to the account/customer used in the item redemption, etc. + 5. TP process to approve Transaction + + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation… + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Award Transaction + +#### Requirement Definition + +#### Process flow + +Process follow for award transaction (Award service on TP side: ) + + +#### Trigger + +#### Pre-condition + +#### Wireframe + +* + - 1. Create /Edit + + +#### Business Rules + +1. Click on the “Award Transaction” tab in the “Customer Profile” screen to bring up the screen for accessing the Award Transaction Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +3. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +4. User stories and acceptance criteria + + +1. Screen descriptions: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Descriptions** | **Data type and data source** | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | | +| | Condition fileds as following descriptions | | Under Customer profile | | Under Transaction Management | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Account number to find card. | | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | | +| | Transaction Code\* /Mã giao dịch | OLS Transaction Code This TC is used to locate the Campaign Rule to use for processing. | Drop-down Select one Lookup value from “Transaction_Code” table. Refer “OLS Transaction Code” API under Campagin Management | | | +| | Transaction Date \*/Ngày giao dịch | Must be valid date. Transaction rejected if not valid. Transaction rejected if this date is older than sysdatetime by N days, where N is a system setting. | Date time | | | +| | Source Reference Number/Số giao dịch gốc | Source Transaction Reference Number Unique transaction identifier from source system | X(20) | | | +| | Store\*/Đơn vị/Cửa hàng | Transaction Store Id | Drop-down Select one Lookup value from “Store” table Refer “Store” API under merchant management | | | +| | Terminal /Thiết bị đầu cuối | Transaction Terminal Id | Drop-down Select one Lookup value from “Terminal” table Refer “Terminal” API under merchant management | | | +| | Transaction Amount\*/ Giá trị giao dịch | Transaction Gross amount Note: It is dependent on each project, Lets it be gross transaction amount first. | 9(14,2) Should be greater than 0 if provided | | | +| | Transaction Description/ Mô tả giao dịch | Shopname from Source system or OLS transaction description | X(100) | | | +| | Transaction Currency Code/ Mã tiền tệ giao dịch | It can be anpha code or number code. Let’s it be anpha code first | Drop-down Select one Lookup data from “Currency_code” table Refer “Currency Code” API under Code Maintenance | | | +| | Transaction Mode/Phương thức giao dịch | Mode of transaction at point of payment | Radio button Lookup value from “Code_Management” table where code type is “txn-mode’. Refer “get-by-code-type” API under master data | | | +| | POS Entry Mode/Phương thức thiết bị bán hàng | POS Entry Mode | X(04) This field is subdivided as follows: 0 – Unknow , 1- Manual (key entered) 3- Bar code ---Etc | | | +| | MCC code/Mã MCC | Merchant category code | Drop-down Select one Lookup value from “MCC” table Refer “MCC” API under merchant management | | | +| | Country Code/Mã quốc gia | Country code | Drop-down Select one Lookup value from “Country_Code” table Refer “country code”API under Code Maintenance | | | +| | Salary Crediting Indicator/ Tài khoản nhận lương | Indicates bundled deposit account is receiving regular salary credits | Switch button Default OFF | | | +| | Transaction Channel/Kênh giao dịch | Transaction channel | Drop-down Select one Lookup value “Code_Management” table where type code is “txn-channel” Refer “get-by-code-type” API under master data | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buck Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | | + +#### Post-Codition + +Refer Process flow to get more detail for post-conditon when transaction is approved. + +#### Exception -flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation. + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/customer/pool_balance.md b/docs/staging/specs/customer/pool_balance.md new file mode 100644 index 0000000..d443285 --- /dev/null +++ b/docs/staging/specs/customer/pool_balance.md @@ -0,0 +1,76 @@ +### Pool Balance Detail + +#### Requirement Definition + +OLS will support Pool balance enquiry as a tab on Customer Profile Screen. + +Pool Balance tab to list a summary of all Pools of the customer. + +#### Process flow + + +#### Trigger + +User would like to check balance detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Balance Enquiry” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Pool Balance Detail” feature. + +#### Wireframe + +Summary listing page + +* + 1. Listing page + + +* + 1. Filter + + +1. Detail view + * 1. Detail view per each pool + + +* + 1. Click on each row in Pool Balance View to brings up the pop-op detail view + + +#### Business rules + +* 1. Click on Pool Balance tab to list a summary of all Pools of the customer. + 2. All summary of pool balance display in listing page. + 3. This screen just display only. There is no Add/Mofify action on this screen. + 4. Each row contains the summary for a Pool: the total non-balance (sum of all buckets in a Pool), and redeemable balance and the expiry date of the earliest expiring bucket. + 5. Use the filter to locate particular pool balance detail record, which will be listed in the display. + 6. Click on any record to bring up the breakdown of the Pool in that row on the “Pool Balance Detail” Screen as illustrated in the [Wireframe](#_Wireframe_2). + 7. User stories and acceptance criteria + + +* 1. Pool Balance Detail screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| **Pool Balance /Số dư pool** | | | | +| | Pool ID / Mã pool | Pool ID | Display | +| | Pool Name/ Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Pool type/ Loại pool | Pool Type | Display Lookup value from Pool Definition | +| | Pool Entity level / Cấp thực thể pool | Pool Entity level | Display Lookup value from Pool Definition and master data table | +| | Balance / Số dư | Sum all balance buckets of selected pool | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of selected pool The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | +| | Next Expiring Balance/ Số dư hết hạn gần nhất | The earliest non-expiring balance bucket of the selected pool. | Display as number format Lookup value from LAB table | +| | Account type/ Loại tài khoản | Combination of Product Account Type and Product Account level of Account | Display Lookup from Product_Account table Lookup from Product_Account number by ASN from LAB table. | +| | Account No/ Số tài khoản | Product Account Number | Display Lookup from Product_Account number by ASN from LAB table. | +| | Card Number/ Số thẻ | Card number | Present for Card pool entity level only | +| | Pool ID/ Mã pool | Pool ID | Selected pool | +| | Balance / Số dư | Non zero balance | Display Loopkup value from LAB table. Group by Expiry date / LA/ASN/CSN/Pool ID | +| | Expiry Date/ Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + diff --git a/docs/staging/specs/customer/statement.md b/docs/staging/specs/customer/statement.md new file mode 100644 index 0000000..3e6a47f --- /dev/null +++ b/docs/staging/specs/customer/statement.md @@ -0,0 +1,70 @@ +### Statement + +#### Requirement Definition + +* + 1. Statement Enquiry is a list of all transactions for a customer/ account over a set period, usually monthly. The statement includes earned, redeemed and adjusted, as well as the beginning and ending balance for the period, along with any interest earned. + +#### Process flow + + +#### Trigger + +User would like to review/verify statement detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Statement Enquiry” modules under “Customer Mangement” Group in order to this screen. +2. User must select a customer in customer profile listing page to view customer profile and access the “Statement Enquiry” tab. + +#### Wireframe + +* + - 1. Summary listing page + + +* + - 1. Detail view + 1. Record detail + + +* 1. Record status + + +#### Business rules + +* + 1. OLS statement output support Customer level and Account level, however statement records will be stored under Account level therefore Statement Enquiry show under Account level for both Statement Pool Entity level. + 2. Statement Enquiry includes all active statement records of statement pool. + 3. Statement records are updated by OLS batch jobs, so in administration functions (OA) only provides view in screens. There is no further actions. + 4. Click on Statement Enquiry tab to list all statement records of the customer as illustrated in the [wireframe](#_Wireframe_6). + 5. Click a listed record to display the details of the transaction as illustrated in the [wireframe](#_Wireframe_6). + 6. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Statement detail** | | | | +| | Loyalty Account Number | Loyalty Account Number | Display Lookup value from STATEMENT table | +| | Product Account Number | Product Account Number | Display Lookup value from PRODUCT_ACCOUNT table by ASN in Statement table. | +| | Account Type | Combination of Product Account Level and Product Account Type | +| | Pool ID | Statement Pool | Display Lookup value from STATEMENT table | +| | Cycle start date | Cycle start date time Provious statement cycle | +| | Statement Opening balance | Previous Statement Points Balance | +| | Total Award | Total earned points in this cycle | +| | Total Redeem | Total redemmed points in this cycle | +| | Total Adjust | Total Adjusted points in this cycle | +| | Statement Closing Blance | Accumualted points | +| | Expired points | Balance in expired buckets which have not yet been forfeited | +| | Last transaction Date | Last transaction post date on this cycle | +| | Cycle statement date | Cycle statement date time | +| | Reference Number | OLS Reference Number | Display | +| | Transaction Type | Transaction Type of this transaction | Display Lookup value from Transaction table | +| | Unit | Earned/ Redeemed/Adjusted point Depended on transaction type Group by Reference No,Post Date,Transaction date and Txn type | +| | Post Date | Post Date time | +| | Transaction Date | Transaction Date Time | + +#### Post – Condition + +N/A + +#### Exception flow + +N/A + diff --git a/docs/staging/specs/customer/transaction_history.md b/docs/staging/specs/customer/transaction_history.md new file mode 100644 index 0000000..b49ab4a --- /dev/null +++ b/docs/staging/specs/customer/transaction_history.md @@ -0,0 +1,138 @@ +### Transaction History + +#### Requirement Definition + +* + - 1. Transaction History is a tab under Customer profile. + 2. A transaction history is a running record of all of the transactions logged in OLS including cancellation transactions. + 3. Noted that: Transaciton hisstory listing depened on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + + +#### Trigger + +User would like to check transaction history of customer. + +#### Pre-conditions + +1. User have to have access rights in both “Customer Profile” and “Transaction History” modules under “Customer Mangement” Group in order to view this screen. +2. User must select a customer in customer profile listing page to access the “Transaction History” tab. + +#### Wireframe + +* + - * 1. Summary listing page + + +* + 1. Detail record + 1. Transaction Detail + + +* 1. Record status + + +1. Right panels + * + Quick view desribes expand information for this transaction. + + Click on each item to bring up the according tab + + Support scrollbar for pop-up detail view. + 1. Reward details + + +* 1. Item Redemption Transaction Details + + +* 1. Counter Transaction Details + + +#### Business rules + +* 1. Click on Transaciton History tab to list all transaction of the customer as illustrated in the [wireframe](#_Wireframe_3). + 2. One transaction detail record is combination of all input field (assinged to an OLS Reference No). + 3. Transaction history listing all transaction in OLS of customer include cancellation transactions. + 4. This screen just view only. There is no futher action. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Click a listed record to display the details of the transaction as illustrated in the following: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Account Detail/Chi tiết tài khoản** | | | | +| | Account Number/ Số tài khoản | Transacting Product Account Number | Display Lookup value from TRANSACTIONS table | +| | Product Account Type/ Loại tài khoản | Transacting Product Account Type | Display Lookup value from TRANSACTIONS table | +| | Product Account Level/Hạng tài khoản | Transacting Product Account Level | Display Lookup value from TRANSACTIONS table | +| | Card Number/ Số thẻ | Transacting Card Number | Display Lookup value from TRANSACTIONS table | +| **Transaction Detail/ Chi tiết giao dịch** | | | | +| | Invoice No/ Số hóa đơn | Internal invoice No generated by OLS system. | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Reference No/Số tham chiếu giao dịch | OLS Transaction Reference Number | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Source Reference Number | Reference number from source system For refrence only | Display | +| | OLS Transaction Code | OLS Transaction Code | Display Lookup value from TRANSACTIONS table | +| | Gross Amount/ Giá trị giao dịch gộp | Gross transaction amount | | +| | Nett Amount/Giá trị giao dịch ròng | Nett transaction Amount | | +| | Redeem points/Điểm đổi thưởng | Redeem points Total redeem points of the choosen transaction. The total point shoule equal to total redeem points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Redeemed Amount/ Giá trị điểm đổi thưởng | Redemmed point Amount Total redeem point amount of the choosen transaction. The total point shoule equal to total redeem point amount on each campaign rule which will be display on quick view. | | +| | Adjust Points/ Điểm điều chỉnh | Adjustment point Total adjustment points of the choosen transaction. The total point shoule equal to total adjust points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Adjustment Amount/ Giá trị điểm điều chỉnh | Adjustment points amount Total adjust point amount of the choosen transaction. The total point shoule equal to total adjust point amount on each campaign rule which will be display on quick view. | | +| | Award Points/ Điểm thưởng | Earned points Total award points of the choosen transaction. The total point shoule equal to total award points on each campaign rule which will be display on quick view | Display Lookup value from TRANSACTION table | +| | Points Awarded Amount/Giá trị điểm thưởng | Earned points amount Total award point amount of the choosen transaction. The total point shoule equal to total award point amount on each campaign rule which will be display on quick view. | +| | Transaction Date/Ngày giao dịch | Transaction Date Time | +| | Post Date/ Ngày đăng | Post Date | +| | Settlement Date/ Ngày ghi sổ | Settlement Date | +| | Cancellation Indicator/Chỉ thị hủy | Cancellation Indicator | +| | MCC | Transaction MCC Code | +| | Store/ Cửa hàng-đơn vị | Transaction Store ID | +| | Terminal / Cấp thiết bị đầu cuối | Transaction Terminal ID | +| | Transaction Description/Mô tả giao dịch | Transaction Description in OLS or Shop Name from external source system. | +| | Currency Code/ Mã tiền tệ | Currency code of the original transaction amount | +| | Country Code /Mã quốc gia | Country code of the original transaction. | +| | Transaction Mode/ Phương thức giao dịch | Mode of transaction at point of payment | +| | Transaction Channel /Kênh giao dịch | Transaction channel | +| | Salary Credit/ Chỉ báo tiền lương | Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode/ =tbd= | POS Entry Mode | +| | Reason Code/ Mã lí do | Adjustment reason code | For Adjustment transaction | + +1. Quick view in right panel displays the award, redeem, adjust and counter update details of the transaction including the campaign rules applied to the transaction and the Pool Units earned and redeemed. Click on each item to bring up the according tab. + 1. Award/Redeem/Adjust detail: Total balance in right panel should be equal to blanace which is displayed in transaction detail. This quick view displays the reward details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Quy tắc chiến dịch | Campaign rule that transaction has been triggered This value may be empty if transaction does not trigger campaign rule | +| | Transaction Type/ Loại giao dịch | Transaction Type | +| | OLS Transaction Code/Mã giao dịch OLS | OLS Transaction Code | +| | Pool/ Pool | Reward Pool | +| | Pool Unit/ Đơn vị Pool | Award/Redeem/Adjust points Depended on transaction type | +| | Pool Unit Amount / Giá trị đơn vị Pool | Award/Redeem/Adjust points amount Depended on transaction type | + +* 1. Counter Transaction Detail: + + This part displays the counter value, which is updated by the transaction on each campaign rule. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Mã quy tắc | Campaign rule that transaction has been triggered | +| | Counter / Bộ đếm | The counter for that transaction has been updated | +| | Entity / Cấp thực thể | Entity level of counter | +| | Counter Value/Giá trị bộ đếm | Counter Value | +| | Bucket Number/ Bộ đếm số | Counter bucket number which one is updated by this transaction. | +| | Bucket Start Date/ Ngày bộ đếm bắt đầu | The start date of the counter bucket for the updated counter has been changed | +| | Bucket End Date /Ngày bộ đếm kết thúc | The end date of the counter bucket for the updated counter has been changed | + +* 1. Item Redemption Transaction Detail + + This quick view displays the item redemption details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Item / Mã vật phẩm | Item | +| | Descriptions/ Mô tả | Remark of the redemption transaction | +| | Redemmed quantity / Số lượng đổi thưởng | Redemmed quantity | +| | Redeemed points/ Điểm đổi thưởng | Redeemed points | +| | Cash Amount used/Số tiền đã dùng | Cash amount is used to redeem item. | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + diff --git a/docs/staging/specs/marketing/ab_testing.md b/docs/staging/specs/marketing/ab_testing.md new file mode 100644 index 0000000..67b8333 --- /dev/null +++ b/docs/staging/specs/marketing/ab_testing.md @@ -0,0 +1,172 @@ +### A/Bn Testing + +#### Requirement Definition + +* + - 1. This function is used to evaluate and optimize various elements of the marketing program to improve customer engagement, retention, and overall performance. + 2. OLS support both A/Bn content testing and A/Bn target customer testing. + 3. For A/Bn content testing, one variation (content A) of the marketing request is sent to a subset of target customers, and one or more different variations (content sample B/ content sample n) are sent to the same subset of target customers. The goal is to identify which content in the marketing request yields the best results. + 4. Unlike A/B content testing, A/Bn target customer testing focuses solely on the target customers. In the same testing request, one variation is designated for 'target customer A,' while one or more variations are designated for 'target customer B' or 'target customer n.' The goal is to identify which OMR criteria in the marketing request will reach more customers. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-Condition + +* + - * 1. For A/Bn messsage content testing, result testing must be provied from third-party to OLS can collect data and analyze result to introduce report which user can use to make decision which on is better. + 2. Users have to have access rights in “A/Bn Testing” module to able to access this screen. + 3. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + 4. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +* 1. Filter + +![](data:image/png;base64...) + +* 1. Content marketing testing configuration + +**Step1: Choose testing type is “Content message testing”** + +![](data:image/png;base64...) + +Step 2: Setup general information + +![](data:image/png;base64...) + +Step 3: Choose target customer + +![](data:image/png;base64...) + +Step 4: Setup variant content message + +![](data:image/png;base64...) + +Step 5: Set up run schedule + +![](data:image/png;base64...) + +* 1. Target customer testing configuration + +Step 1: Choose “Target customer testing” + +![](data:image/png;base64...) + +Step 2: Set up general information + +![](data:image/png;base64...) + +Step 3: Setup variant target customer + +![](data:image/png;base64...) + +Step 4: Setup run schedule + +![](data:image/png;base64...) + +#### Business rules + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wireframe. +2. OLS system will use Query Builder to build query for OMR criteria when user setup target customer. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. Click on the “A/Bn Testing” in Main icon to bring up the screen for accessing the A/Bn Testing listing page. The detail as illustrated in the [wireframe](#_Wireframe_16). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for A/B testing screen is illustrated in the [wireframe](#_Wireframe_16)s. +6. **Screen description:** + +**Create/Edit mode** + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | **Data type** | +| * + - * 1. **A/B message content testing** | | | | | +| **Step 1: Campaign information** | | | | | +| | | Campaign ID \* | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Message channel \* | SMS Email Push | Checkbox Allow to select only one value Lookup from master data. | +| **Step 2: Choose target customer** The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). | | | | | +| | ![](data:image/png;base64...) | | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | | Each criteria can be drag one more time on each request . The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| **Step 3: Set up varial content** ![](data:image/png;base64...) | | | | | +| | Variant A Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial A will be added here. | Tab | +| | Varial B Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial B will be added here. | | +| | Add | | Click to add to introduce new tab to create new content varial. System will automation populate varinant name as default and users can rename and should be unique value on one each campaign. | Button | +| **Step 4: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format . This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | +| **II: A/B target customer testing** | | | | | +| **Step 1: General information** | | | | | +| | Campaign ID \* | | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | Campaign Description | | Description of Marketing Campaign ID | X(100) | +| | Effective Date From | | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| **Step 2: Set up variant target customer** | | | | | +| | Variant A User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial A will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Varial B User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial B will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Add | | Click to add to introduce new tab to create new target customer varial. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). System will automation populate variant name as default and User can rename and should be unique value on one each campaign. | Button | +| **Step 3: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format. This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. * Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | + +**Content marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | OMR criteria | View as Rule criteria view mode for this part | Display | +| | Variant A | View as Message Template view mode for message content part | Tab | +| | Variant B | View as Message Template view mode for message content part | Tab | +| | Variant N | View as Message Template view mode for message content part | Tab | +| | Result | =TBD== It is depened on the third-party partner and the goal. We can want to see the total result on each content variation or detail result for each target customer on each content variation. | ==tbd== | + +**Targeting marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Variant A | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant B | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant N | View as Marketing request view mode for OMR criteria part. | Tab | +| | Result | One gird to view the customer list on each variation | | | | | | | --- | --- | --- | --- | --- | | **Variation** | **Total number of customers** | **Total Female customer** | **Total male customer** | **….** | | Variation A | 100 | 10 | 90 | | | Variation B | 150 | 100 | 50 | | | Variation n | 140 | 50 | 90 | | | ==tbd== **Which criteria should be summarized??** | + +* 1. **A/Bn batch job will trigger marketing request as following processing:** + 1. A/Bn testing job (ABn) just trigger effectived A/Bn testing requests based on effectived period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + 2. For content testing, ABn creates A/Bn message content selected based on the variation content configured by user. These message to be sent to the same customers selected based on criteria configured by users. E.g to send 3 promotion messages to customers whose birthday is due in the next N days. The result testing should be provied by parter so that OLS can provide the report to user can decide which content messge is better. + 3. Regarding to target customer testing, A/Bn locates the target customer based on criteria configured by users. User can verify the result testing after batch job is completed. + 4. For A/Bn SMS content testing, we can track click-through rates if SMS includes links or calls to action. By including unique links for different messages or recipients, we can measure how many people clicked on those links to interact with each content. From this result we can have the temporary open rate to user can decide which one is better. + 5. For A/Bn Email content testing, open rate = (Number of opens / Number of delivered emails)/100. Number of opens is provided by third-party or we have to send email is in HTML format, as tracking pixels work with HTML emails. The number of opens willl be is the number of times the tracking pixel was downloaded when recipients opened the email. + 6. ==tbd== + +#### Post-condition + +#### Exception flow + diff --git a/docs/staging/specs/marketing/audience_filter.md b/docs/staging/specs/marketing/audience_filter.md new file mode 100644 index 0000000..cb7dc85 --- /dev/null +++ b/docs/staging/specs/marketing/audience_filter.md @@ -0,0 +1,171 @@ +### BlackList + +#### Requirement Definition + +* + - 1. The business need to exclude specific customer or groups from marketing campaigns for strategic reasons, such as fraud customers. + 2. Ensuring marketing efforts are focused on the most relevant and engaged audience to improve efficiency and return on investment. + 3. A set of customer who will be blocked for reward/promotion notification from a business wil be pre-definiton in this module. + +#### Process flow + +#### Trigger + +* + - * 1. The customer who has fraud behaviors will need to be added into black list. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Black List” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be blocked from the marketing campaign by uploading a file into the system. + +Additionally, users are able to assign customers to the blacklist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this blacklist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the black list. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be blocked from the marketing campaign if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The blacklist is stored and accessible to another module. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +### Whitelist + +#### Requirement Definition + +* + - 1. The business need to exclude a list of customers that are excluded from the standard frequency cap rules. + 2. The whitelist ensures your top customers continue receiving your marketing messages without limit. We can use the whitelist for testing and optimizing campaign purposes. We can aslo use the whitelist for user who have shown strong interest in your marketing campaigns. + +#### Process flow + +#### Trigger + +* + - * 1. A set of customers needs to be added to the whitelist to exlcuse them from the frequency cap rules. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Whitelist” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be excluded from the frequency cap rules by uploading a file into the system. + +Additionally, users are able to assign customers to the whitelist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this whitelist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the whitelist. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be excluded from the frequency cap rules if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The whitelist is stored and accessible to another module. + +The whitelist is excludes from the frequency cap rules as default. If there is any cap rules should need to include the whitelist then the user should indicate those whitelist. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + diff --git a/docs/staging/specs/marketing/frequency_capping.md b/docs/staging/specs/marketing/frequency_capping.md new file mode 100644 index 0000000..1d5d46b --- /dev/null +++ b/docs/staging/specs/marketing/frequency_capping.md @@ -0,0 +1,68 @@ +### Marketing Frequency Cap + +#### Requirement Defintion + +* + - 1. By controlling frequency capping, business can provide a more personalized customer expirence. Beside, frequency capping can provide a high level overview of the need for a notification capping system and the expected benefits for the business and its customers. + 2. Business able to setup the daily, weekly, monthly capping per customer. + 3. The system should automaticly enforcement of notification caps across different communication channels. + +#### Process flow + +#### Trigger + +#### Pre-condition + +1. Users have to have access rights in “Frequency Capping” module to able to access this screen. +2. Depending on user’s access right to user can modify the frequency capping of the marketing campaign. + +#### Sktech + +* + - * 1. Listing page + +![](data:image/png;base64...) + +* + - * 1. Edit mode + +![](data:image/png;base64...) + +* + - * 1. View mode + +![](data:image/png;base64...) + +#### Business Rule + +1. This step is used to set up a limit to the number of times a message has been sent to per uniquie customer on specific period. +2. This step is also used to setup a limit the number of message that a business allow to send to customer through specific message channel. +3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | Notification Channel/Kênh thông báo | The name of the notification channel | Display | +| | Effective Date From /Hiệu lực từ ngày | The start date of the cap | Display as date format. The display format should respect the configured format. | +| | Effective Date To/Hiệu lực tới ngày | The last effective date of the cap | +| | Frequency Cap/Giới hạn tần suất | The frequency cap on each channel. Each period unit is displayed as a separate record with the cap | Display | +| | Include White List/Bao gồm danh sách trắng | Whitelist who are excluded from the cap or not | Display | +| **Edit mode** | | | | +| | Frequency Cap Id\*/ Id giới hạn tần suất | The Record inditifier | X(10) | +| | Notification Channel\*/Kênh thông báo | Marketing Frequecny Capping identifier A drop-down to select one channel to apply the capping rules. A list incluse following channel: * + - SMS - Email - Push Notifications | Drop-down Select one | +| | Effective Date From \*/ Hiệu lực từ ngày | The start date of the effective period of the cap | Date The system should only have one effective cap applied on each channel at any given time | +| | Effective Date To\*/Hiệu lực tới ngày | The end date of the effective period of the cap | +| | **Frequency Cap/ Giới hạn tần suất** **Require at least one period unit** | | | +| | + Add Period Unit/ Thêm chu kì | Click to add new period unit to limit for chosen channel. | Button | +| | Capping Period \*/Chu kì | A drop-down to select the following period: * + 1. Daily: Maximum number of notifications per day. 2. Weekly: Maximum number of notifications per week 3. Monthly: Maximun number of notifications per month. | Drop-down Select one Each period should only be configured with one cap value at the same time. | +| | Maximum number \*/Số lần gửi thông báo tối đa | The maximum the number of times a message has been sent to per uniquie customer. | 9(12) | +| | Include Whitelist/Không bao gồm danh sách trắng | This option disallows/allows the white customer list allow to receive a higher notification than normal customer for spefic scenario. | Swith button Defaut OFF | +| | Customer list /Danh sách khách hàng | A drop-down to select the white customer list. This allows the system to recognize the white list customers and ignore the frequency capping rules. This is a condition filed and only active and required if the capping rules include the white customer list. | Drop – down Multiple select | +| | Description /Mô tả | The description of the capping. For refer only | X(100) | + +* 1. Frequency Capping are applied to all marketing campaigns in the system for customer level. + 2. The system should automaticallytrack the number of notifications a customer has received across all notification channels as well as the period unit. + 3. If the customer has reached the notification cap then the notification is not delivered to customer. + 4. The white list who are excluded from the frequency cap rules should be tracked also. + +#### Post –condition + +#### Exception flow + diff --git a/docs/staging/specs/marketing/marketing_campaign.md b/docs/staging/specs/marketing/marketing_campaign.md new file mode 100644 index 0000000..143e2dd --- /dev/null +++ b/docs/staging/specs/marketing/marketing_campaign.md @@ -0,0 +1,138 @@ +### Marketing Campaign + +#### Requirement Definition + +* + - 1. Marketing Campagin Module is used to filter out a list of target customers that satisfy the marketing criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre- Conditon + +1. Users have to have access rights in “Marketing Request” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. +3. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. +4. To send marketing messange when an envent is triggered (real time events or batch events + ) then : + 1. Pre-Defined Event: Define the action to indentify when event triggers: such as login/ Get balance detail view/ leave feedback on portal app. + 2. FE Events: APIs or services can be used to initiate the action and make a call to the backend (BE) to determine whether the event has been triggered; if so, the assigned message for this event should be sent. + 3. Batch job: marketing message can be automatically sent by the system via batch jobs. + +#### Wireframe + +* + - * 1. Marketing request summary listing page + +![](data:image/png;base64...) + +1. Filter + +![](data:image/png;base64...) + +1. Create/Edit mode + 1. Step 1: General information + +![](data:image/png;base64...) + +* 1. Step 2: Run schedule + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Step 3: Targeting + +![](data:image/png;base64...) + +4. Detail view + +#### Business Rule + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_12). +2. OLS system will use Query Builder to build query for marketing criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same request. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. Click on the “Marketing Request” in Main icon to bring up the screen for accessing the Marketing Request listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Marketing Request screen is illustrated in the [wireframe](#_Wireframe_12). +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: General Information** | | | | +| | Request ID \* | Unique identifier of the OneMarketing Request Not allow special characters | X(20) | +| | Description \* | Description of the OneMarketing Request | X(100) | +| | Effective Date From\* | The start date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Effective Date To \* | The end date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Marketing Function \* | * Including 2 main functions of OneMarketing Request: + Notification [N] - The message template set up at section [Marketing Message](#_Marketing_message) is sent to target customers + Triger Campain Rule [TCR] - A campaign is applied to add/redeem/adjust points to target customers based on Transaction Code. | Check box Allow to select only one value Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| **Step 2: Run schedule and message content** | | | | +| | Trigger method \* | Two methods to select when message will be sent to target customer: Schedule Event trigger | Radio button Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | Run Schedule \* | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Radio button Lookup value from “Code_Management” table where type code is ‘run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | One time | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\*: This field is only active and required when “One time” schedule is selected. This field is date format (Date time format must respect the date format configuration). This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 2. Request will occur only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n day at the selected time. | | +| | Weekly | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n weeks on selected day of the week and at the selected time | | +| | Monthly | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is selected on “Repeat on the” filed. This is multiple select field. - Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. - In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. - Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occurred every n year on the selected day and selected month. | Drop-down Select one | +| | Business Event | This filed is actived and requied when “Event trigger” method is selected. A drop-down list is used to select the event. When the event occurs, a request is triggered to send a message to the target customer. | Drop-down Multiple select. | +| | Message template\* | This filed is actived and required only when “Notification” marketing function is selected. | Drop-down Lookup value from martketing message screen. | +| | OLS Transaction Code | This filed is actived and required only when “Trigger Campaign Rule” marketing function is selected. | Drop-down Lookup value from OLS Transaction Code screen. Refer “OLS Transaction Code” API under Campaign Management | +| **Step 3: Targeting** **This step is used to config the conditions to get target customer.** | | | | +| | Trigger method \* | There are two options to setup targeting. * + - OMR Criteiria - Upload file | Radio button Lookup value from master data. | +| | **OMR Criteira is selected** | | | +| | ![](data:image/png;base64...) | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each request. The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| | **“Upload file” is selected** ![](data:image/png;base64...) | | | +| | Browse File | Allow users to drag and drop an upload file, or the user can choose a file from their computer to upload it into the system. Use the 'Upload file' option when users have a specific targeting list that they want to use for the campaign. | Button | + +* 1. “Save as draft” and “Save as template” feature are applied on this screen. + 2. **OMR batch job will trigger marketing request as following processing:** + +OMR job (OMR) just trigger effectived marketing requests based on Effective period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + +OMR creates notification messages to be sent to customers selected based on criteria configured by users in the step 3 -OMR criteria – e.g., to send an SMS message to customers whose birthday is due in the next N days. + +OMR can also be configured to trigger awarding batches generated by extracting transactions from Transaction log table. + +OMR can be configrured to trigger CP rule for the customer selected based on based on criteria configured by users in the step 3 -OMR criteria – e.g., to award 100 cash back to customers whose birthday in Tet holiday. + +OMR will stop send message when limit is reached. The limit based on frequency capping configurued by user in step 4- Frequency capping. + +| | | +| --- | --- | +| Batch id | OMR job ==tbd== | +| Description | Processes OneMarketing Requests (OMR) on the configured schedule | +| File Id | Nil | +| Input file | Nil | +| input staging table | ==TBD== | +| Tables read | Its depending in OMR criteria list which should be defined as an attribute for each criteira. == TBD==== | +| Tables updated | =TBD=== | +| Output staging table | Nil | +| Output file | Nil | +| Unwind job | ==TBD== | + +#### Post – Condition + +* + - 1. Marketing content is sent to target customer or Target customer trigger CP rule. + +#### Exception Flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/staging/specs/marketing/marketing_message.md b/docs/staging/specs/marketing/marketing_message.md new file mode 100644 index 0000000..cb2ee82 --- /dev/null +++ b/docs/staging/specs/marketing/marketing_message.md @@ -0,0 +1,184 @@ +### Marketing message + +#### Requirement definition + +1. The marketing message module is used to define a communication message that will be sent to the target list. +2. A Message Template can be built based on a message with pre-defined parameters or HTML file. +3. User can build different messages for different marketing channels (e.g: SMS / Notification Push/ Email/ OTT …). + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-conditions + +1. Users have to have access rights in “Marketing Message” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually message template. +3. Assume that all OMR criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +#### Wireframe + +* + - 1. Message summary listing page + +![](data:image/png;base64...) + +* + - 1. Filter + +![](data:image/png;base64...) + +* + - 1. SMS + +1. Create SMS + +**Step1 : Choose message chanel : SMS and choose create new or re-use existing message template** + +![](data:image/png;base64...) + +**Step 2: Step up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up message content** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Finish by save.** + +1. SMS detail view + +![](data:image/png;base64...) + +* + - 1. **Email** + +1. Create Email message + +**Step 1: Choose message chanel : Email and choose create new or re-use existing Email template** + +![](data:image/png;base64...) + +**Step 2: Set up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up “Sender information”** + +![](data:image/png;base64...) + +**Step 4: Setup Email content** + +![](data:image/png;base64...) + +**Upload email template** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. **Push notification** + +Create Push notification message + +**Step 1: Choose message chanel : Push and choose create new or re-use existing Push template** + +![](data:image/png;base64...) + +**Step 2: Update “Generate information”** + +![](data:image/png;base64...) + +**Step 3.1: Message content configuration for “Richer push”** + +![](data:image/png;base64...) + +**Step 3.2: Message content for “Carousel push”** + +![](data:image/png;base64...) + +**View mode** + +![](data:image/png;base64...) + +#### Business Rules + +1. OLS system can send a message to target customer through a notification on the app, an email, an SMS, and so on. These varied media used for message delivery are known as “channels”. +2. In this version, OLS support to user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. Just enter the email adress or phone number user wish to check the message preview. +3. Besides, OLS support to user can setup message template to re-use in the furture. +4. Click on the “Marketing Message” in Main icon to bring up the screen for accessing the Markting Message listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for marketing message screen is illustrated in the [wireframe](#_Wireframe_10). +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Create /Edit mode** | | | | +| **SMS message** | | | | +| | **Step 1: General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | SMS Type | Drop-down to select SMS type: Promotion/Marketing Transaction | Check box type Select one value only Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date Date time format must respect the date configuration format | +| | Effective End Date \* | The end date of the effective period of the message | Date Date time format must respect the date configuration format | +| | **Step 2: SMS Content Configuration** | | | +| | SMS Brand Name \* | Drop -down to select SMS Sender | Drop-down Lookup value from master data | +| | Message \* | The message content of the SMS. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. SMS message don’t support : 1. Images 1. A subject line 2. Attachments **SMS messages are written in Unicode (non –GSM standard). Standard single message or multi-part message are credited based on the message content.** | X(5000) | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Preview | The message will be automation displayed in the preview part. | Displaya | +| | The number of characters in the message\* | This value will be automatically upadated when the user update the message content. | Display as number format | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a phone number is dispalyed 2. When user click on “Send sample” a confirm message is display. It use to user confirm that the system will send a testing message into inputed phone number. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a sms message into inputed phone number. 3. Mobile phone number should be required when user click on” Send sample”. If not found should reject with error message | Button | +| **Email message** | | | | +| | **Step 1 : General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Email Type | Drop-down to select Email type: **Promotion/Marketing** **Transaction** | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. Lookup value from master data | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format | +| | Use type \* | 2 options to config email message : * + 1. Use messge. 2. Upload template. | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | **Step 2: Sender information** | | | +| | Sender Name\* | The name of sender | X(100) | +| | From email\* | The email addess used to send email to target customer | Display This email is configured. | +| | Subject\* | Subject of email | X(100) | +| | Preview Text | Preheader of Email Preheader can help user connect with customer and increase customer’s open rate. If Prejeader is not provided then the first line of email content will be display instead | X(100) | +| **3.** | **Step 3: Email content figuration** | | | +| | Message | Conditon field The message content of the Email. If “Use message” is selected then this field is actived. System must allow to edit HTML format. The system should support to generate into text format. System must allow to put image/url… as message content. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. | Character | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Upload file | This filed is actived when “Use template” is selected. ![](data:image/png;base64...) Allow users to drag and drop an HTML template file, or they can choose a file from their computer to upload it into the system. After uploading, the system displays message content based on the uploaded file and allows the user to review and make modifications. | Button | +| | Re-Upload | Use this button to re-upload the email template. | Button | +| | Preview the email | The message will be automation displayed in the preview part. Sender / Subject and Preheader will be displayed here. If Preheader is not provided then the first line of message will be display instead. | Display | +| | Send sample | This functions to support the user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter an email address. This entry should adhere to the email format field. 2. When click on “Send sample” a confirm button to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test email into inputed email address. 3. The email address should be required when user click on” Send sample”. If not found should reject with error message. | Button | +| **Notification Push** | | | | +| | **Step 1: General information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Notification Type | Drop-down to select Notification type: Promotion/Marketing Transaction | Check box Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format. | +| | **Step 2: Notification Content configuration** | | | +| | Message Title \* | The primary text that appears at the top of the notification | X(50) | +| | Message \* | The main content of the notification, providing additional information, context, or details related to the notification's purpose. The list of message parameters are included to be used. User can drop/drag message paramters into message. System must allow to put image/url as message content. | Text Area | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Image type\* | Drop- down to selcte image type: SingerEicheer push (No image ) Richer Push (one image) Carousel Push (One or more than one image) | Drop- down Select one only Lookup value “Code Management” table where type code is “image-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Upload Image | Condition field * + - 1. This field is not actived for Single Push 2. Image URL : Click on the Image URL field and type or paste the URL of the image 3. Upload: Drag/Drop image or click the uploaded from computer. If the Image type is 'Carousel Push,' then users can upload more than one image. The sequence sorting will be the same as the sequence displayed in the mobile app. Users can rearrange the images to adjust the sortinng. Image is required for “Richer push” and “Carousel Push”. | | +| | Preview the notification | The message will be automation displayed in the preview part: content/ image. Preview on IOS or Android | Display | +| | Link URL \* | Enter or paste the URL to which the user needs to navigate to. | X(100) | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a CIF Number. From CIF Number the system will locate device's registration token, a device group's notification key, or a single topic. 2. A confirm message to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test notification. 3. The token or key or something else which one the system used determine destination of the push message should be required when user click on” Send sample”. If not found should reject with error message. | Button | + +#### Post -codition + +* + 1. All message which will be sent to target customer are availble to config on following modules : + ++ Marketing Request + ++ Campaign Rule + ++ Item master …. + +#### Exception flow + +* + 1. Input data are not passed all validations and then the user choose cancel the action then use case ends in failure. + diff --git a/docs/specs/archive/application_parameter.md b/docs/staging/specs/system/application_parameter.md similarity index 94% rename from docs/specs/archive/application_parameter.md rename to docs/staging/specs/system/application_parameter.md index 7c618ed..fae1836 100644 --- a/docs/specs/archive/application_parameter.md +++ b/docs/staging/specs/system/application_parameter.md @@ -1,78 +1,73 @@ ---- -title: "Application Parameter" -type: OpenSpec -status: Draft ---- -# Application Parameter - -## Requirement Definition - -* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. - -## Process Flow - -## Wireframe - -* + 1. Access control - -[Image Removed] - -* + 1. Display setting - -[Image Removed] - -* + 1. Functionality - -[Image Removed] - -## Trigger - -## Pre-condition - -* Users have to have access right on this screen in order to access this screen. -* Depending on the user’s access rights, they can view/add/edit/ - -## Business Rule - -* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: - -[Image Removed] - -1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. -2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. -3. Application parameters list detail: - -| Label (EN/VN) | Parameter | Data Type | -| --- | --- | --- | -| **Access *Control*** | | | -| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | -| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | -| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | -| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | -| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | -| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | -| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | -| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | -| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | -| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | -| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | -| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | -| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | -| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | -| **Display Setting** | | | -| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | -| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | -| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | -| **Functionality** | | | -| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | -| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | - -## Post-Condition - -* The application now uses the new, standardized parameter format. -* All existing parameter settings have been successfully migrated to the new format. -* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. -* The application's parameter management is more maintainable, scalable with other systems. - -## Exception flow - +## Application Parameter + +### Requirement Definition + +* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. + +### Process Flow + +### Wireframe + +* + 1. Access control + +![](data:image/png;base64...) + +* + 1. Display setting + +![](data:image/png;base64...) + +* + 1. Functionality + +![](data:image/png;base64...) + +### Trigger + +### Pre-condition + +* Users have to have access right on this screen in order to access this screen. +* Depending on the user’s access rights, they can view/add/edit/ + +### Business Rule + +* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: + +![](data:image/png;base64...) + +1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. +2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. +3. Application parameters list detail: + +| Label (EN/VN) | Parameter | Data Type | +| --- | --- | --- | +| **Access *Control*** | | | +| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | +| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | +| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | +| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | +| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | +| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | +| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | +| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | +| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | +| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | +| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | +| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | +| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | +| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | +| **Display Setting** | | | +| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | +| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | +| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | +| **Functionality** | | | +| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | +| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | + +### Post-Condition + +* The application now uses the new, standardized parameter format. +* All existing parameter settings have been successfully migrated to the new format. +* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. +* The application's parameter management is more maintainable, scalable with other systems. + +### Exception flow + diff --git a/docs/specs/archive/onetargeting.md b/docs/staging/specs/targeting/segmentation.md similarity index 90% rename from docs/specs/archive/onetargeting.md rename to docs/staging/specs/targeting/segmentation.md index 60ffa34..f3e1c80 100644 --- a/docs/specs/archive/onetargeting.md +++ b/docs/staging/specs/targeting/segmentation.md @@ -1,146 +1,139 @@ ---- -title: "OneTargeting" -type: OpenSpec -status: Draft ---- -# OneTargeting - -## Segmentation Definiiton - -### Requirement Definition - -* 1. Segmentation is one proessing to divide a customer base into smaller, that provides a way to narrow down the target audience based on the types of products or services the customers have previously purchased. - 2. This screen allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. - 3. In the system sides, segement is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup the targeting customer. - -### Process Flow - -### Trigger - -* + 1. User access to the OneTargeting Module to create/update new segment. - -### Pre-Conditions - -1. Users have to have access rights in “Segmentation” module to able to access this screen. -2. Depending on the user's access rights, they can view, add, edit, or manually approval. -3. Assume that all criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. - -### Wireframe - -* + - 1. Create /Edit mode - -[Image Removed] - -[Image Removed] - -* + - 1. View mode - -### Business Rules - -1. The same approach as Campaing Rule Crireria screen, OLS system will use Query Builder to build query for this screen. -2. Refer to [Rule Criteria](#_Business_rules_1) section to get more detail about the business rule of this screen. The criterion list are described in the #3. -3. Here are some way that business segment their targeting customer : - -| **Index** | **Segement Group** | **Criteria Group** | **Combination by following Criteia** | **Segment Example** | -| --- | --- | --- | --- | --- | -| | Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children: 0 -14 Youth: 15- 24 Adults: 24- 64 Seniors: 65 and above | -| Last Name | | -| First Name | | -| Income | **Income segment**: High-Income Customer Middle –Icome Customer Low-Income Customer | -| Gender | Male customer Female customer | -| Marital Status | Singel customer Married customer | -| DOB | **Generation segment:** Gen Z: Year DOB from 1997 – 2012 Gen Y: 1981 – 1996 Gen X: 1965 – 1980 Gen W (Baby Boomers): 1946- 1964 | -| Location: Country/State/City/Zip Code | **Geography segement:** International customer Urban customer Suburban customer Mountain Customer | -| Customer’s Tenure | **Customer’s Tunure** **Segment** (Use Customer Registration) : New customer: under 1 year Early- tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long - tenured customer: above 5 years | -| Account ‘s Tenure | **Account’s Tunure** **Segment** (use AOD) : New customer: under 1 year Early - tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long tenured customer: above 5 years | -| Account’s Status | | -| Next AOD | | -| Customer’s staus | Used in the many segment that | -| | Behavior Segmentation | Transaction | Last transaction /Integration | **Churned customer :** E.g Last transaction is more than 6 months ago and customer status is active | -| Transaction Frequency: Should be tracked in the specific period such as day/week/month / Quarter/Year/Custom period to determine for following criteria : * + 1. **Total number txn frequency on the specific period.** 2. **Avegare txn frequency** | **Customer Segment:** High-Value Customers: frequency range depend on each business rule Medium-Value Customers: frequency range depend on each business rule Low-Value Customers: frequency range depend on each business rule | -| Customer Recency: When was the last transaction/ integration. | -| Total spending value: How much customer spends (total nett transaction amount) | -| Transaction Date | **Peak –Time customer:** E.g Transaction date is on special day Transaction date on weekend (day of the week) Midnight transaction (Time of the transaction) **Consistent-Time Customers**: E.g Transaciton do on each the first day of the month **Flexible-Time Customers** E.g Transaciton is on specific day | -| Transaction Time | -| Merchant: Coporation/Chain/Store/MCC | Use with another crieteria or itself only to create specific segment | -| Merchant Group: Coporation/Chain/Store/MCC Group | -| Transaction Description | -| Transaction Category | -| Transaction Gross Amount | -| Transaction Nett Amount | -| | Flexible segment | Attribute | Attribute Criteria | | -| | Psychographic Segmentation | Item | Favorite Category | **Life Style segment** **Interest segment** **Opinion segment** | -| Favorite Item | -| To be added when implement onedisplay so that we can have the data source for collect the Psychographic Segmentation from survey to decision the marketing strategy | - -### Post-Conditions - -* + - * 1. Each segment are used to define the targeting customer on the marketing module. - -### Exception Flow - -## Audience Upload - -### Requirement Definition - -Provide a user –friendly interface to marketers to manage audience uploads. - -### Process Flow - -### Trigger - -### Pre-Conditions - -1. Users have to have access rights in “Audience Upload” module to able to access this screen. -2. Depending on the user's access rights, they can view, add, edit, or manually approval. - -### Wireframe - -### Business Rules - -Users are able to upload a customer data for targeted marketing campaigns by uploading a file into the system. - -The system should allow users map data from their source files to the required platform fields by accepting the CSV, excel spreadsheets. - -The system validates the uploaded data to ensure all required fields are present and in the correct format - -Screen descrition - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data Type** | -| **Listing page** | | | | -| | Audience Name /Tệp khán giả | Name of the audience | Dipslay | -| | Description /Mô tả | Audience description For use refer only | Display | -| | File size /Dung lượng tệp | The file size | Display as number format | -| | [Image Removed] | By clicking here to download the audience. This should be orginal file tha user already uploaded. | Button | -| **Create/Edit Mode** | | | | -| | File ID \*/ ID tệp | Audience identifier For system refer only | X(10) | -| | Audience Name \*/ Tệp khán giả | The name of the audience Should be uniquie value in the system. | X(50) | -| | Description /Mô tả | Audience description | X(200) | -| | Upload file \*/ Đăng tệp tin lên | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse file from their device. | Button | -| | | | | - -### Post-Conditions - -### Exception Condition - -## Customer Audience - -### Requirement Definition - -### Process Flow - -### Trigger - -### Pre-Conditions - -### Wireframe - -### Business Rules - -### Post-Conditions - -### Exception Flow - -End of Document \ No newline at end of file +# Segmentation + +## Segmentation Definition + +### Requirement Definition + +* 1. Segmentation is one proessing to divide a customer base into smaller, that provides a way to narrow down the target audience based on the types of products or services the customers have previously purchased. + 2. This screen allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. + 3. In the system sides, segement is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup the targeting customer. + +### Process Flow + +### Trigger + +* + 1. User access to the OneTargeting Module to create/update new segment. + +### Pre-Condition + +1. Users have to have access rights in “Segmentation” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. +3. Assume that all criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +### Sktech + +* + - 1. Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. View mode + +### Business Rule + +1. The same approach as Campaing Rule Crireria screen, OLS system will use Query Builder to build query for this screen. +2. Refer to [Rule Criteria](#_Business_rules_1) section to get more detail about the business rule of this screen. The criterion list are described in the #3. +3. Here are some way that business segment their targeting customer : + +| **Index** | **Segement Group** | **Criteria Group** | **Combination by following Criteia** | **Segment Example** | +| --- | --- | --- | --- | --- | +| | Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children: 0 -14 Youth: 15- 24 Adults: 24- 64 Seniors: 65 and above | +| Last Name | | +| First Name | | +| Income | **Income segment**: High-Income Customer Middle –Icome Customer Low-Income Customer | +| Gender | Male customer Female customer | +| Marital Status | Singel customer Married customer | +| DOB | **Generation segment:** Gen Z: Year DOB from 1997 – 2012 Gen Y: 1981 – 1996 Gen X: 1965 – 1980 Gen W (Baby Boomers): 1946- 1964 | +| Location: Country/State/City/Zip Code | **Geography segement:** International customer Urban customer Suburban customer Mountain Customer | +| Customer’s Tenure | **Customer’s Tunure** **Segment** (Use Customer Registration) : New customer: under 1 year Early- tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long - tenured customer: above 5 years | +| Account ‘s Tenure | **Account’s Tunure** **Segment** (use AOD) : New customer: under 1 year Early - tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long tenured customer: above 5 years | +| Account’s Status | | +| Next AOD | | +| Customer’s staus | Used in the many segment that | +| | Behavior Segmentation | Transaction | Last transaction /Integration | **Churned customer :** E.g Last transaction is more than 6 months ago and customer status is active | +| Transaction Frequency: Should be tracked in the specific period such as day/week/month / Quarter/Year/Custom period to determine for following criteria : * + 1. **Total number txn frequency on the specific period.** 2. **Avegare txn frequency** | **Customer Segment:** High-Value Customers: frequency range depend on each business rule Medium-Value Customers: frequency range depend on each business rule Low-Value Customers: frequency range depend on each business rule | +| Customer Recency: When was the last transaction/ integration. | +| Total spending value: How much customer spends (total nett transaction amount) | +| Transaction Date | **Peak –Time customer:** E.g Transaction date is on special day Transaction date on weekend (day of the week) Midnight transaction (Time of the transaction) **Consistent-Time Customers**: E.g Transaciton do on each the first day of the month **Flexible-Time Customers** E.g Transaciton is on specific day | +| Transaction Time | +| Merchant: Coporation/Chain/Store/MCC | Use with another crieteria or itself only to create specific segment | +| Merchant Group: Coporation/Chain/Store/MCC Group | +| Transaction Description | +| Transaction Category | +| Transaction Gross Amount | +| Transaction Nett Amount | +| | Flexible segment | Attribute | Attribute Criteria | | +| | Psychographic Segmentation | Item | Favorite Category | **Life Style segment** **Interest segment** **Opinion segment** | +| Favorite Item | +| To be added when implement onedisplay so that we can have the data source for collect the Psychographic Segmentation from survey to decision the marketing strategy | + +### Post-Condition + +* + - * 1. Each segment are used to define the targeting customer on the marketing module. + +### Exception Flow + +## Audience Upload + +### Requirement Definition + +Provide a user –friendly interface to marketers to manage audience uploads. + +### Process flow + +### Trigger + +### Pre-Condition + +1. Users have to have access rights in “Audience Upload” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. + +### Sktech + +### Business rules + +Users are able to upload a customer data for targeted marketing campaigns by uploading a file into the system. + +The system should allow users map data from their source files to the required platform fields by accepting the CSV, excel spreadsheets. + +The system validates the uploaded data to ensure all required fields are present and in the correct format + +Screen descrition + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data Type** | +| **Listing page** | | | | +| | Audience Name /Tệp khán giả | Name of the audience | Dipslay | +| | Description /Mô tả | Audience description For use refer only | Display | +| | File size /Dung lượng tệp | The file size | Display as number format | +| | ![](data:image/png;base64...) | By clicking here to download the audience. This should be orginal file tha user already uploaded. | Button | +| **Create/Edit Mode** | | | | +| | File ID \*/ ID tệp | Audience identifier For system refer only | X(10) | +| | Audience Name \*/ Tệp khán giả | The name of the audience Should be uniquie value in the system. | X(50) | +| | Description /Mô tả | Audience description | X(200) | +| | Upload file \*/ Đăng tệp tin lên | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse file from their device. | Button | +| | | | | + +### Post-condition + +### Exception Condition + +## Customer Audience + +### Requirement Definition + +### Process flow + +### Trigger + +### Pre-Condition + +### Wireframe + +### Business rules + +### Post-condition + +### Exception flow diff --git a/docs/specs/archive/reward_campaign_management.md b/docs/staging/structured/campaign/campaign.md similarity index 78% rename from docs/specs/archive/reward_campaign_management.md rename to docs/staging/structured/campaign/campaign.md index 512803d..4fcfedb 100644 --- a/docs/specs/archive/reward_campaign_management.md +++ b/docs/staging/structured/campaign/campaign.md @@ -1,1742 +1,1737 @@ ---- -title: "Reward Campaign Management" -type: OpenSpec -status: Draft ---- -# Reward Campaign Management - -## Highlights - -1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. -2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. -3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: - -Customer - -Account # 1 - -Account # 2 - -Account # 3 - -Smart$ - -Cash Rebates - -UNIRM - -Product Holdings - -Reward Pools PoolsBalances - -Account # 4 - -* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type - -Loyalty Account Acct - -Figure 9 – Customer View - -1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. - 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. - 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. -2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. -3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. -4. A single transaction can trigger multiple concurrent award programs. -5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. -6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. -7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. -8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. - 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: - 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) - 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. - 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically - 5. Instant discounts (specific to SKU codes i.e. purchased item codes). -9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. -10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). -11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. -12. Practically unlimited number of reward campaign rules can be run concurrently. -13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: - 1. Demographic attributes: Age group, Gender, etc. - 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week - 3. Location of transaction - 4. Instant transaction amount - 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) - 6. Transaction count (number of transactions in a period - 7. Average balance over a specified period, period-end balance over a specified period - 8. Card type (product account type) - 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) - 10. User-defined attributes associated with customer and / or product accounts, etc. -14. Rewards can be tracked at - 1. Customer level: single reward balance for customer - 2. Product level: rewards tracked as a separate balance per Product Account. -15. Customer can redeem their incentives and rewards through any of the following: - -| | | -| --- | --- | -| * 1. EDC terminals at partner outlets | * 1. Call center | -| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | - -## Structure of a Campaign (HAVE TO BE ADJUSTED) - -### Types of Campaign Mechanics - -1. Reward campaigns can be broadly divided into two types or models: - 1. Those that award on every transaction (“Award on Every Transaction”) and - 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward -2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. - -### Award on Every Transaction - -1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: - 1. The reward is determined at the time the transaction is processed in BLP. - 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: - -[Image Removed] - -Figure 10 – Process Flow for Award Per Transaction - -1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules - 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. - 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems -2. Campaign Rules are set up as described in the rest of this section 4. -3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. - -### Accumulate Then Award - -1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. - 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. - 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P - 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters - 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. - 3. The structure and mechanism of how Counters work are described in section 4.2.6. - 3. The Campaign structure of such a Campaign is broadly outlined in the following: - -[Image Removed] - -Figure 11 – Structure of “Accumulate Then Award” Campaigns. - -1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules -2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. - -### Auto-redemption Campaigns - -1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. -2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. - -### Reward Pool Structure & Bucket Deduction Sequence - -1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. -2. Pools belong to “Loyalty Accounts” or LAs. -3. One LA is created per Customer (per unique CIF Number). -4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc -5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. -6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. -7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): - -| | | | | -| --- | --- | --- | --- | -| UNIRM Pool | Account Type | Expiry Date | Balance | -| A | 31-Mar-2015 | 100 | -| B | 31-Mar-2015 | 50 | -| A | 30-Jun-2015 | 110 | -| B | 30-Jun-2015 | 510 | -| A | 31-Sep-2015 | 140 | -| C | No Expiry | 215 | -| TOTAL BALANCE | | 1,125 | - -1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. -2. When customer redeems: - 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). - 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. - 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. -3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. - -### Counters – Structure and Mechanics - -1. A Counter is a conceptual entity that tracks a quantity over a defined period of time -2. For example, a Counter may track: - 1. Customer’s total spend per month - 1. Use Case example: to award customers who spend more than 1,000 a month - 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. - 2. The total points earned by an Account in the entire Campaign - 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign [Image Removed] - 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. - 3. The number transactions awarded at individual merchants (Store Ids) per month - 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign - 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. -3. The key data entities making up Counter are defined in the following table: - -| | | | | | | | | | | | | | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | **Data Entity** | | **Description** | | | | | | | | | | | -| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | -| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | -| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | -| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | -| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | -| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | -| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | -| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | -| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | -| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | -| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | -| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | -| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | -| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | -| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | -| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | -| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | -| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | -| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | -| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | -| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | -| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | -| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | -| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | -| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | -| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | -| | | | DY | | SD = FSD | | | | | | | | | -| | | | MN | | SD = Start of Month of FSD | | | | | | | | | -| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | -| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | -| | Reset Value | 9(16,2) | | | | | | | | | | | | -| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | - -## About Loyalty Marketing Campaigns (HAVE TO BE ADDED) - -## External Transaction Code - -### Requirement Definition - -* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. - 2. The External System TC is the first key is located OLS TC for processing the transaction. - 3. The TC values will be agreed with users at the time of setting up the system. - 4. Each External Transaction Code must have an OLS Transaction Code associated with it. - -For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. - -### Process Flow - -[Image Removed] - -### Trigger - -* 1. New transaction code coming from external system then user have to define new external TC in OLS. - 2. Some description should be adjusted then user have to modify. - 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. - -### Pre-Conditions - -* 1. Users have to have the access right on this screen in order to accesss this screen. - 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. - -### Wireframe - -* 1. Summary listing page - -[Image Removed] - -* 1. Detail view - 2. Detail view - -[Image Removed] - -* 1. Record status and history - -[Image Removed] - -* 1. Create/Edit form - -[Image Removed] - -### Business Rules - -1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : -3. **Screen descriptions** - -| | | | | -| --- | --- | --- | --- | -| **No** | **Field** | **Description** | **Data tye** | -| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | -| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | - -1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. -2. Repeat for each TC to be added/Edited. - -### Post-Conditions - -1. User able to proceed to OLS Transaction Code screen. See in section 4.5 - -### Exception Flow - -1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. - -## OLS Transaction Code - -### Requirement Definition - -1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. -2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. -3. For example: - 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. - -### Process Flow - -[Image Removed] - -### Trigger - -1. New transaction code coming from external system then the user has to define new OLS TC also. -2. New OLS transaction coming from internal transaction. -3. Some detailed information should be adjusted then the user has to modify it. -4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. - -### Pre-Conditions - -1. Users have to have the access right on this screen in order to access this screen. -2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. -3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. - -### Wireframe - -1. Summary listing page - -[Image Removed] - -Figure 1 – Summary listing page - -[Image Removed] - -Figure 2 – Filer and quick search - -1. Detail view - 1. Detail view - -[Image Removed] - -* 1. Record status ( History) - -[Image Removed] - -1. Create/Edit form - -[Image Removed] - -### Business Rules - -1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 -2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : -3. **Screen descriptions** - -| | | | | -| --- | --- | --- | --- | -| **No** | **Field** | **Description** | **Data tye** | -| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | -| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | -| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | -| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | - -1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. -2. Repeat for each TC to be added/edited. - -### Post-Conditions - -1. User able to proceed to Campaign Rule Set-up. See section>>>>> - -### Exception Flow - -1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. - -## Pool Definition - -### Requirement Definition - -1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. -2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. -3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. -4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. -5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). -6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc - -### Process Flow - -[Image Removed] - -### Trigger - -1. Reward pool is not existing in OLS or have some informations need to be corrected. - -### Pre-Conditions - -1. Users have to have the access right on this screen in order to view/update or approve these records. -2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). -3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). -4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) - -### Wireframe - -1. Summary listing page - -[Image Removed] - -Figure 1- Empty page - -[Image Removed] - -Figure 2- Listing page - -[Image Removed] - -Figure 3- Filter - -1. Detail view - 1. Pool detail - -[Image Removed] - -* 1. Record history - -[Image Removed] - -* 1. Pending record - -[Image Removed] - -1. Create/Edit form - 1. General information - -[Image Removed] - -* 1. Product Specific Expiry - -[Image Removed] - -[Image Removed] - -* 1. Velocity Control - -[Image Removed] - -[Image Removed] - -### Business Rules - -1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 -2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : -3. **Screen descriptions** - -| Seq | Field (EN /VN) | Description | | Type | -| --- | --- | --- | --- | --- | -| **Statistic information** | | | | | -| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | -| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | -| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | -| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | -| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | -| **Step 1: General information** | | | | | -| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | -| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | -| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | -| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code\_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | -| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code\_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | -| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | -| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | -| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | -| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool\_Conversion\_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | -| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | -| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code\_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | -| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account\_Type\_Group table). Refer “Account Type Group” API under “Campaign Management” | -| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | -| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code\_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | -| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | -| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product\_Account\_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | -| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product\_Account\_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | -| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code\_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | -| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | -| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | -| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | -| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | -| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code\_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | -| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code\_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | -| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code\_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | -| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code\_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | -| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code\_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | -| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | -| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | -| **Effected Campaign Rule listing linked this reward pool** [Image Removed] | | | | | -| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN\_RULE table | -| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN\_RULE table | -| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN\_TC\_LINKAGE table | -| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN\_RULE table | -| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN\_RULE table | - -1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. -2. Repeat for each reward pools to be added/edited. - -### Post-Conditions - -1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. -2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. -3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. -4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. -5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. -6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). - -### Exception Flow - -1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Pool Conversion Rate - -### Requirement Definition - -1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. -2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency\_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. - -### Process Flow - -[Image Removed] - -### Trigger - -1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. - -### Pre-Conditions - -1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. -2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. - -### Wireframe - -1. Summary listing page - -[Image Removed] - -Figure 1 – Pool Conversion Rate - -[Image Removed] - -Figure 2- Currency Rate - -1. Detail view - 1. Detai view - -[Image Removed] - -Figure 1 - Pool Conversion Rate - -[Image Removed] - -Figure 2- Currency Rate - -* 1. Record status - -[Image Removed] - -Figure 1- Pool Conversion Rate - -1. Create/Edit form - -[Image Removed] - -Figure 1- Pool Conversion Rate - -[Image Removed] - -Figure 2 – Currency Rate - -### Business Rules - -1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. -2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. -3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 -4. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. -5. **Screen descriptions:** - -| Seq | Field (EN/VN) | Description | Type | -| --- | --- | --- | --- | -| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | -| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | -| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | -| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | -| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | -| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | -| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | -| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | -| | Effective End Date\*/ Ngày kết thúc | - -### Post-Conditions - -* 1. User able to proceed Pool Definition setup. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Counter Definition - -### Requirement Definition - -* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. -* The Counters can then be referenced in Campaign Rules are criteria. -* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. -* A Counter is structured - + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. - + The cut-over from one period to the next can be: - - 1. Automatic based on the Transaction Date or the Batch Date, or - 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” -* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. - + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. - + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” - + A new “current” bucket is automatically created by subsequent updates. -* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 - + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules - + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month - + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. - -### Process Flow - -[Image Removed] - -### Trigger - -* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. -* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 -* For example: - + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter - + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter - + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter - -### Pre-Conditions - -N/A - -### Wireframe - -* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: - -[Image Removed] - -* Use the search filter to locate the counter required: - -[Image Removed] - -* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following - -[Image Removed] - -* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: - -[Image Removed] - -* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: - -[Image Removed] - -### Business Rules - -The key data entities making up Counter are defined in the following table: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | -| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | -| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | -| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | -| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | -| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code\_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | -| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code\_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | -| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | -| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | -| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code\_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | -| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | -| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | -| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | -| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | -| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code\_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | -| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code\_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | -| **Validation:** - If the Counter Id already exists counter value (counter\_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter\_stock table. | | | | - -### Post-Conditions - -* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: - -[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) - -1. Late counter transaction posting - -**When late transaction is comming:** - -If "Late Transaction Posting Option" = "Update Late Value" - -& State! = C then update - -Else if "Late Transaction Posting Option" = "Update Current Bucket" - -& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. - -**Scenario: [Image Removed]** - -### Exception Flow - -## Transaction Category - -### Requirement Definition - -* 1. Transaction Category help business can define each processed transaction under pre-defined category. - 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. - 3. **Business case:** - -3.1 Enrollment Program - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | -| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | -| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | -| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | -| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | - -If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. - -Therefore If the 4 conditions are are captured as transaction category then we have: - -TxCat1 = Dining txns, local currency + DCC - -TxCat2 = Entertainment txns, local currency + DCC - -TxCat3 = Dining txns, foreign currency + not DCC - -TxCat4 = Entertainment txns, foreign currency + DCC - -To archive this campaign, when define the transaction category we just need: - -* One counter under Account-TxnCat couter level -* One CEP rule to extract counter value to trigger award rule to get award points/cash back. -* One Campaing Rule using F6 to fulfilment this requirement. - -### Process Flow - -### Trigger - -### Pre-Conditions - -1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. -2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup - -### Wireframe - -* + - 1. Create/Edit mode - -[Image Removed] - -[Image Removed] - -### Business Rules - -1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. -2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. -3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. -4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. - -*For example:* - -*Rule 1:* - -*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* - -*Rule 2:* - -*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* - -1. Introduce NOT toggle switch to support exclusion criteria. -2. User can put the key word to search criteria on Right Criteria panel. -3. Each criteria can be used one more time in the same category. -4. **Screen description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **General information** | | | | -| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | -| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | -| | Description/Mô tả | Description for refer only | X(100) | -| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | - -### Post-Conditions - -* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. - -### Exception Flow - -## Account Type Group - -### Requirement Definition - -* + - 1. An account type is a combination of Product account level and product account type. - 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) - 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. - 4. There is no ATG checking for redemption and negative adjustment. - 5. An ATG Sequence number is assigned to each Account Type in an ATG. - 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. - -### Process Flow - -[Image Removed] - -### Trigger - -1. New account type is coming then need to be added this account under ATG of reward pools. -2. Some points need to be corrected for existing ATG. - -### Pre-Conditions - -1. Users have to have the access right on this screen in order to can view/update or approve these records. -2. Account type which apply for ATG have to be actived on OLS. - -### Wireframe - -* + - * 1. Summary listing page - -[Image Removed] - -Figure 1 – Listing page - -[Image Removed] - -Figure 2- Filter - -* + - * 1. Detail view - 1. Detail view - -[Image Removed] - -* 1. Record status (history) - -[Image Removed] - -* + - * 1. Create/Update form - -[Image Removed] - -### Business Rules - -* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. - 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) - 3. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): - 4. **Screen descriptions:** - -| Seq | Field (EN/VN) | Description | Type | -| --- | --- | --- | --- | -| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | -| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | -| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | -| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | -| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | -| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. [Image Removed] | | | | -| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool\_Definition table where ATG of the pool is selected ATG. | -| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | -| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign\_Rule table by specific pool Id | -| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign\_Rule” table by specific Campaign Rule ID~~ | -| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign\_Rule” table by specific Campaign Rule ID | - -### Post-Conditions - -1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: - 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. - 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). - 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). - 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. - 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. - -* Example of an ATSP comprising 2 Account Types - -ATSP Id PA Level PA Type Sequence Number - -| 11 | | 830 550 | | 10 | - -| 11 | | 830 630 | | 20 | - -When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account - -*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. - -*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. - -1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: - -* A = set of all Acct Types of Cust -* B = set of Acct Type in ATG of Pool -* C = Intersection of A and B - -**Therefore**: - -* If C is null then txn is rejected. -* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. - -**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. - -1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. - -* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. -* If CIF number is provided only then TP base on following process to find eligible account to process: - -A = set of all Acct Types of Customer - -B = set of Acct Type in ATG of Award Pool - -C = Intersection of A and B - -**Therefore:** - -* If C is null then txn is rejected. -* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. - -**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. - -1. ATG is used to validate blocked transaction. -2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Reward Campaign - -### Requirement Definition - -1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. -2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. -3. A single transaction can trigger multiple concurrent award programs. -4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. -5. Type of campaign in OLS: - -* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: - -[Image Removed] - -* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: - -[Image Removed] - -1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. -2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. - -### Process Flow - -### Trigger - -### Pre-Conditions - -1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. - -### Wireframe - -Refer wireframe on figma. - -### Business Rules - -* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) - -1. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) -2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. -3. Screen descriptions - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Create/Edit mode** | | | | -| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | -| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | -| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | -| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | -| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code\_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | -| | **Campaign Target** | | | -| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | -| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | -| **View mode: Display all field of create mode and add following fields:** | | | | -| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | -| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | -| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | - -### Post-Conditions - -### Exception Flow - -## Reward Campaign Rule - -### Requirement Definition - -* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. - 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. - 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. - 4. In this version we support following Campaign Rule type: -* Award -* Redeem -* Adjust -* Item Redemption -* Counter Extract and Process -* Redeem Extract and Process -* Transaction Extract and Process - 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust - -### Process Flow - -### Trigger - -### Pre-Conditions - -* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. - -### Wirefame - -Refer to Figma. - -### Business Rules - -* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe - 2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe - 3. Campaign Rule Screen can be display as a submodule of Campaing module as well - 4. **Screen description for Edit/Create mode** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Choose rule type to configurate campaign Rule** | | | | -| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code\_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | -| **Step 1: General information** | | | | -| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | -| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | -| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | -| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | -| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | -| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | -| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | -| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | -| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code\_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | -| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool\_Definition" table. Refer "Pool Definition" API under Campaign Management. | -| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | -| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | -| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | -| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | -| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | -| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | -| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction\_Code" table. Refer "OLS Transaction Code" API under Campaign Management | -| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | -| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | -| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | -| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | -| **Step 4: Formula setting** | | | | -| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | -| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code\_Management" table where code type is "amt-to-use-formula" | -| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | -| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code\_Management" table | -| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter\_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | -| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | -| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code\_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | -| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | -| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | -| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code\_Management" table | -| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute\_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | -| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code\_Management" table | -| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter\_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | -| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | -| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | -| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | -| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | -| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | - -### Post-Conditions - -Amount to use feature with Transaction Processing. - -[Image Removed] - -[Image Removed] - -### Exception Flow - -## Campaign Rule Criteria - -### Requirement Definition - -1. Rule criteria are divided into 5 categories for ease of maintenance: - -| | | | -| --- | --- | --- | -| Customer | Account | Transaction | -| Atttribute | Counter | Merchant | - -1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. - -### Process Flow - -[Image Removed] - -### Trigger - -* 1. Exsiting Campaign require at least one campagin rule validate criterions. - -### Pre-Conditions - -1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. -2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== - -[Image Removed] - -1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. - -### Wireframe - -[Image Removed] - -Figure 1 - Query builder - -[Image Removed] - -Figure 1 – Rule criteria - -[Image Removed] - -Figure 2- Drag criteria into Rule - -[Image Removed] - -Figure 3 – Rule criteria screen after complete setup - -### Business Rules - -1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). -2. OLS system will use Query Builder to build query for Rule Criteria. -3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. -4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. - -*For example:* - -*Rule 1:* - -*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* - -*Rule 2:* - -*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* - -1. Introduce NOT toggle switch to support exclusion criteria. -2. User can put the key word to search criteria on Right Criteria panel. -3. Each criteria can be used one more time in the same campaign rule. -4. **Screen description:** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| | [Image Removed] | Click to add new criteria | Button | -| | [Image Removed] | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “[Image Removed]” button to create new group. | Button | -| | [Image Removed] | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | -| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. [Image Removed] | View only | -| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. [Image Removed] | Action | -| | [Image Removed] | Click to delete criteria | Button | -| | [Image Removed] | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | -| | Criteria | **Criteria Structure:** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code\_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | - -1. **Right panel** - -In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. - -Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== - -Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== - -**Some use case for each criteia group:** - -| | | | -| --- | --- | --- | -| **Index** | **Use case** | **Criteria group** | -| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | -| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | -| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | -| | MCC group Store group Chain group Corporation group | Transaction criteria | -| | ATG criteria | Account Criteria | -| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | - -1. **Query builder structure** - -*For example:* - -*+ Account type criteria has data type as string and filter value is account type list from PRODUCT\_ACCOUNT\_TABLE.* - -*+ Transaction description criteia has data type as string but filter value is enterted by user.* - -*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE\_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* - -| | | | | | -| --- | --- | --- | --- | --- | -| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | -| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: [Image Removed] | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | -| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. [Image Removed] | -| | Is empty ( NULL) | This condition checks whether the comparison value is empty. [Image Removed] | MUST not display filter value field and input type | -| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. [Image Removed] | -| | Contains | This condition checks whether the comparison value contains the filter value. [Image Removed] | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example [Image Removed] | -| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. [Image Removed] | -| | Is in | This condition checks whether the comparison value is in one of the filter value. [Image Removed] | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example [Image Removed] 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | -| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. [Image Removed] | -| | Begins with | This conditon checks whether the comparison text begins with the filter value. [Image Removed] | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example [Image Removed] Should not be case sensitive | -| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. [Image Removed] | -| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. [Image Removed] | -| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. [Image Removed] | -| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. [Image Removed] | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | -| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. [Image Removed] | -| | Is less than (<) | This condition checks Comparison value is less than filter value. [Image Removed] | -| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. [Image Removed] | -| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. [Image Removed] | -| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. [Image Removed] | -| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. [Image Removed] [Image Removed] | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | -| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. [Image Removed] | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | -| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. [Image Removed] | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | -| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* [Image Removed] *For example 2: Customer’s birthday from Jul 01 to Jul 15* [Image Removed] | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | -| | Is fixed date | This condition checks whether the comparison value is equal to filter value [Image Removed] | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | -| | Is null | The comparison value must be null value | There is no filter value | -| | Is not null | The comparison value must be null value | -| | Is betweenperiod from N (min to max value). | [Image Removed] **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* [Image Removed] ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) [Image Removed] ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** [Image Removed] | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | -| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. [Image Removed] | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | -| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. [Image Removed] | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | -| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value [Image Removed] | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | - -### Post-Conditions - -* 1. User able to proceed next step to complete campagin rule setup. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Campaign Rule Formula - -### Requirement Definition - -1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. -2. Sometimes we was using campaing formula to update the counter value or attribute value as well. -3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. - -### Process Flow - -### Trigger - -### Pre-Conditions - -### Wireframe - -### Business Rules - -See more detail in attached file - -[Image Removed] - -[Image Removed] - -### Post-Conditions - -### Exception Flow - -## Campaign Rule – Contributor Settings - -### Requirement Definition - -1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. -2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. - -### Process Flow - -[Image Removed] - -### Trigger - -* 1. Campaign require a list of Contributors configured for the Rule. - -### Pre-Conditions - -1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. -2. The merchant as a “contributor” of the award transaction should availble on OLS system. - -### Wireframe - -* + 1. Contributor setting - -[Image Removed] - -[Image Removed] - -### Business Rules - -* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. - -1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). -2. Click on Add button ([Image Removed]) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). -3. Screen descriptions - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Description** | **Type** | -| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | -| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | -| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | -| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | -| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | -| | [Image Removed] | Clicking Click on the “[Image Removed]” icon removes the Contributor row | Button | - -1. The total contribution must be 100%. -2. Contributor must be uinique on each campaign rule. -3. If contributors are configured then must have one and only one contributor is “absord remider”. -4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) - -### Post-Conditions - -* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Counter Extract & Process (CEP) Request - -### Requirement Definition - -* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. - -### Process Flow - -### Trigger - -### Pre-Conditions - -1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. -2. All drop-down value must avaiable in the system. - -### Wireframe - -Please refer figma to get more detail. - -### Business Rules - -* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. - 2. Click on Add button ([Image Removed]) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | -| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | -| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | -| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | -| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | -| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | -| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | -| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | -| **Step 2: Rule setting** | | | | -| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | -| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter\_Definition" table. Refer "Counter Definition" API under Campaign Management | -| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code\_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | -| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code\_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | -| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction\_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | -| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction\_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | -| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason\_code" table. Refer "Reason Code"API under Code maintenance | -| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | -| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | -| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | -| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | -| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | -| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code\_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | -| | Day | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | -| | Month | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | -| | Annually | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | -| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | -| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | - -### Post-Conditions - -1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: - 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== - 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== - 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== - -| | | | | -| --- | --- | --- | --- | -| | **Counter Bucket To Extract** | | | -| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | -| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | -| * Monthly on Day N of Month | -| * Statement Cycle Date | -| * N Days after AOD | -| * Annually, on Day N of Month M | - -* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run - 2. Counter state is update when CEP extract based on Counter definition setup : - + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. - + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. - + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. - -### Exception Flow - -N/A - -## Redemption Extract & Process (REP) Rule - -### Requirement Definition - -1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. -2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. -3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. - -### Process Flow - -### Trigger - -* + - 1. The campaigns require the system automation extract the pool balances. - -### Pre-Conditions - -1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. -2. All drop-down value must available in the system. - -### Wireframe - -* + - 1. Please help to refer on the figma. - -### Business Rules - -* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. - 2. Click on Add button ([Image Removed]) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | -| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | -| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | -| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | -| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | -| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | -| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | -| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | -| **Step 2: Rule setting** | | | | -| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool\_Definition” table. Refer “Pool Definition”API under Campaign Management | -| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | -| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | -| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction\_Code”table Refer “OLS Transaction Code” API under Campaign Management | -| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | -| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | -| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction\_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | -| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason\_code" table. Refer "Reason Code"API under Code maintenance | -| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | -| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | -| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code\_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | -| | Day | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | -| | Month | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | -| | Annually/Hàng năm | [Image Removed] * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code\_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | -| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | -| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | -| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | - -### Post-Conditions - -REP batch job extract balance based on REP rule type configure. - -=tbd== - -### Exception Flow - -## Item Redemtion Rule Type (ITRD) - -### Requirement Definition - -Item redemption Rule Type is used to to evaluate item redemption transactions. - -The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. - -Redemption pool which be used to redeem wil be configured in item price instead. - -### Process Flow - -Update later - -### Trigger - -If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. - -### Pre-Conditions - -1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. -2. All drop-down value must available in the system. - -### Wireframe - -Please refer Award Rule Type. - -### Business Rules - -* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. - 2. Click on Add button ([Image Removed]) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". - 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Step 1: General information** | | | | -| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | -| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | -| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | -| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | -| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | -| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | -| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | -| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | -| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code\_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | -| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | -| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | -| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | -| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | -| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction\_Code" table. Refer "OLS Transaction Code" API under Campaign Management | -| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | -| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | -| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | -| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | - -### Post-Conditions - -To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Transaction Rule Analysis (HAVE TO BE ADDED) - -### Requirement Definition - -### Process Flow - -### Trigger - -### Pre-Conditions - -### Wireframe - -### Business Rules - -### Post-Conditions - -### Exception Flow - -## Campaign Insight - -### Requirement Definition - -* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. - -### Process Flow - -### Trigger - -N/A - -### Pre-Conditions - -1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. - -### Wireframe - -[Image Removed] - -[Image Removed] - -### Business Rules - -1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. -2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. -3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. -4. OLS support following chart: - -#### Top 10 Best customer of the campaign - -* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. - 2. Dashboard description - -| | | | -| --- | --- | --- | -| **Index** | **Field** | **Description** | -| **Filter key** | | | -| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | -| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | -| **Layout:** [Image Removed] | | | -| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | -| | View all | Use scroll bar to view full list top 10 best customer. | -| **Data source** | | | -| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | - -#### Number of enrrolled customers not - eligible because of criteria - -This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. - -Dashboard descriptions - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | | **Descriptions** | -| **I: Layout 1** [Image Removed] | | | | -| **Filter key** | | | | -| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | -| | Period | | Last 12 months | -| **Layout description** | | | | -| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | -| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | -| **Data source** | | | | -| | Get data from OLS\_ORPHAN\_TXN\_NO\_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS\_ORPHAN\_TXN\_NO\_HIT table to determine period. | | | -| **II : Layout 2** [Image Removed] | | | | -| **Filter** | | | | -| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | -| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | -| **Layout description** | | | | -| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | -| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | -| **Data source** | | | | -| | Get data from OLS\_ORPHAN\_TXN\_NO\_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last\_update\_date of OLS\_ORPHAN\_TXN\_NO\_HIT table to determine period. | | | - -#### Number of enrolled customers eligibe vs not- eligible because of criteria - -This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. - -1. Dashboard descriptions - -| | | | -| --- | --- | --- | -| **Index** | **Field** | **Descriptions** | -| **Filter** | | | -| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | -| | Period | Last 12 months | -| **Layout:** [Image Removed] | | | -| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | -| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | -| **Data source** | | | -| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS\_ORPHAN\_TXN\_NO\_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | - -#### Earned points Vs redemmed points - -* + 1. This chart used to compare total earned point with total redeemed point during each selected period. - 2. Dashboard description - -| | | | -| --- | --- | --- | -| **Index** | **Field** | **Description** | -| **Filter** | | | -| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | -| **Layout** [Image Removed] [Image Removed] | | | -| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | -| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | -| **Data source** | | | -| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | - -#### Redemptions point on each channel - -* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. - 2. Dashboard descriptions - -| | | | -| --- | --- | --- | -| **Index** | **Field** | **Description** | -| **Filter** | | | -| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | -| **Layout** [Image Removed] | | | -| | Icon [Image Removed] | Icon for each channel: Item redemption Automation redemption Pay with Points. | -| | Total redemmed points and rate [Image Removed] | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | -| **Data source** | | | -| | Get data from CAT\_CATALOGUE\_TRANS\_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | - -#### Redemption on each item type - -* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. - 2. Dashboard descriptions - -| | | | -| --- | --- | --- | -| **Index** | **Filed** | **Description** | -| **Filter** | | | -| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | -| **Layout** [Image Removed] | | | -| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | -| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | -| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | -| **Data source** | | | -| | Get data from CAT\_CATALOGUE\_TRANS\_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | - -#### Customer’s activities - -* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. - 2. **Dashboard descriptions** - -| | | | -| --- | --- | --- | -| **Index** | **Field** | **Description** | -| **Filter** | | | -| | Month | Last 12 months | -| **Layout** [Image Removed] | | | -| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | -| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | -| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | -| **Data source** | | | -| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last\_update\_date in OLS system to determine period. | | - -#### Campagin statistic - -* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. - 2. Dashboard descriptions - -| | | | -| --- | --- | --- | -| **Index** | **Filed** | **Description** | -| **Filter: Just use for detail listing only** | | | -| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | -| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | -| **Layout** [Image Removed] | | | -| | Campagin statistic [Image Removed] | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | -| | Detail listing [Image Removed] | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | -| **Data source** | | | -| | Get data from TRANSACTIONs table for number of customers/ total spending and awarded points Get data from CAMPAIGN table for target value. Use transaciton date to determine period. | | - -### Post-Conditions - -* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. - -### Exception Flow - -N/A - -## One tester (HAVE TO BE ADDED) - -### Requirement Definition - -### Process Flow - -### Trigger - -### Pre-Conditions - -### Wireframe - -### Business Rules - -### Post-Conditions - -### Exception Flow - +## Reward Campaign Management + +### Highlights + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. +3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: + +Customer + +Account # 1 + +Account # 2 + +Account # 3 + +Smart$ + +Cash Rebates + +UNIRM + +Product Holdings + +Reward Pools PoolsBalances + +Account # 4 + +* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type + +Loyalty Account Acct + +Figure 9 – Customer View + +1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. + 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. + 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. +2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. +3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. +4. A single transaction can trigger multiple concurrent award programs. +5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. +7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. +8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. + 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: + 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) + 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. + 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically + 5. Instant discounts (specific to SKU codes i.e. purchased item codes). +9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. +10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). +11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. +12. Practically unlimited number of reward campaign rules can be run concurrently. +13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: + 1. Demographic attributes: Age group, Gender, etc. + 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week + 3. Location of transaction + 4. Instant transaction amount + 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) + 6. Transaction count (number of transactions in a period + 7. Average balance over a specified period, period-end balance over a specified period + 8. Card type (product account type) + 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) + 10. User-defined attributes associated with customer and / or product accounts, etc. +14. Rewards can be tracked at + 1. Customer level: single reward balance for customer + 2. Product level: rewards tracked as a separate balance per Product Account. +15. Customer can redeem their incentives and rewards through any of the following: + +| | | +| --- | --- | +| * 1. EDC terminals at partner outlets | * 1. Call center | +| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | + +### Structure of a Campaign (HAVE TO BE ADJUSTED) + +#### Types of Campaign Mechanics + +1. Reward campaigns can be broadly divided into two types or models: + 1. Those that award on every transaction (“Award on Every Transaction”) and + 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward +2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. + +#### Award on Every Transaction + +1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: + 1. The reward is determined at the time the transaction is processed in BLP. + 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: + +![](data:image/png;base64...) + +Figure 10 – Process Flow for Award Per Transaction + +1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules + 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. + 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems +2. Campaign Rules are set up as described in the rest of this section 4. +3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. + +#### Accumulate Then Award + +1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. + 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. + 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P + 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters + 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. + 3. The structure and mechanism of how Counters work are described in section 4.2.6. + 3. The Campaign structure of such a Campaign is broadly outlined in the following: + +![](data:image/png;base64...) + +Figure 11 – Structure of “Accumulate Then Award” Campaigns. + +1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules +2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. + +#### Auto-redemption Campaigns + +1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. + +#### Reward Pool Structure & Bucket Deduction Sequence + +1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. +2. Pools belong to “Loyalty Accounts” or LAs. +3. One LA is created per Customer (per unique CIF Number). +4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. +7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): + +| | | | | +| --- | --- | --- | --- | +| UNIRM Pool | Account Type | Expiry Date | Balance | +| A | 31-Mar-2015 | 100 | +| B | 31-Mar-2015 | 50 | +| A | 30-Jun-2015 | 110 | +| B | 30-Jun-2015 | 510 | +| A | 31-Sep-2015 | 140 | +| C | No Expiry | 215 | +| TOTAL BALANCE | | 1,125 | + +1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. +2. When customer redeems: + 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. + 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. +3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. + +#### Counters – Structure and Mechanics + +1. A Counter is a conceptual entity that tracks a quantity over a defined period of time +2. For example, a Counter may track: + 1. Customer’s total spend per month + 1. Use Case example: to award customers who spend more than 1,000 a month + 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. + 2. The total points earned by an Account in the entire Campaign + 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign ![](data:image/png;base64...) + 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. + 3. The number transactions awarded at individual merchants (Store Ids) per month + 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign + 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. +3. The key data entities making up Counter are defined in the following table: + +| | | | | | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | **Data Entity** | | **Description** | | | | | | | | | | | +| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | +| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | +| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | +| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | +| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | +| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | +| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | +| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | +| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | +| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | +| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | +| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | +| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | +| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | +| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | +| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | +| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | +| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | +| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | +| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | +| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | +| | | | DY | | SD = FSD | | | | | | | | | +| | | | MN | | SD = Start of Month of FSD | | | | | | | | | +| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | +| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | +| | Reset Value | 9(16,2) | | | | | | | | | | | | +| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | + +### About Loyalty Marketing Campaigns (HAVE TO BE ADDED) + +### External Transaction Code + +#### Requirement Definition + +* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. + 2. The External System TC is the first key is located OLS TC for processing the transaction. + 3. The TC values will be agreed with users at the time of setting up the system. + 4. Each External Transaction Code must have an OLS Transaction Code associated with it. + +For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. New transaction code coming from external system then user have to define new external TC in OLS. + 2. Some description should be adjusted then user have to modify. + 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. + +#### Pre-Condition + +* 1. Users have to have the access right on this screen in order to accesss this screen. + 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Detail view + 2. Detail view + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | +| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | + +1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/Edited. + +#### Post-condition + +1. User able to proceed to OLS Transaction Code screen. See in section 4.5 + +#### Exception flow + +1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. + +### OLS Transaction Code + +#### Requirement Definition + +1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. +2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. +3. For example: + 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New transaction code coming from external system then the user has to define new OLS TC also. +2. New OLS transaction coming from internal transaction. +3. Some detailed information should be adjusted then the user has to modify it. +4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. +3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Summary listing page + +![](data:image/png;base64...) + +Figure 2 – Filer and quick search + +1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status ( History) + +![](data:image/png;base64...) + +1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | +| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | +| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | +| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | + +1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/edited. + +#### Post-condition + +1. User able to proceed to Campaign Rule Set-up. See section>>>>> + +#### Exception flow + +1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. + +### Pool Definition + +#### Requirement Definition + +1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. +2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. +3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. +4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. +5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). +6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Reward pool is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to view/update or approve these records. +2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). +3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). +4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1- Empty page + +![](data:image/png;base64...) + +Figure 2- Listing page + +![](data:image/png;base64...) + +Figure 3- Filter + +1. Detail view + 1. Pool detail + +![](data:image/png;base64...) + +* 1. Record history + +![](data:image/png;base64...) + +* 1. Pending record + +![](data:image/png;base64...) + +1. Create/Edit form + 1. General information + +![](data:image/png;base64...) + +* 1. Product Specific Expiry + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Velocity Control + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| Seq | Field (EN /VN) | Description | | Type | +| --- | --- | --- | --- | --- | +| **Statistic information** | | | | | +| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | +| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | +| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | +| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| **Step 1: General information** | | | | | +| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | +| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | +| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | +| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | +| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool_Conversion_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | +| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | +| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | +| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account_Type_Group table). Refer “Account Type Group” API under “Campaign Management” | +| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | +| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | +| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product_Account_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | +| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product_Account_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | +| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | +| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | +| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | +| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | +| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | +| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | +| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | +| **Effected Campaign Rule listing linked this reward pool** ![](data:image/png;base64...) | | | | | +| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN_TC_LINKAGE table | +| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | +| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | + +1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each reward pools to be added/edited. + +#### Post-condition + +1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. +2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. +3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. +4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). + +#### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Pool Conversion Rate + +#### Requirement Definition + +1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. +2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. +2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +1. Detail view + 1. Detai view + +![](data:image/png;base64...) + +Figure 1 - Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +* 1. Record status + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +1. Create/Edit form + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2 – Currency Rate + +#### Business Rules + +1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. +3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 +4. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. +5. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | +| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | +| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | +| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | +| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | +| | Effective End Date\*/ Ngày kết thúc | + +#### Post-condition + +* 1. User able to proceed Pool Definition setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Definition + +#### Requirement Definition + +* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. +* The Counters can then be referenced in Campaign Rules are criteria. +* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. +* A Counter is structured + + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. + + The cut-over from one period to the next can be: + - 1. Automatic based on the Transaction Date or the Batch Date, or + 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” +* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. + + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. + + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” + + A new “current” bucket is automatically created by subsequent updates. +* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 + + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules + + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month + + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. + +#### Process flow + +![](data:image/png;base64...) + +#### Trigger + +* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. +* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 +* For example: + + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter + + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter + + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter + +#### Pre-Condition + +N/A + +#### Wireframe + +* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition_Grid.png](data:image/png;base64...) + +* Use the search filter to locate the counter required: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition- filter.png](data:image/png;base64...) + +* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition.png](data:image/png;base64...) + +* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail.png](data:image/png;base64...) + +* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail2.png](data:image/png;base64...) + +#### Business Rules + +The key data entities making up Counter are defined in the following table: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | +| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | +| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | +| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | +| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | +| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | +| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | +| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | +| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | +| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | +| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | +| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | +| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | +| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | +| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | +| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | +| **Validation:** - If the Counter Id already exists counter value (counter_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter_stock table. | | | | + +#### Post-condition + +* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: + +[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) + +1. Late counter transaction posting + +**When late transaction is comming:** + +If "Late Transaction Posting Option" = "Update Late Value" + +& State! = C then update + +Else if "Late Transaction Posting Option" = "Update Current Bucket" + +& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. + +**Scenario: ![](data:image/x-emf;base64...)** + +#### Exception flow + +### Transaction Category + +#### Requirement Definition + +* 1. Transaction Category help business can define each processed transaction under pre-defined category. + 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. + 3. **Business case:** + +3.1 Enrollment Program + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | +| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | +| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | +| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | +| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | + +If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. + +Therefore If the 4 conditions are are captured as transaction category then we have: + +TxCat1 = Dining txns, local currency + DCC + +TxCat2 = Entertainment txns, local currency + DCC + +TxCat3 = Dining txns, foreign currency + not DCC + +TxCat4 = Entertainment txns, foreign currency + DCC + +To archive this campaign, when define the transaction category we just need: + +* One counter under Account-TxnCat couter level +* One CEP rule to extract counter value to trigger award rule to get award points/cash back. +* One Campaing Rule using F6 to fulfilment this requirement. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup + +#### Sktech + +* + - 1. Create/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. +2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same category. +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **General information** | | | | +| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | +| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | +| | Description/Mô tả | Description for refer only | X(100) | +| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | + +#### Post-condition + +* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. + +#### Exception flow + +### Account Type Group + +#### Requirement Definition + +* + - 1. An account type is a combination of Product account level and product account type. + 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) + 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. + 4. There is no ATG checking for redemption and negative adjustment. + 5. An ATG Sequence number is assigned to each Account Type in an ATG. + 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New account type is coming then need to be added this account under ATG of reward pools. +2. Some points need to be corrected for existing ATG. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to can view/update or approve these records. +2. Account type which apply for ATG have to be actived on OLS. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Listing page + +![](data:image/png;base64...) + +Figure 2- Filter + +* + - * 1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status (history) + +![](data:image/png;base64...) + +* + - * 1. Create/Update form + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. + 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): + 4. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | +| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | +| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | +| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | +| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | +| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. ![](data:image/png;base64...) | | | | +| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool_Definition table where ATG of the pool is selected ATG. | +| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | +| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign_Rule table by specific pool Id | +| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign_Rule” table by specific Campaign Rule ID~~ | +| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign_Rule” table by specific Campaign Rule ID | + +#### Post-condition + +1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: + 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. + 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). + 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. + 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. + +* Example of an ATSP comprising 2 Account Types + +ATSP Id PA Level PA Type Sequence Number + +| 11 | | 830 550 | | 10 | + +| 11 | | 830 630 | | 20 | + +When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account + +*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. + +*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. + +1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: + +* A = set of all Acct Types of Cust +* B = set of Acct Type in ATG of Pool +* C = Intersection of A and B + +**Therefore**: + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. + +**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. + +1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. + +* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. +* If CIF number is provided only then TP base on following process to find eligible account to process: + +A = set of all Acct Types of Customer + +B = set of Acct Type in ATG of Award Pool + +C = Intersection of A and B + +**Therefore:** + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. + +**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. + +1. ATG is used to validate blocked transaction. +2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Reward Campaign + +#### Requirement Definition + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. +3. A single transaction can trigger multiple concurrent award programs. +4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +5. Type of campaign in OLS: + +* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: + +![](data:image/png;base64...) + +* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: + +![](data:image/png;base64...) + +1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. + +#### Wireframe + +Refer wireframe on figma. + +#### Business rules + +* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) + +1. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) +2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Create/Edit mode** | | | | +| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | +| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | +| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | +| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | +| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | +| | **Campaign Target** | | | +| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | +| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | +| **View mode: Display all field of create mode and add following fields:** | | | | +| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | +| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | +| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | + +#### Post-condition + +#### Exception flow + +### Reward Campaign Rule + +#### Requirement Definition + +* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. + 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. + 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. + 4. In this version we support following Campaign Rule type: +* Award +* Redeem +* Adjust +* Item Redemption +* Counter Extract and Process +* Redeem Extract and Process +* Transaction Extract and Process + 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust + +#### Process flow + +#### Trigger + +#### Pre-condition + +* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. + +#### Wirefame + +Refer to Figma. + +#### Business rule + +* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe + 3. Campaign Rule Screen can be display as a submodule of Campaing module as well + 4. **Screen description for Edit/Create mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Choose rule type to configurate campaign Rule** | | | | +| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool_Definition" table. Refer "Pool Definition" API under Campaign Management. | +| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | +| **Step 4: Formula setting** | | | | +| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | +| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code_Management" table where code type is "amt-to-use-formula" | +| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | +| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | +| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | +| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | +| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | +| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | +| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | +| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | +| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | +| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | +| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | + +#### Post-condition + +Amount to use feature with Transaction Processing. + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Exception flow + +### Campaign Rule Criteria + +#### Requirement Definition + +1. Rule criteria are divided into 5 categories for ease of maintenance: + +| | | | +| --- | --- | --- | +| Customer | Account | Transaction | +| Atttribute | Counter | Merchant | + +1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Exsiting Campaign require at least one campagin rule validate criterions. + +#### Pre-Condition + +1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== + +![](data:image/png;base64...) + +1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. + +#### Wireframe + +![](data:image/png;base64...) + +Figure 1 - Query builder + +![](data:image/png;base64...) + +Figure 1 – Rule criteria + +![](data:image/png;base64...) + +Figure 2- Drag criteria into Rule + +![](data:image/png;base64...) + +Figure 3 – Rule criteria screen after complete setup + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). +2. OLS system will use Query Builder to build query for Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same campaign rule. +4. **Screen description:** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | ![](data:image/png;base64...) | Click to add new criteria | Button | +| | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. ![](data:image/png;base64...) | Action | +| | ![](data:image/png;base64...) | Click to delete criteria | Button | +| | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | +| | Criteria | **Criteria Structure:** **![](data:image/png;base64...)** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | + +1. **Right panel** + +In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. + +Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== + +Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== + +**Some use case for each criteia group:** + +| | | | +| --- | --- | --- | +| **Index** | **Use case** | **Criteria group** | +| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | +| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | +| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | +| | MCC group Store group Chain group Corporation group | Transaction criteria | +| | ATG criteria | Account Criteria | +| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | + +1. **Query builder structure** + +*For example:* + +*+ Account type criteria has data type as string and filter value is account type list from PRODUCT_ACCOUNT_TABLE.* + +*+ Transaction description criteia has data type as string but filter value is enterted by user.* + +*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | +| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: ![](data:image/png;base64...) | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | +| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. ![](data:image/png;base64...) | +| | Is empty ( NULL) | This condition checks whether the comparison value is empty. ![](data:image/png;base64...) | MUST not display filter value field and input type | +| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. ![](data:image/png;base64...) | +| | Contains | This condition checks whether the comparison value contains the filter value. ![](data:image/png;base64...) | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example ![](data:image/png;base64...) | +| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. ![](data:image/png;base64...) | +| | Is in | This condition checks whether the comparison value is in one of the filter value. ![](data:image/png;base64...) | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example ![](data:image/png;base64...) 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | +| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. ![](data:image/png;base64...) | +| | Begins with | This conditon checks whether the comparison text begins with the filter value. ![](data:image/png;base64...) | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example ![](data:image/png;base64...) Should not be case sensitive | +| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. ![](data:image/png;base64...) | +| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. ![](data:image/png;base64...) | +| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. ![](data:image/png;base64...) | +| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. ![](data:image/png;base64...) | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. ![](data:image/png;base64...) | +| | Is less than (<) | This condition checks Comparison value is less than filter value. ![](data:image/png;base64...) | +| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. ![](data:image/png;base64...) | +| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. ![](data:image/png;base64...) | +| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. ![](data:image/png;base64...) | +| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) ![](data:image/png;base64...) | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* ![](data:image/png;base64...) *For example 2: Customer’s birthday from Jul 01 to Jul 15* ![](data:image/png;base64...) | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | +| | Is fixed date | This condition checks whether the comparison value is equal to filter value ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | +| | Is null | The comparison value must be null value | There is no filter value | +| | Is not null | The comparison value must be null value | +| | Is betweenperiod from N (min to max value). | ![](data:image/png;base64...) **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* ![](data:image/png;base64...) ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) ![](data:image/png;base64...) ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** ![](data:image/png;base64...) | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | +| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | +| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | +| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | + +#### Post-condition + +* 1. User able to proceed next step to complete campagin rule setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Campaign Rule Formula + +#### Requirement Definition + +1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. +2. Sometimes we was using campaing formula to update the counter value or attribute value as well. +3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +See more detail in attached file + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Post-condition + +#### Exception flow + +### Campaign Rule – Contributor Settings + +#### Requirement Definition + +1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. +2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Campaign require a list of Contributors configured for the Rule. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. +2. The merchant as a “contributor” of the award transaction should availble on OLS system. + +#### Wireframe + +* + 1. Contributor setting + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. + +1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Type** | +| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | +| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | +| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | +| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | +| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | +| | ![](data:image/png;base64...) | Clicking Click on the “![](data:image/png;base64...)” icon removes the Contributor row | Button | + +1. The total contribution must be 100%. +2. Contributor must be uinique on each campaign rule. +3. If contributors are configured then must have one and only one contributor is “absord remider”. +4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) + +#### Post-condition + +* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Extract & Process (CEP) Request + +#### Requirement Definition + +* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. +2. All drop-down value must avaiable in the system. + +#### Wireframe + +Please refer figma to get more detail. + +#### Business rules + +* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | +| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter_Definition" table. Refer "Counter Definition" API under Campaign Management | +| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | +| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | +| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | +| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | +| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | +| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | +| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: + 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== + 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== + 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== + +| | | | | +| --- | --- | --- | --- | +| | **Counter Bucket To Extract** | | | +| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | +| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | +| * Monthly on Day N of Month | +| * Statement Cycle Date | +| * N Days after AOD | +| * Annually, on Day N of Month M | + +* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run + 2. Counter state is update when CEP extract based on Counter definition setup : + + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. + + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. + + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. + +#### Exception flow + +N/A + +### Redemption Extract & Process (REP) Rule + +#### Requirement Definition + +1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. +2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. +3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. + +#### Process flow + +#### Trigger + +* + - 1. The campaigns require the system automation extract the pool balances. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +* + - 1. Please help to refer on the figma. + +#### Business rules + +* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool_Definition” table. Refer “Pool Definition”API under Campaign Management | +| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | +| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | +| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction_Code”table Refer “OLS Transaction Code” API under Campaign Management | +| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | +| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | +| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually/Hàng năm | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | +| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +REP batch job extract balance based on REP rule type configure. + +=tbd== + +#### Exception flow + +### Item Redemtion Rule Type (ITRD) + +#### Requirement Definition + +Item redemption Rule Type is used to to evaluate item redemption transactions. + +The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. + +Redemption pool which be used to redeem wil be configured in item price instead. + +#### Process flow + +Update later + +#### Trigger + +If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +Please refer Award Rule Type. + +#### Business rules + +* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". + 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | + +#### Post-condition + +To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Transaction Rule Analysis (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +### Campaign Insight + +#### Requirement Definition + +* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. + +#### Process flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. +2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. +3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. +4. OLS support following chart: + +##### Top 10 Best customer of the campaign + +* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter key** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | +| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | +| **Layout:** ![](data:image/png;base64...) | | | +| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | +| | View all | Use scroll bar to view full list top 10 best customer. | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | + +##### Number of enrrolled customers not - eligible because of criteria + +This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. + +Dashboard descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | +| **I: Layout 1** ![](data:image/png;base64...) | | | | +| **Filter key** | | | | +| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | +| | Period | | Last 12 months | +| **Layout description** | | | | +| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | +| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | +| **II : Layout 2** ![](data:image/png;base64...) | | | | +| **Filter** | | | | +| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | +| **Layout description** | | | | +| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | +| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last_update_date of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | + +##### Number of enrolled customers eligibe vs not- eligible because of criteria + +This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. + +1. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Descriptions** | +| **Filter** | | | +| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | +| | Period | Last 12 months | +| **Layout:** ![](data:image/png;base64...) | | | +| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | +| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | +| **Data source** | | | +| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS_ORPHAN_TXN_NO_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | + +##### Earned points Vs redemmed points + +* + 1. This chart used to compare total earned point with total redeemed point during each selected period. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | +| **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | +| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | +| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | + +##### Redemptions point on each channel + +* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Icon ![](data:image/png;base64...) | Icon for each channel: Item redemption Automation redemption Pay with Points. | +| | Total redemmed points and rate ![](data:image/png;base64...) | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | + +##### Redemption on each item type + +* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | +| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | +| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | + +##### Customer’s activities + +* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. + 2. **Dashboard descriptions** + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Month | Last 12 months | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | +| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | +| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | +| **Data source** | | | +| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last_update_date in OLS system to determine period. | | + +##### Campagin statistic + +* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter: Just use for detail listing only** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | +| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Campagin statistic ![](data:image/png;base64...) | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | +| | Detail listing ![](data:image/png;base64...) | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | +| **Data source** | | | +| | Get data from TRANSACTIONs table for number of customers/ total spending and awarded points Get data from CAMPAIGN table for target value. Use transaciton date to determine period. | | + +#### Post-condition + +* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. + +#### Exception flow + +N/A + +### One tester (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + diff --git a/docs/staging/structured/campaign/formula.md b/docs/staging/structured/campaign/formula.md new file mode 100644 index 0000000..ac3eb34 --- /dev/null +++ b/docs/staging/structured/campaign/formula.md @@ -0,0 +1,123 @@ +--- +title: "Formula" +source: "docs/Formula.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula + +## Formula 1 + +**Enter # of Pool Units (N)**] is the number of pool units to add to Result for every D units of Amount in the **[Enter Block Size (D)]** input field. E.g. if N = 5, D=50: + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Amount** | $60 | $65 | $119 | $160 | $210 | +| **Result =** | 5 | 5 | 10 | 15 | 20 | + +**Result = [Round Down to Integer for (Transaction Amount / D)] \* N** + +Then apply precision and rounding type handling to the formula 1 result. + +**Finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +**Example 1:** + +Txn Amt = 52.87, N=1, D =1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 1)] \* 1 = [Round Down to Integer for (52.87)] \*1 = 52\* 1 = 52 + +Then apply precision and rounding type handling to the formula 1 result = 52 + +**Example 2:** + +Txn Amt = 52.87, N=0.1, D =0.1, pool precision = 0, rounding type = Nearest + +Formula 1 result = [Round Down to Integer for (52.87 / 0.1)] \* 0.1 = [Round Down to Integer for (528.7)] \* 0.1 = 528 \* 0.1 = 52.8 + +Then apply precision and rounding type handling to the formula 1 result = 53. + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 2 + + +“N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. + +## ~~Formula 3~~ + +~~~~ + +~~The Result is multiplied by “M” if transaction date matches the selected Event Date(s). Event Date(s) is a multi-select field.~~ + +## Formula 4 + + +Selects one of two calculation algorithms as the Award Basis: + +A. “Highest Tier in Which Amount Falls” + +B. “Each Tier, applied to the part of Amount that Falls within that Tier” + +- If Award Basis “A” is selected, and AF is a Percentage, then the AF in the highest Tier in which Amount falls is applied to the whole Amount, i.e. Result = AF x Amount, where AF is the AF of the highest Tier where Amount is greater than the lower bound but less than the upper bound). + +- If “B” is selected, and if AF is a Percentage, then the AF for each Tier is applied to the part of Amount that falls within that Tier (AF x amount in Tier = D), and Result is the sum of D from all the applicable Tiers. + +- If “A” is selected and AF is “Pool Units”, then the number of Pool Units awarded is AF as specified in the highest Tier in which Amount falls is applied to the whole Amount. + +- If “B” is selected, and AF is “Pool Units”, then AF Pool Units are awarded for each Tier whose upper bound is less than Amount, i.e. Result = Sum AF of all Tiers with upper bound less than Amount. + + +**The finally result = Award points by Before Cap amount + Award points by after cap amount (if After Cap is available)** + +## Formula 5 + + +1. Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with: + +- Amount (spend counter) + +- Formula Result (points counter) or + +- Incremented by one (frequency counter), depending on the counter method selected in Counter Definition. + +-The first input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. + +Conclude: If transaction hit F5 then Counter value is updated: + +Normal transaction: New counter value = Counter value + (F5 result \* multiplier), except multiplier is 0 + +Reversal transaction: new counter value = Counter value - (F5 result \* multiplier), except multiplier is 0 + +2. For point counter and point amount counter then: + +Just update point counter/point counter value with the point /point amount form that Rule only. If there is no point but have F5 to update point counter then throw message to reject transaction. + +## Formula 6 + + +Formula 6 is for computation on a tiered basis, similar to Formula 4, but Formula 6 is different in that the tier is determined not by the Amount (as is the case in Formula 4), but instead it is by the value of a separately selected Counter. + +“Decide Tier based in value in” is a drop-down to select all of 3 counter buckets: Current bucket/ Previous bucket/ before last bucket of each counter (in the next phase should support N bucket with N is configurable value by user). Based on “Effective Period Is Based On” of rule to determine counter value of Selected counter bucket. + + +## Formula 9 + +Update counter state + + +1. “Counter” is drop-down list to select the counter to update counter state if transaction trigger CP rule. +2. “Select state” is drop-down list to select the state to be updated. + +There is 2 options to select “Next state” or “Previous State”. Depended in reversal indicator of transaction to process as following: + +* Next State non reversal --> look for oldest C and update to A +* Next State reversal --> look for newest A and update to C +* Previous State non-reversal --> look for newest A and update to C +* Previous State reversal --> oldest C and update to A + + +## Formula 8 + +Update attribute value conditionally =tbd= \ No newline at end of file diff --git a/docs/staging/structured/campaign/formula_validation.md b/docs/staging/structured/campaign/formula_validation.md new file mode 100644 index 0000000..7b74e58 --- /dev/null +++ b/docs/staging/structured/campaign/formula_validation.md @@ -0,0 +1,50 @@ +--- +title: "Formula Validation" +source: "docs/Formula validation.docx" +type: "documentation" +extracted_by: "markitdown" +--- + +# Formula Validation + +| | | | +| --- | --- | --- | +| **Field** | **Description** | **Data type** | +| Right panel | List all active formula on the system. In the right panel, the list to selects a Formula to use. Each formula derives a Result which is used as the award quantity or the redemption quantity, depending on the Rule Type selected in the Rule Header. The supported formulae for deriving Result are:  Formula 1 – Add “P” to Result for every D of Amount  Formula 2 – Result = “P” (a fixed amount)  Formula 4 – Derive Result based on Amount Tier and a parameter “P”  Formula 5 – Update selected Counter  Formula 6 – Derive Result based on Counter Tier and a parameter “P”  Formula 7 – Derive Result based on Rate table  Formula 8 – Update Attributes  Formula 9 – Update State of selected Counter | View only | +| Drag/Drop formula | Allow user drag/drop the formula from right panel to set up rule. Drag the selected Formula will be added as a panel for the edit and displaying the Formula parameters below the Formula part. A Formula panel can be removed by clicking on the exit icon (X) in the panel header. | Action | +| Formula order | Formula Executing Seq. It defaults to the ascending ordering sequence. User can re-arrange it if needed. For example. If user select F1 and F5 then the default formula order must be F1=> F5 and user can re-arrange into F5=>F1. The formula list is getting from “Code_Management”table where code type is “formula-list”. Refer “Get-by-code-type” API under Master data. | Action | +| **Formula 1: Add [ N ] to Result for Every [ D ] Unit(s) of Transaction Amount, where Transaction Amount is the Gross Transaction Amount or Nett Transaction Amount as selected in Amount-To-Use, in Base Currency Units.** **Only one formula 1 allow to configure on each campaign rule** | | | +| **If “Apply After Cap Value” button is on OFF** | | | +| N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical ) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| D | The block size of transaction Amount before cap. If “Apply After Cap Value” button is on OFF mode then this field is required. | | +| **If “Apply After Cap Value” button is on ON** | | | +| Before Amount Cap N | N value which apply for before cap This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then the field name should be “Before Amount Cap N” otherwise just “N”. This is the number of pool units to add to Result for every D units of Amount in the “Block size” D. | 9(14,2) Allow positive value only | +| D | The block size of transaction Amount before cap. | 9(14,2) Allow positive value only | +| After Amount Cap N | N result apply for after Cap value This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| D | The block size of transaction amount after cap. This is condition field. If “Apply After Cap Value” button is ON mode (apply after cap value logical) then this field is active. | 9(14,2) Allow positive value only | +| **Formula 2: Add [ N ] to Result** **Only one formula 2 allow to configure on each campaign rule** | | | +| N\* | “N” is the number of Pool Units to add to “Result” for every transaction meeting criteria in this Rule. | 9(14,2) | +| **Formula 4: Tiered Calculation. Select Factor from row where Transaction Amount A is between [Start]-[End] in that row. If Percent is chosen in the corresponding drop-down box, then add (Factor XA) to Result. If Points is selected, then add Factor to Result** | | | +| Factor Type is \*/Loại hệ số | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Factor per Block or Full Amount\*/Hệ số theo mỗi khối hay trên toàn bộ giá trị | Selects one of two calculation algorithms as the Award Basis: A. “Highest Tier in Which Amount Falls” B. “Each Tier, applied to the part of Amount that Falls within that Tier | Drop-down Select one Lookup value from “Code_Management” table where code type is “f4-factor-option”. Refer “get-by-code-type” API under master data | +| Add tier | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. 1. If “Apply After Cap Value” button is on OFF mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Should be greater than or equal 0. For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number specifying AF. | 9(14,2) Positive value only | 1. If “Apply After Cap Value” button is on ON mode. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | **Before Cap** | | | | Before Cap | The label is only active when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | **After cap: This row is active on each tier when Apply after cap only** | | | | After cap | The label is only active only when on Apply after cap mode. | Label Display | | Is between | This is a number field specifying the lower bound (exclusive) of the Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And | The second input field is a number field specifying the upper bound (inclusive) – e.g. “>0” and “<=100” are the lower bound (exclusive) the upper bound (inclusive) of the first Tier respectively. | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor | The third input field is a number specifying AF. | 9(14,2) Positive value only | | Button | +| **Formula 5** | | | +| Multiplier\*/Hệ số nhân | Input field accepts a number by which to multiply the amount to be added to Counter. If Multiplier is 0, the Counter value is set to 0. | 9(14,2) ~~Should be greater than or equal 0~~ | +| Counter ID \*/Bộ đếm | The input field is a drop-down for selecting the Counter to update. Note that Counters are updated with an implicit value from the transaction context, depending on the Counter Definition – i.e. the Counter is updated with * Amount (spend counter) * Formula Result (points counter) or * Incremented by one (frequency counter), depend on the counter method selected in Counter Definition. **Each counter is assigned to only one F5 per each campaign rule.** | Drop-down Select one Refer “Counter Definition” API under Campaign management | +| Add counter | After the fields in this row have been filled in, the “+ Add counter” icon is active, and when it is clicked will add the details from the input fields in the display area as a new row. | Button | +| **Formula 6** | | | +| Factor Type is \*/ Loại hệ số là | This specifies whether “Award Factor” (AF) is a Percentage or a quantity of “Pool Units”. Drop-down selects “Award Factor” or “Pool Units”. | Drop-down Select one Lookup value from “Code_Management” table where code type is “factor-type” Refer “get-by-code-type” API under master data | +| Decide Tier based on value in\*/ | The input box is a drop-down for selection of a Counter to be used for determining the AF to use in deriving Result. This drop-down allow to select all of 3 counter buckets: Current bucket/ Previous bucket/ Before last bucket of each counter. E.g : Current -Counter Name [Counter ID] Previous – Counter Name [Counter ID] Before last – Counter Name [Counter ID] | Drop-down Select one Lookup value from “Counter_Definition” table Refer “get-by-code-type” API under master data | +| Add Tier /Thêm | Edit row for specifying formula parameters for a Tier, i.e. the range of values in a Tier and the corresponding AF value. * Click to add button to add new tier. Up to 10 tiers can be defined. When the “+” icon is clicked, the parameters in the edit row are added to the display area below the edit as a row, as following illustrated : Each record includes: | | | | | --- | --- | --- | | **Field** | **Descriptions** | **Data type** | | Is between \* | The first input field is a number field to enter the lower bound of a Tier. | 9(14,2) Positive value only For first tier it is entered by user For next tier it should be automation updated as “AND” value of previous tier plus 0.01 and don’t allow user edit this one. | | And \* | The second input field is a number fields to enter the upper bound of a Tier | 9(14,2) Positive value only “and” must be greater than “is between” value. | | Factor\* | The third input field is a number field specifying the value of AF, which is either the number of Pool Units to award or the percentage of Amount to award in Pool Units | 9(14,2) Positive value only | | Button | +| **Formula 9** **Allow Only one formula 9 per each campaign rule** | | | +| Counter Id\*/ Bộ đếm | The “Counter” drop-down field lists all valid Counters as defined in Counter Definition. | Drop-down Select one Lookup value from “Counter_Definition” table. Refer “Campaign Counter Definition” API under Campaign management. | +| Select State \*/Chọn trạng thái | The “Next State” drop-down provides the following choices: “Next State” , which will update the State as follows: If the State before update is “C”, the State will be updated to “A” If the State before update is “A”, the State will be updated to “O” If the State before update is “O”, no action is taken (Counter State is not changed) | Drop-down Select one Lookup value from “Code_Management” table where code type is “f9-counter-sate”. Refer “get-by-code-type” API under master data. | +| **Formula 8: Please consider and advise to change UI/UX for this** **Following items are explained for existing version** | | | +| Attribute group/Nhóm thuộc tính | Group of attribute | Drop- down Select one | +| Attribute ID\*/ Thuôc tính | Attribute ID to update attribute value/expire date If Attribute group is selected then just list all attribute of selected atrribute group If attribute group is not selected then list all active attribute on the system. | Drop-down Select one Lookup value “Attribute_Definition” table. Refer “Attribute Definition” API under Code Maintenance | +| Condition | After an Attribute has been selected, depending on the data type of the Attribute, condition appear to allow input of the conditional arguments as illustrated in the following figures Bellow image shows the a Date Attribute has been selected in the selection row : Bellow image shows a boolean attribtue has been selected in the seclection row: Bellow image show a character attribute has been selected in the selection row Bellow image show a character attribute has been selected in the selection row | | +| Set \* | Attribute ID need to be updated attribute value | Drop-down Select one Lookup value from “Attribute_Definition” table. Refer “Atrribute Defintion” API under code maitenance | +| Set to value | Value is depened on selected "Data type": * if "Boolean" data type is selected then swith button true/false is actived for default value field. Default False. * If "Character" datatype is selected then a textbox is actived for default value. * If " Date" datatype is selected hen a Date field is actived for default value field. * If "Number" datatype is selected then a Numberic filed (double data type) is actived for default value fied. | | +| Expiring | 2 choices for user: 1) User can enter a fixed date (1st input field) (Expiring ) or 2) user can enter N followed by the drop-down choice of "End of Month" or "End of Quarter" (Set Expiry Date to). if user enters a Fixed Date, we update the Expiry Date = value (Fixed Date) entered if user select period we update the expire date into selected period 1. Admin screen allows only choice of FIXED DATE or N [Period Unit]. If Expiring is provided then “Set Expire Date to “ is inactived and vice versa. 2. If “Set Expire Date To “ is selected and “Period is not No Expire / Post Date “ then “N” field is actived. 3. Have to choose at least one option: Fixed or period type | | +| Set Expire Date to | Drop -down Select one Refer “get-by-code-type” API under master data with code type is “ | +| N | 9(2) | \ No newline at end of file diff --git a/docs/staging/structured/campaign/fsd_campaign.md b/docs/staging/structured/campaign/fsd_campaign.md new file mode 100644 index 0000000..4fcfedb --- /dev/null +++ b/docs/staging/structured/campaign/fsd_campaign.md @@ -0,0 +1,1737 @@ +## Reward Campaign Management + +### Highlights + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card they hold and the details of the transactions. +3. In BLP, a single customer view is maintained such that all of a customer’s product holdings and the corresponding loyalty rewards are linked into a single customer view. This is illustrated in the following: + +Customer + +Account # 1 + +Account # 2 + +Account # 3 + +Smart$ + +Cash Rebates + +UNIRM + +Product Holdings + +Reward Pools PoolsBalances + +Account # 4 + +* Reward Balance for each reward type is tracked at customer level in “Pools” – one Pool per reward type – e.g. Smart$ is a reward type, UNIRM is a reward type + +Loyalty Account Acct + +Figure 9 – Customer View + +1. A merchant acquired by payment card acquiring may participate in one or more reward campaigns and contribute at different rates to different reward campaigns. + 1. Transactions from EDC terminals of acquired merchants can earn rewards entitlements in real-time depending on the reward campaigns in force. + 2. In the same transaction, cash rebates and points earned on past transactions can be used to offset the payment amount in real-time, thus reducing amount charged to card, so customer can earn and redeem in the same payment transaction (either in full or in part as “partial redemptions”) and enjoy a smaller amount charged to card. +2. Transactions from not-acquired merchants and from merchants who are acquired but not participating are received from Card System and can be processed for rewards in the form of cash rebates and points in OneLoyalty™ through batch files. +3. Rewards for a single transaction may be from multiple “contributors”, entities who fund the rewards. +4. A single transaction can trigger multiple concurrent award programs. +5. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +6. Many short-term, event-specific Campaign Rules can be set up and operated cost effectively with a short time to market with the flexibility of the rewards management module. +7. Points and e-coupons earning and/or redemption can be integrated into the same POS terminal payment transaction or effected through batch processes based on transaction inputs from external application systems. +8. Reward campaigns can be set up with multi-merchant support, including merchant-specific Campaign Rules, as an incentive for merchants to participate. + 1. Rewards can be in various forms and have flexible point and e-coupon expiry policies: + 2. E-coupons (as cash, discount or gift coupons; e.g. a $5 coupon, a 10% discount coupon, a coupon for free access to events, etc.) + 3. Points redeemed for cash-back as part of payments, or for offsetting service fees, points transfer to external point programs, etc. + 4. Lucky Draw chances for deferred electronic lucky draws that may be conducted periodically + 5. Instant discounts (specific to SKU codes i.e. purchased item codes). +9. Point and e-coupon redemption against electronic catalogue are supported through the Internet, IVR, SMS as well as trough call center agents. +10. Seamless integration between magnetic- and chip-card-based loyalty functions allow transfer of points, coupons & other benefits between card and host (both ways). +11. Rewards and incentives (e.g. cash rebates and points) given to customer can be based on criteria such as types of products used, transactions performed, and the value and frequency of transactions, etc. +12. Practically unlimited number of reward campaign rules can be run concurrently. +13. Campaign Rule Criteria, i.e. the conditions under which to give rewards, can be defined based on customer and transaction data available, such as: + 1. Demographic attributes: Age group, Gender, etc. + 2. Date / time of transaction: specific date/time ranges, time period (happy hour), day of week + 3. Location of transaction + 4. Instant transaction amount + 5. Cumulative transaction amount (by user selectable criteria – e.g. at particular merchants, or for spend in particular merchant categories, etc., or user-specified time periods) + 6. Transaction count (number of transactions in a period + 7. Average balance over a specified period, period-end balance over a specified period + 8. Card type (product account type) + 9. Customer’s product holdings (e.g. customer with product account types 1 and 2 gets this reward, customer without the products receives this message, etc) + 10. User-defined attributes associated with customer and / or product accounts, etc. +14. Rewards can be tracked at + 1. Customer level: single reward balance for customer + 2. Product level: rewards tracked as a separate balance per Product Account. +15. Customer can redeem their incentives and rewards through any of the following: + +| | | +| --- | --- | +| * 1. EDC terminals at partner outlets | * 1. Call center | +| * 1. Website, through electronic catalogue | * 1. Interactive Voice Response System (IVRS). | + +### Structure of a Campaign (HAVE TO BE ADJUSTED) + +#### Types of Campaign Mechanics + +1. Reward campaigns can be broadly divided into two types or models: + 1. Those that award on every transaction (“Award on Every Transaction”) and + 2. Those that award on the basis of the total spend or total number of transactions performed in a given period (“Award on Cumulative Criteria”), i.e. where the total achieved determines the earning rate or reward +2. Designing a Campaign for set-up in BLP is best done if the generic structure for each of these models is understood: these structures are discussed in the next 2 sections. + +#### Award on Every Transaction + +1. In an “Award on Every Transaction” campaign, the process flow is outlined in the following: + 1. The reward is determined at the time the transaction is processed in BLP. + 2. Processing can be in either real-time or in batch mode, and the structure is illustrated in the following: + +![](data:image/png;base64...) + +Figure 10 – Process Flow for Award Per Transaction + +1. Transaction data is received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules + 1. Transaction data may be received in batch mode through the batch transaction interface file (BLPTXN) described in Reference R01. + 2. Transaction data may also be received through online interfaces such as the POS Manager interface to payment terminals and MQ interfaces to front-end systems +2. Campaign Rules are set up as described in the rest of this section 4. +3. Campaign Rules derive the quantity to award and/or redeem from the Reward Pool, the structure of which is described in section 4.2.5. + +#### Accumulate Then Award + +1. In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed over a period P of – e.g. + 1. If the customer spends between $500 and $1,000 in the month in total to earn a 15% bonus, however if customer spends more than $1,000 in the month customer gets a 20% bonus. + 2. In such a campaign, the award formula parameters cannot be determined until the end of the period P + 1. To achieve this, Campaign Rules are set up to accumulate the required transactions into Counters + 2. Separate Campaign Rules are also configured to extract and process the values in the Counters as transactions for the actual award at the end of the accumulation period P. + 3. The structure and mechanism of how Counters work are described in section 4.2.6. + 3. The Campaign structure of such a Campaign is broadly outlined in the following: + +![](data:image/png;base64...) + +Figure 11 – Structure of “Accumulate Then Award” Campaigns. + +1. Again, the transaction data may be received from external sources (e.g. Card System) or can be internally generated in BLP through the CEP (see section 1.1.1) and REP (see section 4.17) modules +2. Campaigns to award on Cumulative basis based on internally derived transaction data are described more fully in section 1.1.1. + +#### Auto-redemption Campaigns + +1. Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Auto-redemption campaigns make use of the “Redeem, Extract and Process” or REP module, described further in section 4.17. + +#### Reward Pool Structure & Bucket Deduction Sequence + +1. Earnings (rewards) are tracked in “Pools”, each Pool for a specific type of reward. +2. Pools belong to “Loyalty Accounts” or LAs. +3. One LA is created per Customer (per unique CIF Number). +4. Pools are associated with the Customer’s Loyalty Account (see section **Error! Reference source not found.** for the data entity relationship), where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. UNIRM Pool, SMT$ Pool, etc +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account, for each Expiry Date. +7. The following illustrates buckets for 3 accounts A, B and C (where each row is a bucket): + +| | | | | +| --- | --- | --- | --- | +| UNIRM Pool | Account Type | Expiry Date | Balance | +| A | 31-Mar-2015 | 100 | +| B | 31-Mar-2015 | 50 | +| A | 30-Jun-2015 | 110 | +| B | 30-Jun-2015 | 510 | +| A | 31-Sep-2015 | 140 | +| C | No Expiry | 215 | +| TOTAL BALANCE | | 1,125 | + +1. Account Type C earns evergreen points, whereas the other account A & B each earn points which expire on the usual 5-quarters from the quarter of earning. +2. When customer redeems: + 1. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 2. If more than one Bucket has the same expiry date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. + 3. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. See section **Error! Reference source not found.**. +3. Note that the display in the administration screen will show the buckets as illustrated in section **Error! Reference source not found.**. + +#### Counters – Structure and Mechanics + +1. A Counter is a conceptual entity that tracks a quantity over a defined period of time +2. For example, a Counter may track: + 1. Customer’s total spend per month + 1. Use Case example: to award customers who spend more than 1,000 a month + 2. This is a Customer-level monthly spend Counter, i.e. the Entity is Customer, and this Counter is used in the Rule Criteria section to filter out eligible transactions. + 2. The total points earned by an Account in the entire Campaign + 1. Use Case example: to give out not more than 1,000,000 points per Account in the Campaign ![](data:image/png;base64...) + 2. This is an Account-level, single-Bucket Point Counter, i.e. the Entity is Account, and this Counter is used in the Formula Header to cap the formula result. + 3. The number transactions awarded at individual merchants (Store Ids) per month + 1. Use Case example: to award only the first 1,500 transactions in the month per merchant (Store id) in the Campaign + 2. This is a Store-level, monthly frequency Counter, i.e. the Entity is Store, and this Counter is used in the Rule Criteria to filter out the first 1,500 transactions. +3. The key data entities making up Counter are defined in the following table: + +| | | | | | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | **Data Entity** | | **Description** | | | | | | | | | | | +| | Counter Id\* | X(10) | Unique identifier for a Counter Definition record | | | | | | | | | | | +| | Name\* | X(30) | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | | | | | | | | | | | +| | Description | X(100) | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose) etc | | | | | | | | | | | +| | Entity\* | X(02) | The Entity level at which a quantity is to be tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * CU – Customer | | | | | * + - * AC – Account | | | * + - * CA – Card | | | +| | | | * + - * ST – Store | | | | | * + - * CH – Chain | | | * + - * CO - Corporation | | | +| | | | * + - * CS – Customer-Store | | | | | * + - * CC – Customer-Chain | | | * + - * SY – System | | | +| | Entity Counted\* | X(02) | The data entity that is to be counted or tracked. Valid values are: | | | | | | | | | | | +| | | | * + - * GA – Gross Amount | | | | | Gross Transaction Amount | | | | | | +| | | | * + - * NA – Nett Amount | | | | | Nett Transaction Amount | | | | | | +| | | | * + - * PT – Points | | | | | Number of points awarded, redeemed or adjusted | | | | | | +| | | | * + - * TX – Transaction | | | | | Number of transactions done | | | | | | +| | | | * + - * QT – Any quantity | | | | | Any numeric quantity indicated by update Formula | | | | | | +| | First Start Date | Date | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item xx, following this table. The FSD must be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), i.e. the Transaction Date of the first transaction to update the Counter. The FSD (= FD or FTD, depending on the Counter Definition set-up) is used to derive the BED as described in the following: | | | | | | | | | | | +| | Period Unit\* | X(02) | PU: units by which to count the time length of a period. Valid values are: | | | | | | | | | | | +| | | | DY | Day | | * BSD = FSD * First BED = BSD + N – 1 days * BED = FSD + N\*(1+round down ((TD – FSD)/N)) * Subsequent BED = N days + previous BED * E.g. if FSD = 10-Jan-20, TD = Txn Date, BED = (TD – FSD)/N * for various values of N are illustrated in the following: | | | | | | | | +| | | | | | | Txn Date | | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | N | TD | | 09-01-20 | 10-01-20 | | 11-01-20 | 31-01-20 | +| | | | | | | 1 | BED | | None | 11-01-20 | | 11-01-20 | | +| | | | | | | 2 | BED | | None | 12-01-20 | | 12-01-20 | | +| | | | | | | 5 | BED | | None | 15-01-20 | | 15-01-20 | | +| | | | QT | Quarter (Q) | | * BSD = 1st day of calendar Q of FSD * First BED = end of N -1 calendar Qs from first Q * Subsequent BED = end of N Qs after previous BED | | | | | | | | +| | | | LT | Days from Last Transaction | | * BSD = First transaction date on or after FSD * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | FD | Fixed Date | | * BSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | WK | Week | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | SA | Semi-annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OD | Days from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OA | AOD Anniversary | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | NE | No Expiry | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | MN | Month | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | AN | Annual | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OM | Months from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | | | OQ | Quarters from AOD | | * FSD = 1 day after last statement date * First BED = N statement cycle(s) after FSD * Subsequent BED = N statement cycles after previous BED | | | | | | | | +| | Period Length\* | 9(04) | Period Length P is the number of Period Units making up one Bucket Period | | | | | | | | | | | +| | First Start Date | D(08) | The start and end date of every Bucket Period is derived relative to the previous Bucket End Date (BED). The BED of the first Bucket is derived relative to the First Start Date (**FSD**) and each subsequent BED is derived relative to the previous BED. BED derivation is described in item 4, following this table. The FSD can be selected to be one of the following: * + - * A Fixed Date (FD) entered as a Counter Definition parameter * First Transaction Date (FTD), the Transaction Date of the first transaction to update the Counter. The FSD is derived as described in the following: | | | | | | | | | | | +| | | | **Period Unit** | | **Derivation of Start Date (SD) of First Bucket** | | | | | | | | | +| | | | DY | | SD = FSD | | | | | | | | | +| | | | MN | | SD = Start of Month of FSD | | | | | | | | | +| | | | QT | | SD = Start of calendar Quarter of FSD | | | | | | | | | +| | | | YR | | SD = start of calendar Year FSD | | | | | | | | | +| | Reset Value | 9(16,2) | | | | | | | | | | | | +| | Keep Remainder on Reset | X(01) | “Y” if the remainder (modulus) is retained in Counter Balance at time of reset on hitting Reset Value.. “N” if remainder is not retained. | | | | | | | | | | | + +### About Loyalty Marketing Campaigns (HAVE TO BE ADDED) + +### External Transaction Code + +#### Requirement Definition + +* 1. In general, every incoming transaction from external sources carries an External Transaction Code (TC) on OLS system. + 2. The External System TC is the first key is located OLS TC for processing the transaction. + 3. The TC values will be agreed with users at the time of setting up the system. + 4. Each External Transaction Code must have an OLS Transaction Code associated with it. + +For example: If source system send purchase transaciton to OLS under TC4000 then in this case it is necessary to define one external TC TC400 in OLS. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. New transaction code coming from external system then user have to define new external TC in OLS. + 2. Some description should be adjusted then user have to modify. + 3. User need to review one or all External Transaction Codes which added on OLS then user go to this screen to review. + +#### Pre-Condition + +* 1. Users have to have the access right on this screen in order to accesss this screen. + 2. Depending on user’s access rights, they can view / add/edit or approve External Transaction Code records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Detail view + 2. Detail view + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. If Source TC required has not been defined, click on External Transaction Code icon in Main Menu to bring up the summary list as illustrated in section 4.4.5 +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | External Transaction Code\*/ Mã giao dịch hệ thống ngoài | Enter the Source System Transaction Code to be defined. | X(10) | +| 2 | Description \*/ Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognised. | X(30) | + +1. A new/edit External Transaction Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/Edited. + +#### Post-condition + +1. User able to proceed to OLS Transaction Code screen. See in section 4.5 + +#### Exception flow + +1. Input data are not passed all validation and then the user chooses to cancel the action then the use case ends in failure. + +### OLS Transaction Code + +#### Requirement Definition + +1. Every transaction processed against Campaign Rules must have an OLS Transaction Code (TC) associated with it. The OLS TC is the first key by which relevant Campaign Rules are located for processing the transaction. +2. In general, every OLS transaction carries an external TC. In some cases, the transaction being processed is internally generated in OLS. This is especially for bonus award campaigns. +3. For example: + 1. If OLS is configured to award bonus points for customers who achieve a certain level of spend at the end of the month, the award transaction is generated in OLS and has no external TC associated with it. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New transaction code coming from external system then the user has to define new OLS TC also. +2. New OLS transaction coming from internal transaction. +3. Some detailed information should be adjusted then the user has to modify it. +4. The user needs to review one or all OLS Transaction Codes that are added to OLS then the user goes to this screen to review. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to access this screen. +2. Depending on user’s access rights, they can view/add/edit or approve OLS Transaction Code records. +3. An external TC is required if this OLS TC is used to trigger CP rule for transaction coming from external system. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Summary listing page + +![](data:image/png;base64...) + +Figure 2 – Filer and quick search + +1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status ( History) + +![](data:image/png;base64...) + +1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. If the OLS TC required has not been defined, click on the OLS Transaction Code icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the OLS Transaction Code is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| | | | | +| --- | --- | --- | --- | +| **No** | **Field** | **Description** | **Data tye** | +| 1 | OLS Transaction Code\*/Mã giao dịch OLS | Enter the OLS Transaction Code to be defined. | X(10) | +| 2 | Description\*/Mô tả | A 30-character description of the source transaction code. This is intended for user reference so that the transaction code can be easily recognized. | X(30) | +| 3 | External Transaction Code/ Mã giao dịch hệ thống ngoài | The TC that comes from the transaction external system, which is to be mapped to the OLS Transaction Code. Each External TC must be assigned to only one OLS TC. One or more Exteranl TCs to be mapped to the OLS TC. | Multiple select Drop-down Lookup data from the “External Transaction Code’ screen Refer to “ External Transaction Code” API under Campaign Management | +| 4 | Reversal Indicator/Chỉ báo đảo chiều | Indicates transaction code is for a reversal or a normal transaction. | Check box Default unchecked | + +1. A new/edit OLS Transaciton Code will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each TC to be added/edited. + +#### Post-condition + +1. User able to proceed to Campaign Rule Set-up. See section>>>>> + +#### Exception flow + +1. Input data are not passed all validation and then user choose cancel the action use case ends in failure. + +### Pool Definition + +#### Requirement Definition + +1. All stored value such as rewards and cash balances or lucky draw chances are tracked in Pools. +2. Each Pool tracks a particular reward type, which is also associated with a Currency Code which represents the units of the stored value. E.g. a cash pool is used to store the Gift Card cash pool, and a Currency Code is assigned to represent the cash Currency Code - e.g. in Viet Nam this would be VietNam Dong and the Currency Code is VND. +3. Each stored value Pool tracks the stored value in Buckets. Each time the stored value balance in the Pool is incremented, at the time of incrementing the Pool balance, the Expiry Policy selected for this Pool is used to determine the date by which the stored value is to expire. The stored value is then added to the Pool in a bucket which would expire on the given expiry date as determined by the Expiry Policy. +4. Pools belong to “Loyalty Accounts” (LA) or Account (ASN) or Card (PSN). It is defined by pool entity level. +5. One LA is created per Customer (per unique CIF Number). One ASN is created per Account (per unique Account Number/ Account Level). One PSN is created per Card (per unique Card Number). +6. Pools are associated with the Customer’s Loyalty Account, where each Loyalty Account can have multiple Pools, each Pool for a reward type – e.g. Poiint Pool, Cash rebate Pool, etc + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Reward pool is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to view/update or approve these records. +2. Pool conversion rate which apply for new reward pool have to be actived on OLS. See section [Pool Conversion Rate](#_Pool_Conversion_Rate). +3. Account type group which is assinged to reaward pool have to be actived on OLS. See section [Account Type Group](#_Account_Type_Group). +4. If reward pool requires velocity control to restrict the number of redemption points/earned points/ adjustment points then Message template and Recipient Group are required and have to be actived on OLS. See section =>>>>> (OMR) + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1- Empty page + +![](data:image/png;base64...) + +Figure 2- Listing page + +![](data:image/png;base64...) + +Figure 3- Filter + +1. Detail view + 1. Pool detail + +![](data:image/png;base64...) + +* 1. Record history + +![](data:image/png;base64...) + +* 1. Pending record + +![](data:image/png;base64...) + +1. Create/Edit form + 1. General information + +![](data:image/png;base64...) + +* 1. Product Specific Expiry + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Velocity Control + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. If the reward pool required has not been defined, click on the Pool Definition icon in the Main Menu to bring up the summary list as illustrated in section 4.5.5 +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Definition is illustrated in section 4.4.5 : +3. **Screen descriptions** + +| Seq | Field (EN /VN) | Description | | Type | +| --- | --- | --- | --- | --- | +| **Statistic information** | | | | | +| | Period /Chu kì | The choices are: * + - This month - Today | Drop-down Select one Default today | | +| 2. | Balance for use/ Số dư khả dụng | The total available balance of the pool Use the Expiration date and start date of the balance bucket to compare them with the selected period. Based on sysdate to determine the date range of each period. Get data to get the balance of the pool from the LAB table. One balance bucket is available to use when it is eligible for Redemption. Use the start date and expiration date of the balance bucket to compare with a selected period. | Display Number | | +| 3. | Expired balance /Số dư quá hạn | Total expired balance of pool which have xpiring date of balance bucket less than selected period. Based on sysdate to get determine date range of each period. If Period is “This month” then get all balance bucket which will be expired on currently sysmonth. If Period is “to day” then get all balance bucket which will be expired on currently sysdate. | Display Number | | +| | Earned points/ Điểm thưởng | Total earned points of pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| | Redeemed points/ Điểm đã đổi thưởng | Total redeemed points of the pool on selected period. Use the system to determine the period. Total earned points on each period based on the post date of the transaction. | Display Number | | +| **Step 1: General information** | | | | | +| | Pool Id\*/ Pool ID | * Mandatory. System-generated * A Pool ID is used to identify a Rewards Pool and the Pool ID will be stored in all its dependent modules and transaction logs for reporting and reference. | | ~~X(05)~~ X(10) | +| | Pool Name\*/ Tên Pool | * Mandatory Field * Any printable ASCII character * Represents the name of the rewards pool. This will be used for drop-downs, reports, etc. | | X(30) | +| | Pool Description / Mô tả pool | * Optional Field * Any printable ASCII character * Describes the purpose of the Pool, for user reference. Not used in processing. | | X(200) | +| | Pool Type\*/ Loại Pool | * Mandatory Field * Pool Type indicates the type of rewards (value) stored in this Pool. A Pool Type should be one among the following values and meanings: + Points - Pool Units in Point Pools are “points” and each “point” has a cash value as set in the Currency Rate table. “Cash” is the currency that is pre-set in the OLS instance. + Cash Rebate - Pool Units in Cash Rebate Pools are “cash” and each “point” is equivalent to cash on a one-to-one basis. Cash Rebates are typically values to be credited to an external system. The Currency Rate is set to 1 to 1 for cash. + Lucky Draw chances - Lucky Draw Pools contain the number of chances a customer has earned through campaign Rules. A different Pool can be set up for each Draw program independently of other Pools. The Currency Rate is ignored. + EVoucher - A eVoucher Pool Unit is contain the number of evoucher a customer has earned through campaign Rules.”Evoucher” earned is formula result. * Lookup value from “Code management” with code_type =’pool-type”. Refer API “Get list-by-code-type” under Master Data. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one | +| | Expiry Policy/ Chính sách hết hạn | * Condition field. Inactive for Evoucher pool and required and active for remaining pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * If Pool Type selected is “Evoucher” then this field is inactive. There is non-expire for Evoucher pool type. * More detail are described in step 2. * Do not allow editing of the expiry policy (including the related field used to determine the expiry date of the balance bucket) if a balance bucket record for this pool is found. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| | Ripening Period/Kì hạn được đổi thưởng | * Condition field. Inactive for Evoucher pool and active for remaining pool. * The Ripening Period is the number of days from the transaction date after which the reward will be eligible for Redemption. * The reward earned on day 1 will only be available for redemption after Ripening Period days from the date of earning. * By default, the reward ripens on the day of transaction, i.e. the reward is available for redemption immediately. * The Ripening Period is used to determine start date of balance bucket. If Ripening Period is 0 or empty then the sysytem default start date of balance bucket as 19000101 ( This value should be configurable value instead hardcoding) * Just active if **Expiry Policy** is actived. Otherwise, this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * Condition field. Inactive for Evoucher pool and active for remaining pool. * Currency representing a unit of reward in this Pool. This is a drop-down based on values in Pool cconversion Rate table. | | Drop-down Select one Lookup value from “Pool Conversion Rate “ screen ( Pool_Conversion_Rate table) Refer to “Pool Conversion Rate” API under ”Campaign Management” | +| | Allow Negative Balance on Cancel/Refund/Ad-just / Cho phép số dư âm do giao dịch hủy hoặc điều chỉnh | * Condition field. Inactive for “Evoucher” pool. * Defaulted to “Do Not Allow”. In this mode, the amount that cannot be deducted because of insufficient Pool Balance will be posted as two adjustment transactions – one positive and one negative, with the Adjustment Reason set to “Negative Balance Adjustments”. * If set to “Allow”, indicates the Pool Balance is allowed to go negative during adjustment and cancellation/reversal processing. * Does not apply to redemption processing: redemptions declined if there is insufficient balance | | Switch button Default OFF | +| | Precision (Number of Decimal Places) /Độ chính xác (Số thập phân) | * Condition field. Inactive for Evoucher pool and required and actived for remaining pool. * Defaulted to “2” decimal places * This represents the number of decimal places that is required to store the rewards in the Reward Pool. * Precision cannot be amended downwards to lower precision after transactions have been posted into the Pool (Found LAB records). * Show confirm message when user wants to change the precsion in case it is allowed to change such as “ The change in precision will be applicable only to new updates to the Pool Balance going forward. Existing pool balance data will retain the previous precision. Proceed with change?”/ “Thay đổi độ chính xác của số thập phân chỉ áp dụng cho việc cập nhập số dư mới tính từ thời điểm thay đổi. Số dư hiện tại vẫn theo độ chính xác số thập phân trước đó. Bạn có muốn thay đổi không?” | | Drop-down Select one Lookup value from “Code management” with code_type = ’precision-scale’. Refer API “Get list-by-code-type” under Master Data. | +| | Account type group / Loại nhóm tài khoản | * Optional field * **If Account Types are selected for the Pool and ATG logical is appliable,** OLS will only allow transaction of the selected Account Types to earn/Postive adjustment to this Pool. * Don’t allow to edit if found the balane bucket record of this pool. | | Drop-down Select one Lookup distinct ATGid from “Account Type Group” screen (Account_Type_Group table). Refer “Account Type Group” API under “Campaign Management” | +| | Grace Period/Kì ân hạn | * Condition field. Inactive for Evoucher pool * The number of months to keep expired buckets before forfeiting the points in the buckets. * This field is defaulted to empty. | | 9(2) Should be greater than or equal to 0 if provided | +| | Entity level\*/ Cấp thực thể | * The Indicator determines whether the Pool balance is tracked at Card, Account or Customer level * Pool with Entity Level set to Account or Customer cannot be amended downwards to Card-level after transactions have been posted into the Pool (Found LAB records) * Pool with Entity level set to Account can be amended into Customer OR Customer pool can amended into Account level regardless transactions have been posted to the pool. * All pool entity level can be amended if there is no balance records on the pool * Pool with Entity level set to Card can not be amended into Customer/Accoutn level after transaction have been posted into the pool (found LAB record ) | | Radio button Lookup value from “Code management” with code_type = ‘entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| **Step 2: Product Specific Policy / Chính sách riêng về tài khoản** * This is an optional step. * Avaiable PA which can be selected will be PA Types to which pool is restricted only. * Each PA Type can be selected only in one row. * More than one Expiry Policy can be added, one per display row, per group of PA Types. * OLS will apply specific expire policy for transaction which have account type in selected PA types. Otherwise apply common Expire policy of the pool. | | | | | +| | Product Account Level\*/ Hạng tài khoản | * Mandatory field * Product account level | | Drop-down Select one Lookup value from “Producar Account Level” screen ( Product_Account_Level table). Refer “Product Account Level” API unnder “Code Maintenance” | +| | Product Account Type\*/Loại tài khoản | * Mandatory field * Product account type under selected Product account level. * Account type restricted to this pool only. * Lookup value from “Producar Account Type” screen (Product_Account_Type table). Refer “Product Account Type” API unnder “Code Maintenance” | | Drop -down Select one | +| | Expire policy\*/ Chính sách hết hạn | * Every Pool must have a Pool Expiry Policy, even if the policy is to never expire the balance in the Pool. * An Expiry Policy determines how the system computes the expiry date for the reward earned during transaction processing. * OLS provides the following standard polices: * N Months from month of earning: Points earned in month 1 expire at the end of month N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 3, then points earned in January will expire end of April, points earned in February will expire end of May, etc. * N Quarters from quarter of earning: Points earned in quarter 1 expire at the end of quarter N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 2, then points earned between 1-January ’15 and 31st March’15 will expire after 30th September’15, points earned between 1-April’15 and 30th June’15 will expire after 31st December’15 and points earned between 1-July’15 and 30th September’15 will expire after 31st March’16, etc. * Semi-annual, mid- and end-year: Points earned in 1st half of the year expire end of June the following year; points earned in 2nd half of year expire end December the following year. * N Years from year of earning: Points earned in year 1 expire at the end of year N+1. N is set in “Expiry Policy Parameter”. E.g. if N = 1, then points earned between 1-January ’15 and 31st December’15 will expire after 31st December’16, points earned between 1-January’16 and 31st December’16 will expire after 31st December’17 and points earned between 1-January’16 and 31st December ’16 will expire after 31st December’17, etc * Anniversary of membership: Points earned will expire on each anniversary of the customer’s membership. E.g. if customer joins on 15th February 2010, points earned before 15th February 2011 expire on 15th February 2011. * Fixed Date: Points will expire on the date specified in the “Expiry Date” parameter. A Campaign Rule which updates this Pool is not allowed to have End Date later than this date. * No Expiry: Points earned are in an ever-green bucket. Expiry Date in bucket will be defaulted to 31-Dec-2999. | | Drop-down Select one Lookup value from “Code management” with code_type =’ pool-expiry-policy”. Refer API “Get list-by-code-type” under Master Data. | +| | Pool Expiry Policy Parameter N / Tham số chính sách hết hạn N | * Conditional field. * A number value that is taken to be the value of the Policy Parameter N, of the selected Expiry Policy * If the policy selected in the preceding field “Pool Expiry Policy” expects a parameter N, then this field is active and mandatory and a number value is expected. * If the policy selected in the preceding field “Pool Expiry Policy” expects a date parameter, then this field is inactive. | | 9(5) Should be greater than or equal to 0 if provided | +| | Expiry Date/ Ngày hết hạn | * Conditional field. * If the policy selected in the preceding field “Fixed Date” then this field is active and mandatory and a valid date is expected. * Otherwise, this field is inactive. | | Date | +| **Step 3: Velocity control / Kiểm soát hạn mức** 1. This is an optional step 2. This step for editing Velocity Control parameters to define thresholds at which the system will send alerts and generate exception alert reports. 3. Multiple rows of velocity control conditions may be added to the display row 4. The parameters in the edit row collectively form a condition statement: | | | | | +| | Maximum\*/ Tối da | * Mandatory field * The number of Pool Units beyond which alerts are triggered | | 9(10,2) Should be greater than 0 | +| | Transaciton Type\*/ Loại giao dịch | * Mandatory field + - * Award * Redeem * Adjust | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-txn-type’. Refer API “Get list-by-code-type” under Master Data. | +| | Units\*/ Đơn vị | * Mandatory field + - * Per Pool units * Per transaction | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-unit’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 1/ Thực thể 1 | * Optional field + - * Customer * Account * Card * If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-entity-lvl’. Refer API “Get list-by-code-type” under Master Data. | +| | Per Entity 2/ Thực thể 2 | * Optional field + - * Corporation * Chain * Store * Terminal If Per entity 1 is not provided then this limitation is applied for whole system. | | Drop-down Select one Lookup value from “Code management” with code_type = ‘velocity-merchant’. Refer API “Get list-by-code-type” under Master Data. | +| | Per period\*/ Chu kì | Mandatory field * + - * Quarter * Month * Week * Day | | Drop -down Select one Lookup value from “Code management” with code_type = ‘velocity-period’. Refer API “Get list-by-code-type” under Master Data. | +| | Alert Template\*/ Mẫu cảnh báo | * Madatory field The template containing the alert message to be sent when velocity control conditions are met. | | Drop -down Select one ==tbd== | +| | Alert Group\*/Nhóm cảnh báo | * Mandatory field * The group of recipients to receive the alert message. * This can be an SMS group or an Email group or a mix of both | | Drop-down Select one ==tbd== | +| **Effected Campaign Rule listing linked this reward pool** ![](data:image/png;base64...) | | | | | +| | Campaign /Mã chiến dịch | Campaign which reward rule belong to the choosen pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Rule /Mã quy tắc | Campain Rule which trigger to reward pool | | Display Lookup value from CAMPAIGN_RULE table | +| | Transaction Code/ Mã giao dịch | Transaction Code linked to campain rule | | Display Lookup value from CAMPAIGN_TC_LINKAGE table | +| | Start Date / Ngày bắt đầu | The start date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | +| | End date/ Ngày kết thúc | The end date of effected period Campaign Rule | | Display Lookup value from CAMPAIGN_RULE table | + +1. A new/edit reward pool will display in pending Tab and display in Active tab after user approve the TC. +2. Repeat for each reward pools to be added/edited. + +#### Post-condition + +1. User able to proceed Campaign Rule setup/ Item price setup / Post new transaction/PwP setup….any where pool id is required. +2. A pool with Card-level setting will be updated with one Pool bucket per unique pair of Card number + period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Card that earned the balance in that bucket. +3. A pool with Account-level setting will be updated with one Pool bucket per unique pair of Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Account (and any Card of that Account, depending on the redemption criteria) that earned the balance in that bucket. +4. A pool with Customer-level setting will be updated with one Pool bucket per unique pair Account & period (start date and expiry date). The balance in each Bucket in the Pool can only be redeemed by the Customer, using any Account/Card of the Customer (depending on the redemption criteria) that earned the balance in that bucket. +5. Within each Pool, the earnings are tracked in Pool Buckets segregated by Expiry Date and Account Type. The earnings by an Account are tracked in that Account’s buckets in the Pool if pool entity level is Customer or Account level. The earnings by a Card are tracked in that Card buckets in the Pool if pool under Card level. +6. If the earnings fall into different expiry dates, then the earnings of each expiry date are tracked in a distinct bucket for that Account/Card, for each preiod (The start date and expiry date of the bucket). + +#### Exception flow + +1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Pool Conversion Rate + +#### Requirement Definition + +1. The Pool Conversion Rate table is a look-up to associate a description text to each Pool Conversion Rate Code for easy user reference in displays and reports. +2. Reward types are tracked in Pools. Each Pool is associated with a Pool Conversion Rate. The Pool Conversion Rate Code is associated with a Pool Conversion Rate set in the Currency_Rate table. When processing reward and redeem/adjustment transactions, the Currency Rate for the Pool is used. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. Pool conversion rate is not existing in OLS or have some informations need to be corrected. + +#### Pre-Condition + +1. Users have to have the access rights in both Pool Converion Rate and Currency Rate moudles in order to can view/update or approve these records. +2. User must select a record in pool conversion rate listing page to bring up Curreny Rate tab. + +#### Wireframe + +1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +1. Detail view + 1. Detai view + +![](data:image/png;base64...) + +Figure 1 - Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2- Currency Rate + +* 1. Record status + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +1. Create/Edit form + +![](data:image/png;base64...) + +Figure 1- Pool Conversion Rate + +![](data:image/png;base64...) + +Figure 2 – Currency Rate + +#### Business Rules + +1. Click on the Pool Conversion Rate icon in the navigation panel under Campaign Management to get a listing of the existing Pool Conversion Rate, as illustrated in section 4.7.5. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Conversion Rate is illustrated in section 4.7.5. +3. Double click on any existing record in Active Tab then the Currency Rate listing is illustrated in section 4.7.5 +4. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for Pool Currency Rate is illustrated in section 4.7.5. +5. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| **Pool Conversion Rate Code/ Mã tỉ lệ chuyển đổi** | | | | +| 1 | Pool conversion Rate Code\*/ Mã tỉ lệ chuyển đổi pool | * A code to represent the pool conversion rate. * To contain at least one alphabet. | ~~X(3)~~ X(10) | +| 2 | Description\*/ Mô tả | * Description of the currency code. This description will be shown in the drop-downs, reports etc. | X(30) | +| **Pool conversion Rate / Tỷ lệ chuyển đổi** | | | | +| | Pool Conversion Rate Code\*/Mã tỉ lệ chuyển đổi pool | * This is the Pool Conversion Rate whose Rate against the Base Currency is being configured. | View only | +| | Buy Rate\*/ Tỉ giá mua | * This is the amount of Base Currency required to purchase 1 unit of the Currency Code (i.e. 1 Pool Unit). * This is used to calculate the value of a point awarded transaction for posting to GL for award. This is also used to calculate the value of a point adjustment transaciton for posting to GL for positive adjustments. * The rate used is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Sell Rate\*/ Tỉ giá bán | * This is the amount of Base Currency that will be received in exchange for giving away one Pool Unit of the Pool that is assigned to this Currency Code. * This is used to calculate the value of a point redemption transaction for posting to GL for non-catalogue item redemptions. This is also used to calculate the value of a point adjustment transaction for posting to GL for negative adjustments. * The rate used for deriving costs is the effective rate at the time of transaction. | 9(6,2) Should be greater than 0 | +| | Effective From Date\*/ Ngày bắt đầu | * Start Date is the date on and after which the Rates in this record are effective * End Date is the date after which the Rates in this record is no longer effective. * The end date must greater than or equal to start date. * During the period between Start Date and End Date, the record is an “Effective Record”. * If there is more than one Effective Record for a Currency Code at any one time, then rates in the Effective Record with the latest Start Date are used. | Date The date format must adhere to the configured format | +| | Effective End Date\*/ Ngày kết thúc | + +#### Post-condition + +* 1. User able to proceed Pool Definition setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Definition + +#### Requirement Definition + +* The system makes use of Counters to track totals – e.g. total spend, total earned, total redeemed – within given time periods. +* The Counters can then be referenced in Campaign Rules are criteria. +* Counters are updated only upon fulfilling the Rule Criteria, and hence be used to track transactions that fulfill particular conditions – e.g. only transaction so $100 or more, only transactions done on Wednesdays, etc. +* A Counter is structured + + Counters can track totals by periods – e.g. monthly totals, quarterly totals, etc. + + The cut-over from one period to the next can be: + - 1. Automatic based on the Transaction Date or the Batch Date, or + 2. Forced, by setting a Counter “State” when it is decided that a period total should be closed and a new one started. This is a “State Counter” +* A “State Counter” tracks the total in the same bucket until a process (e.g. a Campaign Rule) specifically updates the State of the bucket to “close” the bucket. + + After the State of the bucket is updated to “Closed”, further updates to the Counter goes into a new “current” bucket. + + Every update to the Counter thereafter updates the “current” bucket until its State is updated to “closed” + + A new “current” bucket is automatically created by subsequent updates. +* Use Case: the campaign is to reward customers with a 5% bonus on top of the month’s total earnings from regular campaigns if customer’s total spend in that month is more than $1,000 + + Customer’s earnings from regular campaigns are updated into a monthly counter C1 by the regular Campaign Rules + + A separate Campaign Rule is set up to update a monthly spend counter C2 on every spend transaction processed throughout the month + + At the end of the month, all customers whose Counter C2 is more than $1,000 are awarded 5% of the total earnings tracked in C1. + +#### Process flow + +![](data:image/png;base64...) + +#### Trigger + +* If the campaign requires transaction amounts to be accumulated or counted before the award can be determined, then Counters are required. +* If Counter is required and it is not an existing Counter, click on Counter Definition icon in Main Menu to bring up the summary list as illustrated in section 4.7.5 +* For example: + + A Counter may be set up to track the total spend by the card in merchants with selected MCC – such a Counter is a “spend” Counter + + A Counter may be set up to track the number of pool units calculated by Rule Formulae (for award and redeem) – such a counter is a “Pool Units” Counter + + A Counter may be set up to track the number of transactions performed by card at a selected merchant – such a counter is a “frequency” Counter + +#### Pre-Condition + +N/A + +#### Wireframe + +* Click on Counter Definition in Main Menu to bring up the summary list as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition_Grid.png](data:image/png;base64...) + +* Use the search filter to locate the counter required: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition- filter.png](data:image/png;base64...) + +* Click on Add a Counter in the screen will bring up the same edit form as illustrated in the following + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter Definition.png](data:image/png;base64...) + +* Click on a row showing an existing Counter in the display will bring up the view form for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail.png](data:image/png;base64...) + +* Click on “Record Status” tab in the view form of counter will bring up the record history for that Counter as illustrated here: + +![C:\Users\maivt\OneDrive\Desktop\OLS - CN\Counter detail2.png](data:image/png;base64...) + +#### Business Rules + +The key data entities making up Counter are defined in the following table: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | Counter Id\*/ ID bộ đếm | Unique identifier for a Counter Definition record | X(10) | +| | Counter Name\*/Tên bộ đếm | A text string that describes this counter; it can be used as a unique identifier for this Counter Definition. | X(50) | +| | Counter Description/Mô tả bộ đếm | A text string that more completely describes this Counter Definition, elaborating on what it is used for (its intended purpose), etc | X(200) | +| | Effective From Date\*/ Ngày hiệu lực bắt đầu | Start Date is the date on and after which the Counter is effective. | Date. The date format must adhere to the configured format | +| | Effective To Date \*/Ngày hiệu lực kết thúc | End Date is the date after which the Counter is no longer effective. • During the period between Start Date and End Date, the record is an “Effective Record”. End date must equal or greather than start date | Date. The date format must adhere to the configured format | +| | Entity\*/Cấp thực thể | Drop-down, defines the Entity level at which the counter will be kept – this determines, for example, whether the count is tracking spend at customer level or account level, etc. E.g. a Counter at Customer level means there is a unique Counter per Customer. The Entity level at which a quantity is to be tracked | X(05) Drop-down. Select one. Lookup value from "Code_Management" table where code type is "counter-level". Refer "get-by-code-type" API under master data. | +| | Bucket Period Unit \*/Thời kì đếm | The Counter records data in “Buckets” per “Counter Period” The Counter Period of a Counter defines the time period for which to accumulate in a single bucket in the counter. When a transaction triggers a Counter update action, the Counter Method calculates the Counter Period based on the Counter Definition parameters and the Transaction Date: At the end of the Counter Period, a new bucket is automatically created. A Counter Period is quantified in terms of the Length of Counter Period, which is measured as “N Counter Period Units”, i.e. each Bucket tracks totals for one Counter Period of “N Period Units”; The “Period Unit” can be any one among the following values. | | | | | --- | --- | --- | | * + AOD Anniversary | * + Day Counter | * + Days from AOD | | * + Days from COD | * + Fixed Date | * + Half Year | | * Months from AOD | * + Month Counter | * + Non Expiry | | * + Quarter Counter | * + Quarters from AOD | * + Week Counter | | * + Year Counter | | | **Note:** Following bucket period unit just apply for Account/Card entity-level only: * + 1. AOD Anniversary 2. Days from AOD 3. Months from AOD 4. Quarters from AOD. Besides, the "Days from COD" period unit is applicable for the Card Entity-level only. Other bucket period units are applicable for all entity levels. **For example:** if “Period Unit” is Months, and N is 2, then each Bucket tracks the totals for a period of 2 consecutive months where the “N Period Units” per Bucket takes the value “2 months” per Bucket. If the Counter Period is Month and N is 3, then each bucket tracks the total for 3 months, starting from month of Start Date (see description for the input field “First Bucket Start Date is Based On”) and ending at the end of 3 months after the month of Start Date.. The derivation of the Bucket End Date of each Bucket is therefore based on the parameter “Bucket Period Duration” per Bucket. The derivation algorithms are described in item **8** | Drop-down Select one Lookup value from "Code_Management" table where type code is "counter-period". Refer "get-by-code-type" API under master data | +| | Bucket End Date/ Ngày kết thúc bộ đếm | Condition field. This field is actived and required only when "Fixed date" Unit is selected | Date. The date format must adhere to the configured format | +| | Bucket Period Duration(N)/ | Condition field. Inactive if Bucket period unit as Fixed date/Non-expiry. Required and active for remaining period unit. counter bucket based on duration as following: * **N-Day Counter:** One bucket is created every N Days, starting from the date of first transaction. E.g. + If first transaction is on 13th March and N is 10, then the first Bucket expires after 23rd March. + All transactions before and up to and including 23rd March updating the Counter will update this Bucket. + A transaction dated 24th March updating the Bucket on 24th March will result in a new Bucket expiring on 3rd April (10 days later). A transaction dated between 4th - 12th April 2018 will update a Bucket with Expiry Date 12th April 2018 N defaults to 0 (the minimum), in which case a Bucket is created everyday there is a transaction –i.e. Bucket Expiry Date is Transaction Date. * **N-Month Counter**: One bucket is created every N Months, starting from the month of first transaction + The month when the first Counter Bucket is created is the Start Month of the Counter. The Bucket Expiry date of the first Bucket is set to end of N months thereafter. E.g. if first transaction month is May, and * + N = 1, then the Bucket Expiry Date is 30-June. + Each transaction updates Bucket with the smallest Expiry Date which is later than Transaction Date. + If there is no Bucket with Expiry Date greater than or equal to Transaction Date, a new Bucket is created with Bucket Expiry Date set to the next end of month which is a multiple of N months from Start Month. N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Month. * **N-Week Counter**: One bucket is created every N Weeks, starting from the Week of first transaction. + N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Week Start of Week is entered as a second parameter * **N-Quarter Counter**: One bucket is created every N Quarters, starting from the Quarter of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction Quarter * **N-Year Counter**: One bucket is created every N Years, starting from the Year of first transaction N defaults to the minimum of 0, in which case the Expiry Date is the end of transaction year. * **No Expiry** The same Bucket is updated all the time, until the State is specifically updated to * **Fixed Date Period** + This is a single-period Counter period calculation method. The Bucket Expiry Date is set to the Fixed Date. Bucket is updated by all transactions that have a transaction date before the Fixed Date. * **N Days from AOD** * One bucket is created every N Days, starting from the AOD. * **N Months from AOD** * One bucket is created every N Months, starting from the AOD. E.g AOD = 15/July/2022 counter unit = 1 month of AOD Then counter bucket will be: 15/July - 14/Aug, 15/Aug - 14/Sep 15/Sep - 14/Oct... * **N days from COD** (Card Open Date) * One bucket is created every N Months, starting from the COD. E.g COD = 15/July/2022 counter unit = 1 days of COD Then counter bucket will be: 15/July – 15/Jul, 16/Jul – 16/Jul | 9(02) Should be greater than 0 if provided | +| | What to count\*/ Tiêu chí đếm | The data entity that is to be counted or tracked | Drop-down Select one Lookup value from "code_management" table where type code is "counter-count". Refer "get-by-code-type" API under master data | +| | Reset type\*/Loại cài đặt lại giá trị | The Reset Type choices are as follows: Reset to 0 when Reset Value exceeded/ Reset to remainder when Reset Value exceeded | Drop-down Select one Lookup value from "counter-count" table where type code is " counter-reset-type". Refer "get-by-code-type" API under master data | +| | Reset Value\*/Khi giá trị vượt qua | Defaulted to “999999999”. Must be numeric. Indicates the value at which the counter Bucket End Date will be set to the current date-time and a new bucket is started | 9(14,2) | +| | First Start Date Is Fixed/ Ngày bắt đầu đầu tiên là cố định | Condition field.Inactive for following Buket Period Unit: **Days from AOD, Months from AOD, AOD Anniversary, Quarters from AOD, Fixed Date, No Expiry, Days from COD** | Switch button. Default off | +| | First Start Date/Ngày bắt đầu | Condition field. Active and required only when First Start Date is fixed | Date. The date format must adhere to the configured format | +| | Update State When\*/ Cập nhật trạng thái bộ đếm khi | The Counter Buckets have a default State of “C” (“created”). This State can be updated to “A” to force a stop to the update of the Bucket and cause a new Bucket to be started in the same period. "On ward" when counter is extracted and hit CP rule. "On extract" when counter is extracted regardess to hit or no hit CP rule."Never" mean for Counter state still is C even counter is extracted or not" | Radio button. Lookup value from "Code_Management" table where type code is "counter-state". Please refer "get-by-code-type" API under master data | +| | Late transaction Posting Option\*/ Đăng giao dịch trễ | This option is used to determine the counter bucket which late transaction posting will update. There are 2 options: * Late counter value: The TP will update counter value into “late counter value” if transaction posted after counter is extracted * Current counter bucket: The TP will update counter value into value of currently counter bucket regardless of Effective Date. Refer to post -condition to get more logical on this one | Radio button Default “Late counter value” Lookup value from “Code_Management” table with code type is “late-txn-posting”. Refer “get-by-code-type” API under master data. | +| **Validation:** - If the Counter Id already exists counter value (counter_stock table), please block changes to the Counter Definition record except for the End Date/Counter Name/Description. In this scenario allow End Date to be brought forward (>= current Batch Date) or pushed further into the future. - Cannot delete if counter id already exists in Counter_stock table. | | | | + +#### Post-condition + +* + - * 1. The **Expiry Date** (**ED**) of a Counter Bucket to be updated by a transaction with Transaction Date = TD is the Bucket with ED derived as specified in the following link: + +[Update counter (Formula 5) Processing](https://www.figma.com/board/fB9IOr5v0TqV6PDmHTRKjt/Counter-Update-Processing?node-id=0-1&t=dqH5oSLyq0vPxltU-0) + +1. Late counter transaction posting + +**When late transaction is comming:** + +If "Late Transaction Posting Option" = "Update Late Value" + +& State! = C then update + +Else if "Late Transaction Posting Option" = "Update Current Bucket" + +& State! = C --> update Current Bucket (Use post date of the transaction to determine the current bucket to update), regardless of Effective Date. + +**Scenario: ![](data:image/x-emf;base64...)** + +#### Exception flow + +### Transaction Category + +#### Requirement Definition + +* 1. Transaction Category help business can define each processed transaction under pre-defined category. + 2. Transaciton Category is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup Campagin Rule Criteria. + 3. **Business case:** + +3.1 Enrollment Program + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Trasaction Category** | **Campaign Rule Criteira** | **Award rate** | +| | Dining | Dinning transaction AND Local currency and DCC transaction | 1% | +| | Entertaiment | Entertainment transaction AND local currency and DCC transaction | 2% | +| | Dining | Dinning transaction AND Foreign currency and NOT a DCC transaction | 3% | +| | Entertaiment | Entertainment transaction Foreign currency and NOT a DCC transaction | 4% | + +If there is no Transaction Category, we need to have we need to have separate counter ids for these 4 cases so we need 4 Campaign Rules to update these 4 counters. + +Therefore If the 4 conditions are are captured as transaction category then we have: + +TxCat1 = Dining txns, local currency + DCC + +TxCat2 = Entertainment txns, local currency + DCC + +TxCat3 = Dining txns, foreign currency + not DCC + +TxCat4 = Entertainment txns, foreign currency + DCC + +To archive this campaign, when define the transaction category we just need: + +* One counter under Account-TxnCat couter level +* One CEP rule to extract counter value to trigger award rule to get award points/cash back. +* One Campaing Rule using F6 to fulfilment this requirement. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access right in the Transaction Category moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup + +#### Sktech + +* + - 1. Create/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wirefarme. +2. OLS system will use Query Builder to build query for this screen such as Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campagn rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same category. +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **General information** | | | | +| | Transaction Category Code\*/Mã danh mục giao dịch | Unique identifier for a Txncat record | X(05) | +| | Transaction Category Name\*/Tên danh mụ c giao dịch | Name of transaction category | X(50) | +| | Description/Mô tả | Description for refer only | X(100) | +| **Transaction Category Configuration** **The same approach as Rule Criteria. See more detail in the section** [**Rule Criteria**](#_Business_rules_1)**.** **Note: The Criteria list are the same as Rule Criteria except Transaction Category Criteria** | | | | + +#### Post-condition + +* + - 1. Transaction category will be used in the Campaign Rule Criteria as a separate criterion. + +#### Exception flow + +### Account Type Group + +#### Requirement Definition + +* + - 1. An account type is a combination of Product account level and product account type. + 2. Account Types are put into Account Type Groups (ATG). ATG is groups Account Types (Org + Logo) and orders them in priority for deductions during redemptions and adjustments (Customer-level Pools) + 3. Each reward Pool is assigned an ATG, and only Accounts of the selected ATG can earn/postive adjust into that Pool. + 4. There is no ATG checking for redemption and negative adjustment. + 5. An ATG Sequence number is assigned to each Account Type in an ATG. + 6. When system has to select an Account Type for a transaction, the Account Type with the smallest ATG Sequence is selected. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +1. New account type is coming then need to be added this account under ATG of reward pools. +2. Some points need to be corrected for existing ATG. + +#### Pre-Condition + +1. Users have to have the access right on this screen in order to can view/update or approve these records. +2. Account type which apply for ATG have to be actived on OLS. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1 – Listing page + +![](data:image/png;base64...) + +Figure 2- Filter + +* + - * 1. Detail view + 1. Detail view + +![](data:image/png;base64...) + +* 1. Record status (history) + +![](data:image/png;base64...) + +* + - * 1. Create/Update form + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. The combination ATG id + Account type ( logo+ org) and Sequence No is unique. + 2. If ATG required has not been defined, click on Account Type Group icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe) + 3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Account Type Group is illustrated in section [Wireframe](#_Wireframe): + 4. **Screen descriptions:** + +| Seq | Field (EN/VN) | Description | Type | +| --- | --- | --- | --- | +| 1. | Account Type Group Id\* / Mã loại nhóm tài khoản | Account type group ID which assingned to rewards pool. The combination of ATGid and Account type is unique. | X(10) | +| 2. | Description\*/ Mô tả | Description to describe this ATG | X(100) | +| 3. | Product Account Level\*/Hạng tài khoản | * 1. An ATSP is a list of Account Type (PA Level || PA Type) 2. Each Account Type (combinnation of PAT and PAL ) in the list is assigned an ATG Sequence Number (ATGSN) unique within the list. | Drop -down Select one Lookup value from “Product Account Level” screen- PAL table Refer to “Product Account Level” API under Code Maintenance | +| 4. | Product Account type\*/Loại tài khoản | Drop-down Select one Lookup value from “Product Account Type” screen- PAT table where PAL is selected PAL Refer to “Product Account Type” API under Code Maintenance | +| 5. | Sequence No\*/ Số thứ tự | The processing sequece number | 9(04) Should be greater than or equal to 0 | +| **Linked Pool / Pool liên kết** This listing page is actived when user click view detail of an ATG record. The listing page includes all pools linked to the selected ATG, as well as the effected campaign rule linked to each pool. ![](data:image/png;base64...) | | | | +| | Pool/Pool | Pool linked to the selected ATG | Display Include Name and Code Lookup value from “Pool Definition” Screen. Lookup Pool_Definition table where ATG of the pool is selected ATG. | +| | ~~Pool Name/ Tên pool~~ | ~~Pool Name~~ | ~~Display~~ ~~Lookup value from “Pool Definition” screen.~~ ~~Refer to “Pool Definition’ API under Campaign Management~~ | +| | Campaign Rule / Quy tắc chiến dịch | Campaign Rule linked to the reward pool Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes name and code Lookup value from Campaign_Rule table by specific pool Id | +| | ~~Rule Name/ Tên quy tắc~~ | ~~Name of Campaign Rule~~ | ~~Display~~ ~~Lookup value from “Campaign_Rule” table by specific Campaign Rule ID~~ | +| | Effective Date /Ngày hiệu lực | Effective Date of Campaing Rule Leave as empty if there is no CP rule linked to this pool e.g New pool | Display Includes Effective Start Date and Effective End Date Lookup value from “Campaign_Rule” table by specific Campaign Rule ID | + +#### Post-condition + +1. ATG is used for dedection sequency control. When customer redeem/ post negative adjustment transaction under customer pool enity level: + 1. Based on Pool entity level / ATG of pool to locate deducted pool balance bucket. + 2. Points are deducted in order of ascending Expiry Date (earliest expiring dates first). + 3. If more than one bucket has the same expiry date, the bucket are further sorted by start date (earliest starting dates first). + 4. If more than one Bucket has the same expiry date and start date, the buckets are further sorted by a pre-configured priority sequence – i.e. buckets of lower priority Account Types will be deducted first. Account types are not under ATG will have the highest priority sequence. + 5. Redemption from expired buckets is allowed with supervisor approval during item redemption through administration screen. + +* Example of an ATSP comprising 2 Account Types + +ATSP Id PA Level PA Type Sequence Number + +| 11 | | 830 550 | | 10 | + +| 11 | | 830 630 | | 20 | + +When posting transactions where the Entity provided is the CIF Number, an Account of the CIF with lowest ATSN will be selected to be the Transacting Account + +*Example 1*: when transaction in batch transaction file contains CIF Number but not Account Number, an Account of the CIF Number will be selected whose Account Type has the smallest sequence number in the ATG of the Pool of the transaction. + +*Example 2*: when a CEP transaction is posted where the Counter is at Customer level, an Account of the CIF Number will be selected whose Account Type has the smallest sequene No in the ATG of the Pool of the transaction. + +1. ATG is used to find account to post transaction in case transaction is coming with CIF number only. In case ATG is appliable then: + +* A = set of all Acct Types of Cust +* B = set of Acct Type in ATG of Pool +* C = Intersection of A and B + +**Therefore**: + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to post transaction. + +**Example**: Adjustment transaction is posted by CIF number then TP must locate Account which under ATG of pool to post transaction. + +1. ATG is used to validate transacting account/Card/CIF. Transacting Account/Card/CIF number should be under ATG of pool. + +* If incoming transacitons are posted by Account or Card then transacted account type should under ATG of reward pool. If not transaction will be rejected. +* If CIF number is provided only then TP base on following process to find eligible account to process: + +A = set of all Acct Types of Customer + +B = set of Acct Type in ATG of Award Pool + +C = Intersection of A and B + +**Therefore:** + +* If C is null then txn is rejected. +* if C is not NULL, and more than one acct type found in C, TP will get Acct type with smallest seq no in ATG of Pool to continue processing. + +**Example:** Award transaction is posted by CIF number then TP must to locate Account under eligible acccount type to find valid rule and trigger CP rule. + +1. ATG is used to validate blocked transaction. +2. ATG is employed to determine the account type restricted by the reward pool specified in the Pool Definition. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Reward Campaign + +#### Requirement Definition + +1. Business rules controlling reward and redeem transactions are set up as Rules in “Campaigns”. +2. Customers enjoy different reward types depending on the type of card (Account/CIF) they hold and the details of the transactions. +3. A single transaction can trigger multiple concurrent award programs. +4. Groups of outlets can operate their own outlet-specific Campaign Rules with different rules and periods per Campaign Rule. +5. Type of campaign in OLS: + +* Award on every transactions: The reward is determined at the time the transaction is processed in OLS. Campaign structure as bellow: + +![](data:image/png;base64...) + +* Accumulate then Award: In an “Accumulate then Award” campaign, the reward depends on the customer’s total spend or number of transactions performed … over a period. Campaign structure as bellow: + +![](data:image/png;base64...) + +1. Auto redemption Campagin: Some campaigns, such as cash rebate or frequent flyer mile campaigns, require that the awarded quantities (cash rebates, frequent flyer miles or other partner points) be “redeemed” and sent to an external (destination) system – Card, deposits or partner airline, etc – in order to credit the customer’s account in the destination system. +2. Combination of all above campaign type: Some campaign, such as welcome campaign, require that the awarded from customer’s total spending and the awared quantities be “redeemed” and sent to an external system. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have the access rights in Campaign moudle in order to can view/update or approve these records. + +#### Wireframe + +Refer wireframe on figma. + +#### Business rules + +* + - * 1. Click on “Campaign” icon in Main Menu to bring up the summary list as illustrated in section [Wireframe](#_Wireframe_17) + +1. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section [Wireframe](#_Wireframe_17) +2. Campagin Rule as a subtab of active campaign when user click to view any active campaign. User can directly create new campaign rule of selected campaign instead. +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Create/Edit mode** | | | | +| | Campaign ID \*/ Mã chiến dịch | Uniquely identifies the Campaign: system generated or entered by user | X(10) | +| | Campaign Name\*/Tên chiến dịch | Name of the campaign, used in drop-downs. Must include at least 10 non-space characters | X(50) | +| | Campaign Owner/Người sở hữu | Text string for user reference only | X(50) | +| | Campaign Description/ Mô tả chiến dịch | Description for user reference | X(500) | +| | Campaign Type/Loại chiến dịch | Campaigns are either “Base”, which are basic campaigns that generally apply across the board and a core part of the product, or “Tactical” campaigns, which are short-term campaigns with specific objectives – e.g. to boost the month’s spend in foreign currency, etc | Check box Default none. Select one Lookup data from “code_management” table where code-type is “campaing-type”. Refer "list-by-code-type" API under "Master data" with type code is" campaign-type" | +| | **Campaign Target** | | | +| | Target Active Customer Count / | This is used for Campaign insight The total targeting customer in the campaign. | 9(10) Should be greater than 0 if provided | +| | Target Average Transaction Value/ | This is used for Campaign insight to compare actual value with targeting value. The total targeting total spending in the campaign. | 9(14,2) Should be greater than 0 if provided | +| **View mode: Display all field of create mode and add following fields:** | | | | +| | Campagin Period/Thời gian hiệu lực của chiến dịch | This shows earliest Rule start date and the latest Rule end date in this campaign. These dates are derived from the actual rules in the Campaign and not derived | Display and enable for view mode only | +| | Number of Rules in Campaign/ Số quy tắc trong chiến dịch | Dynamically computed when screen is in display mode, shows the count of number of Rules in this campaign | Display and enable for view mode of active record only | +| | **Campaign Rule tab: A sub tab to include all campaign rule belong to this CP. This appear when view any active CP.** | | | + +#### Post-condition + +#### Exception flow + +### Reward Campaign Rule + +#### Requirement Definition + +* 1. Campaing Rule are used to define the business rules for giving a reward, or defining the conditions for redemption of a reward. Use a campaign rule also to define the rules for Load transactions. + 2. Each campaign rule is comprised of the campaign rule header (as defined in this screen), the campaign rule master where some common parameters for reward calculation are set, and the Campaign Rule Formulas where the actual reward formulas are defined. + 3. The Pool to which the result of the Campaign Rule Formulas are posted is set up in the Pool Relationship tab. The Transaction Link tab is used to link this scheme to all the transactions to which this scheme is to apply. + 4. In this version we support following Campaign Rule type: +* Award +* Redeem +* Adjust +* Item Redemption +* Counter Extract and Process +* Redeem Extract and Process +* Transaction Extract and Process + 1. In this section, we just focus on the rule type which will go through Campaign Rule to check criteria and get reward points: Award/Redeem/Adjust + +#### Process flow + +#### Trigger + +#### Pre-condition + +* + 1. Users have to have the access rights in Campaign Rule moudle in order to can view/update or approve these records. + +#### Wirefame + +Refer to Figma. + +#### Business rule + +* + - * 1. Click on “Campaign Rule” icon in Main Menu to bring up the summary list as illustrated in section Wireframe + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form Campaign is illustrated in section Wireframe + 3. Campaign Rule Screen can be display as a submodule of Campaing module as well + 4. **Screen description for Edit/Create mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Choose rule type to configurate campaign Rule** | | | | +| | Choose Rule type | Click on "Create" button to bring up main page. User must to choose"Award/Redeem/Adjust rule type" to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". If user choose "Award/Redeem/Adjust" rule type then UI/UX of award rule type is displayed. Rule type is getting from | Radio button Rule type is getting from "Code_Managemnt" table. Refer "list-by-code-type" API under master data with code type is" rule-type" | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Pool \*/Pool | The Reward Pool on which the result of this rule will be applied (i.e. the Pool awarded to, redeemed from, etc) Evoucher pool is applicable for Award Rule Type only | Drop-down. Select one. Lookup value from "Pool_Definition" table. Refer "Pool Definition" API under Campaign Management. | +| | Item Code/Vật phẩm | Condition field This is only active and required when Evoucher Pool is selected in the previous step | Drop down Select one Get active eVoucher item from Item master screen. | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | Do not update pool/Không cập nhật pool | If this is selected, the Pool Balance is not updated with the Result of Formula calculations of this Rule even if the Criteria are met. This is usually set if the Rule is intended only for Counter Update or Attribute update and not to give the actual reward. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. 4. Reversal TC is not allowed for Adjustment Rule Type 5. Reversal TC is not allowed for reward Evoucher Pool In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than or equal to 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** If madatory fields in step 2 are not provided then step 3 is blocked **Please refer more detail in FSD section 4.12 Rule Criteria. Take note that we must to support Include Counter Definition/Attribute Definition/Code Maintenance date for in-line editing and approval with the Rule.** | | | | +| **Step 4: Formula setting** | | | | +| | **Amount to use** This is condition step. If campaign rule include award formula (F1, F4, F6, F8) then this step is required. | | | +| | Amount to Use in Formula (A)\*/Giá trị sử dụng (A) | Derives the Amount A to use in Formula *The result of this operation is used as Amount in Formula selected in this Rule* | Drop-down. Select one. The drop-down inclues all numberic attribute AND all active counter (all of current/previous/before last bucket) AND lookup value from "Code_Management" table where code type is "amt-to-use-formula" | +| | Cap A not more than/A không vượt quá | Caps the Amount A to use in Formula to calculate the Result | 9(14,2) Should be greater than 0 if provided | +| | Cap per/Giới hạn trên | Conditon field. It is required if Cap A not more than is provided | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap-tracking Counter/Giới hạn trên bộ đếm | Condition field. This field is actived and required only when counter is selected on "Cap per" | Drop-down. Select one. Lookup value from "Counter_Definition" table with currently counter bucket only. Refer"Campaign Counter Definition" API under Campaign Management. | +| | Apply after Cap value/ Áp dụng thưởng sau giá trị giới hạn A | Condition field. This filed is active and required when “Cap per” is provided | Switch button. Default OFF | +| | Formula result is rounded\*/Kết quả của công thức là | Choice of rounding method, select one: Down/To Nearest/ Up | Drop-down. Select one. Lookup value from "Code_Management" table where code type is"formula-rounded". Refer" get-by-code-type" API under Master data. | +| | **Award limit:** This is optional step. This sets the cap on the sum of Result from the formula set up in Campaign Rules. If the Result from Campaign Rules exceeds this cap, then this cap is used as the Result. | | | +| | Add Award Limit | Click to add limitation of the result *On each Campaign rule just only one “Give at least” limit is applied.* *Can have more than one “Give No more than” limit are applied* | Button Can’t add new limitation if all required field in currently limitation configuration are not provided. | +| | Give\*/Tặng | Drop-down to select the limit type to sets the Cap of sum the result: * At Least * Nore More Than | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Cap value\*/Giá trị giới hạn | Limit value can be fixed value as numberic format filed or Attribute value of numeric atribute. Must only one value is provided. If fixed value is provied then "attrbite list" is inactive and vice versa | **Fixed value**: 9(14,2) Should be greater than 0 if provided **Attribute value**: Drop-down. Select one Lookup from “Attribute_Definiton” Table where data type is number” Refer “Attribute Definition” API under Code Maintenance | +| | Limit result to/Giới hạn theo | Condition field. This field is actived and required when give "No more than" only since “At least” if just apply for per campaign Rule only The drop-down list to select the limit result to as following : * Per Campagin Rule * Ask Tracked in Counter | Drop-down. Select one. Lookup value from "Code_Management" table | +| | Counter Id/Bộ đếm | Condition field. This field is active and required when "As tracked in counter" is selected only | Drop-down. Select one. Lookup value from "Counter_Definition" table to list all active point counter (filter by "counts" column). Refer "Campaign Counter Defintion" API under Campaign Management | +| | And Triger Alert/Mẫu thông điệp cảnh báo | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | Sent to/Gửi cảnh báo tới | Condition field. This field is actived when "As tracked in counter" is selected only | Drop-down. Select one. | +| | When Counter reaches/Khi giá trị bộ đếm chạm tới | Send the notification when counter value is reached the inputed value | 9(14,2) Should be greater than 0 if provided | +| | **Formula Detail** Refer [Campaign Rule formula](#_Campaign_Rule_Formula) | | | +| **Step 5: Contributor Details** Optional step Refer [Contributor](#_Campaign_Rule_–) | | | | + +#### Post-condition + +Amount to use feature with Transaction Processing. + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Exception flow + +### Campaign Rule Criteria + +#### Requirement Definition + +1. Rule criteria are divided into 5 categories for ease of maintenance: + +| | | | +| --- | --- | --- | +| Customer | Account | Transaction | +| Atttribute | Counter | Merchant | + +1. Campaign Criteria setup is the next step of campaign rule setting if Campaign Rule require transaction through campaign rule to validate criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Exsiting Campaign require at least one campagin rule validate criterions. + +#### Pre-Condition + +1. Users have to have the access right in the Campaign Rule moudle in order to able to view/update or approve these records. +2. Assume that all criteria are defined as attribute and appear in right panel to user can drag/drop to setup. ==TBD== + +![](data:image/png;base64...) + +1. Assume that each criteria has its own data type and condition list as well. Each condition, user can setup according filter value so that when user drag criteria to setup then filter value will be display based on selected data type and selected condition. + +#### Wireframe + +![](data:image/png;base64...) + +Figure 1 - Query builder + +![](data:image/png;base64...) + +Figure 1 – Rule criteria + +![](data:image/png;base64...) + +Figure 2- Drag criteria into Rule + +![](data:image/png;base64...) + +Figure 3 – Rule criteria screen after complete setup + +#### Business rules + +1. Each of these criteritions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_14). +2. OLS system will use Query Builder to build query for Rule Criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same campaign rule. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditions or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. User can put the key word to search criteria on Right Criteria panel. +3. Each criteria can be used one more time in the same campaign rule. +4. **Screen description:** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| | ![](data:image/png;base64...) | Click to add new criteria | Button | +| | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute. See more on #9. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. See more detail on #10. ![](data:image/png;base64...) | Action | +| | ![](data:image/png;base64...) | Click to delete criteria | Button | +| | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | Drop-down | +| | Criteria | **Criteria Structure:** **![](data:image/png;base64...)** **Take note:** Criteria is getting from Campaign Rule Criteria Definition API Operator follow by data type of each Criteria Input type is getting from Code_Management table by code type is “criteria-input-type”. Each operator have separately filter value | | + +1. **Right panel** + +In this phase, assume that all criteria has been defining as an attribute. We just focus on query builder for this scope. + +Assumed that data source of each drop-down filter field are defined as pre-condition === tbd=== + +Assumed that data sources which is used to verify whether the incoming transaction meet criteria/doesn’t are taking from data lake/ data warehouse instead get directly from DB as currenlty. That mean for TP proceed validate from incoming transaction with data lake instead directly take from DB as currently. ===TBD==== + +**Some use case for each criteia group:** + +| | | | +| --- | --- | --- | +| **Index** | **Use case** | **Criteria group** | +| | Transaciton is in A transaciton category is combination of more than one transaction criteria. This conditon checks whether the incoming transaction is in any selected Transaction Category. **Use case:** Requirement: On statement cycle: Dining txns, local currency + DCC -- award x1 Entertainment txns, local currency + DCC --award x2 Dining txns, foreign currency + not DCC -- award x3 Entertainment txns, foreign currency + DCC -- award x4 In existing implementation, we need to have separate counter ids for these 4 cases **So we need 4 rules to update the 4 counters.** If the 4 conditions are are captured as TxCats: TxCat1 TxCat1= Dining txns, local currency + DCC TxCat2 = Entertainment txns, local currency + DCC TxCat3 = Dining txns, foreign currency + not DCC TxCat4 = Entertainment txns, foreign currency + DCC We just need one Counter, Entity = Acct-TxCat We just need one CEP to extract the one counter and just need one award Rule, using F6 to fulfilment this requirement. | Transaction criteria | +| | Counter criteria. Note that the Counter criteria list is dynamic and is from Counter Definition with N bucket per each counter. That mean for each counter must include N criterions per each counter bucket (Current Bucket, Previous Bucket, 1 Period Befor Last….N Period Before Last). Since the Counter value is one numeric value, if one counter criterion is selected, then the operator should follow the operator listing of the Number data type. | Counter criteria | +| | Last Transaction Date Customer's Tenure Is Between Transaction was done in(Country, currency) | Transaction criteria | +| | MCC group Store group Chain group Corporation group | Transaction criteria | +| | ATG criteria | Account Criteria | +| | Attribute Criteria Note that the Attribute criteria list is dynamic and is from Attribute Definition. Each Attribute ID have separately data type therefore the operator of attribute ID should follow data type of selected Attribute. | Attribute Criteria | + +1. **Query builder structure** + +*For example:* + +*+ Account type criteria has data type as string and filter value is account type list from PRODUCT_ACCOUNT_TABLE.* + +*+ Transaction description criteia has data type as string but filter value is enterted by user.* + +*+ Counter criteria has data type as numberic and filter value is numeric attribute value from ATRIBUTE_VALUE table OR counter criteria can have filter value is fixed value which is entered by user.* + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Data type** | **Filter condition** | **Desciptions** | **Filter value Descriptions** | +| | String | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. For example: ![](data:image/png;base64...) | Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. | +| | Is NOT equal to (<> ) | This condition checks whether the comparison is not equal with the filter value. ![](data:image/png;base64...) | +| | Is empty ( NULL) | This condition checks whether the comparison value is empty. ![](data:image/png;base64...) | MUST not display filter value field and input type | +| | Is NOT empty (Not null) | This condition checks whether the comparison value is NOT empty. ![](data:image/png;base64...) | +| | Contains | This condition checks whether the comparison value contains the filter value. ![](data:image/png;base64...) | ~~Should be a textbox for filter value.~~ Depened on selected input type then input type of filter value may be text box or drop-down list. In case input type is “value”, use input tag for each filter value (in case multiple filter value). Use “\*” to match zero or more occurrences of the preceding subexpression (e.g. xy\*z could correspond to ~~"xz",~~ "xyz", "xyyz", etc.) Should not be case sensitive. For example ![](data:image/png;base64...) | +| | Does not contain | This condition checks whether the comparison value DOES NOT contain any filter value. ![](data:image/png;base64...) | +| | Is in | This condition checks whether the comparison value is in one of the filter value. ![](data:image/png;base64...) | 1. Depened on selected input type then input type of filter value may be text box or drop-down list. Should not be case sensitive. In case input type is “value”, use input tag for each filter value (in case multiple filter value) For example ![](data:image/png;base64...) 1. If filter value is drop-down then comparison value must be IN/NOT in selected list. | +| | Is NOT in | This condition checks whether the comparison value is NOT in all of the filter value. ![](data:image/png;base64...) | +| | Begins with | This conditon checks whether the comparison text begins with the filter value. ![](data:image/png;base64...) | In case input type is “value”, use input tag for each filter value ( in case multiple filter value) For example ![](data:image/png;base64...) Should not be case sensitive | +| | String | Ends with | This conditon checks whether the comparison text ends with the filter value. ![](data:image/png;base64...) | +| | Does not begin with | This conditon checks whether the comparison text does not begin with the filter value. ![](data:image/png;base64...) | +| | Does not end with | This conditon checks whether the comparison text does not end with the filter value. ![](data:image/png;base64...) | +| | NUMBER | Is equal to (=) | This condition checks whether the comparison value equal with the filter value. ![](data:image/png;base64...) | Filter value depened on selected input type One number filter value. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Is NOT equal to (<> ) | This condition checks whether the comparison value is NOT equal with the filter value. ![](data:image/png;base64...) | +| | Is less than (<) | This condition checks Comparison value is less than filter value. ![](data:image/png;base64...) | +| | Is equal to or less than (<=) | This condition checks whether the comparison value is less than or equal to filter value. ![](data:image/png;base64...) | +| | Is greater than (>) | This condition checks whether the comparison value is greater than filter value. ![](data:image/png;base64...) | +| | Is equal to or greater than (>=) | This condition checks whether the comparison value is greater than or equal to filter value. ![](data:image/png;base64...) | +| | Is between ( Min value <= X <= Max value) | This condition checks whether the comparison value is greater than or equal min filter value AND comparison value is less than or equal to max filter value. If Min value is not provided then this conditoon checks whether the comparison value is less than or equal Max filter value. If Max filter value is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) ![](data:image/png;base64...) | Both Min/Max filter value should be number value At least Min or Max filter value should be provided. **The assumption is that filter values can be entered by the user or selected from a drop-down list.** **E.g The number attribute list from Attribute Definition or a fixed value entered by the user** | +| | Date | Is on or before | This condition check whether the comparison date is less than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is on or after | This condition checks whether the comparison date is greater than or equal to filter date. ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time. | +| | Is between date range with date format parameter | * + - * 1. TTwo date picker fields specify the date range of the comparison value must be within in selected date. 1. Third dop-down field is “Date format to Use”. This field is used to locate the format of the comparison date and date range filer before compare. 2. The system will convert all of filter date value and comparison value into selected date format before compare. 3. If Min filter date is not provided then this condition checks whether the comparison date is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. The “Date format To Use” is used to locate the format of the comparison date and selected date before compare. * If DTU is Day of month (DD) or Month only (M) or Year only (Y) then just use day/month/year of the source date value and selected date to compare. * If DTU is Day and Month (DM) then just use day and month of the source date value and selected date to compare. * If DTU is Month and Year (MY) then just use Month and Year of the source date value and selected date to compare. * If DTU is Date (D) then use the source date value and selected date to compare * If DTU is Quarter (QY) then use the quarter (including year) of the comparision value and selected date to compare. * Some scenarios that use this operator as following: *For example 1: Account open date from 01/07/2023 to 31/08/2023.* ![](data:image/png;base64...) *For example 2: Customer’s birthday from Jul 01 to Jul 15* ![](data:image/png;base64...) | Both Min/Max filter value should be date value. At least Min or Max value should be provided. Date picker should be allow to choose past /current and in the future time. Max value should be greater than or equal to Min value. | +| | Is fixed date | This condition checks whether the comparison value is equal to filter value ![](data:image/png;base64...) | Fixed filter date. Date picker should be allow to choose past time/current time and in the future time | +| | Is null | The comparison value must be null value | There is no filter value | +| | Is not null | The comparison value must be null value | +| | Is betweenperiod from N (min to max value). | ![](data:image/png;base64...) **1.** This condition checks whether the comparison date (based on selected date format ) is in the time period required from "Compare with date" , where the period can be in days, months ,quarter or years ,as selected in the fourth drop-down field. **2.** The periods can be in future (aways) or in the past (ago) from “Compare with date”. **3.** Date format to use (DTU): The system will convert comparison value and “Compare with date” into selected date format before compare. * If DTU is Day of month (DOM) : Use day only for both source value and “compare with date” * If DTU is Month only (MO): Use Month only for both source value and “compare with date” * If DTU is quarter (QO) then use quarter (including year) for both source value and “compare with date”. e.g: sysdate is 20/05/2024 then use 01/04/2024 to process. * If DTU is Day and Month (DAM) Use day and month for both source value and “compare with date” e.g: Sysdate is 20/01/2024 then use “20/01” to process. * If DTU is Month and Year (MY) Use month and year for both source value and “compare with date”. e.g: Sysdate is 20/01/2024 then use “01/01/2024” to process. * If DTU is Date (DDMMYY) then use full value of source value (depend on selected criteria) and “compare with date. e.g AOD is 20/01/2024 then use “20/01/2024” to process Some examples to use this critera ***Example 1*** *: Post date is on 1 months ago from batch date* ![](data:image/png;base64...) ***Example 2****: Transacting Account Tenure Is Between 1 and 3 years* ago ( from transaction date) ![](data:image/png;base64...) ***Example 3: Next AOD Anniversary is on 10 days away. (From base date)*** ![](data:image/png;base64...) | * + - * 1. WWhen this condition is selected then Min/Max filter field , “Compare with date” drop-down,”Date format “ drop-down and “Period” drop-down are actived and required. Min/Max filter fields are two numeric input fields specify the number of periods. Max/Min value should be integer value. Max value should be equal to or greater than Min value. At least Min or Max value should be provided. 1. The first drop-down is “Compare with date”. This value is used to locate the date will be used to compare with the comparison date before check with period. **Following are compare with date list are avaliable for this condition:** + Base date (Depend on Effected base on in Rule configuration). + Sysdate + Transaction date + Post Date 1. The second drop-down is used to select the date format to use (DTU). The system will convert “Compare with date” value and comparasion date into selected date format before compare. Date format can be : + Day of month + Month only + Year only + Quarter only + Day and Month + Month and Year + Date 1. The next filed is Period drop-down. **Following are period list are avaliable for this condition:** + Days ago + Months ago + Quarters ago + Years ago + Days away + Months away + Quarters away + Years away 1. “Period unit” is applicable for each selection “Date format to use” fied as following link: | +| | Is the day of week | This condition checks whether the comparison date falls on selected day of the week. ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down that allow multipe from the list day of the week. | +| | Time | Is between | Two time picker fields specify the time range of the comparison value must be within in selected time. If Min filter date is not provided then this condition checks whether the comparison value is less than or equal to Max filter value. If Max filer date is not provided then this condition checks whether the comparison value is greater than or equal to Min filter value. ![](data:image/png;base64...) | Time picker should be allow to choose from 00:00 upto 23:59. At least Min and Max value should be provided. Max value should be greater than or equal to Min value. | +| | Boolean | Is | This condition checks whether the comparison value is equal selected filter value ![](data:image/png;base64...) | When this condition is selected then second field is a drop-down include TRUE/FALSE value. | + +#### Post-condition + +* 1. User able to proceed next step to complete campagin rule setup. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Campaign Rule Formula + +#### Requirement Definition + +1. All most campaign rule formulas are utilized to configure the reward formula that end-users will receive after completing a transaction. +2. Sometimes we was using campaing formula to update the counter value or attribute value as well. +3. In this version, we support Formula 7 as query builder form and introduce drag/drop UI for constructing rules. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +See more detail in attached file + +![](data:image/x-emf;base64...) + +![](data:image/x-emf;base64...) + +#### Post-condition + +#### Exception flow + +### Campaign Rule – Contributor Settings + +#### Requirement Definition + +1. In case Campaign Rule does not use the Rate Table, and the earning under the rule is to have funding contributors other than the Merchant of transaction (the retailer) then user use this step to bring up the list of Contributors configured for the Rule. +2. If the payment transaction triggers a reward (campaign rule), and if the merchant is contributing to the funding of the reward, then the merchant is also a “contributor” for that award transaction. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* 1. Campaign require a list of Contributors configured for the Rule. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update contributor of the rule. +2. The merchant as a “contributor” of the award transaction should availble on OLS system. + +#### Wireframe + +* + 1. Contributor setting + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +* + - 1. Contributor setting is the last step of campaign rule setting if Campaign Rule require a list of contributor for the rule. + +1. If Contributor required has not been defined, click on next step to bring up the Contributor setting is illustrated in section [Wireframe](#_Wireframe_1). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form; click on Edit button in the screen to bring ip the edit from as illustrated in section [Wireframe](#_Wireframe_1). +3. Screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Type** | +| | Contributor Detail / Chi tiết phân bổ chi phí | This is the Contributor setting panel header. | Display | +| | Add a Contributor/ Thêm mới | This is the edit row for defining a Contributor’s percentage | Button | +| | Contributor\*/ Đơn vị phân bổ | Selecting the Contributor | Drop-down Select one Look up value from Chain screen (Chain table). Refer “Chain” API under Merchant Management. | +| | Contributor Percentage\*/ Phần trăm phân bổ | Entering the Contribution Percentage | 9(5, 2) Should be greater than 0 if provided | +| | Absorb Remainder \*/ Hấp thụ số dư còn lại | Selecting whether this Contributor is to absorb any remainder (TRUE or FALSE) after allocating the amounts by percentage to other Contributors. | Swich button Default OFF | +| | ![](data:image/png;base64...) | Clicking Click on the “![](data:image/png;base64...)” icon removes the Contributor row | Button | + +1. The total contribution must be 100%. +2. Contributor must be uinique on each campaign rule. +3. If contributors are configured then must have one and only one contributor is “absord remider”. +4. If there is no contributor configured for the Rule then the Chain of the incoming transaction is also a “contributor” for that award transaction. ( Default as Absorb Remainder) + +#### Post-condition + +* TP posted transaction based on contributor setting. The transaction is split into each Contributor for that transaction. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Counter Extract & Process (CEP) Request + +#### Requirement Definition + +* + - 1. Some campaigns require the spend or count (number of transactions) to be accumulated over a period of time and then the total at the end of the period is used to compute the reward entitlement. Such a campaign requires a rule to accumulate spend in a counter, and at the end of each month a rule to use the total spend for the month in the counter to calculate the reward.Such a campaign would involve setting up an accumulation rule (Rule Type = Counter Update), a Rule to extract the Counter based which to form the transaction to compute the award amount (Counter Extract and Process or CEP Rule), and the award/Redeem Rule for specifying the award computation formula. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update CEP Rule. +2. All drop-down value must avaiable in the system. + +#### Wireframe + +Please refer figma to get more detail. + +#### Business rules + +* + - 1. CEP is one of rule type of Campaign Rule. CEP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Counter Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to brings up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is CEP, the following is displayed for specifying parameters based on which to extract the Counter values and to form transactions for triggering award Rules: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of CEP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Log transaction under this store\*/ Ghi nhận giao dịch cho cửa hàng/đơn vị | This value will be defaulted to the "Merchant". All award and adjust transactions arising from this Rule will be logged with this Store as the merchant | Drop-down. Select one. Lookup data from "Store" table. Refer "Store" API under Merchant Management | +| | Counter to extract \*/ Kết xuất từ bộ đếm | The counter to extract, the value of which is to be used as the Transaction Amount in the Formula in this Rule | Drop-down. Select one. Lookup value from "Counter_Definition" table. Refer "Counter Definition" API under Campaign Management | +| | Bucket to extract \*/Kết xuất từ kho | The choices are: - Current Bucket (default) – will extract the latest bucket of the Counter - Previous Bucket – will extract the bucket ending the previous period, where the period is as defined in the Run Schedule - Period before Last – will extract the bucket ending the period before the last period, where the period is as defined in the Run Schedule Bucket value extracted is used as transaction amount in award Formula | Drop-down.Select one. Lookup data from "Code_Management" table where code type is "counter-bucket". Refer "get-by-code-type" API under master data | +| | Rule type to process\*/ Loại quy tắc chiến dịch sử dụng | The transaction formed with the parameters in this CEP request are posted with this to system locates the rule type to process | Drop-down. Select one. Lookup value from "Code_Management" table where code type is "cep-trigger-rule-type". Refer "get-by-code-type" API under master data | +| | Transaction Code \*/Mã giao dịch | The transaction formed with the parameters in this CEP request are posted with this TC: system locates selected trigger Rules linked to this TC to process | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the counter value extracted (Counter to Extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Account with blocked Card / | The extracted Counters for generating transactions to process will include Counters of PA with Blocked Code or not, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Include** Refer “get-by-code-type” API under master data where code type is “cep-ac-block-card” | +| | Account with No Counter in Period | The extracted Counters for generating transactions to process will include a record for PA with no Counter Bucket and with Counter Bucket of balance 0, depending on the selection in this field. The default is to include. **Condition filed.** **This filed just be actived and required when Account entity counter OR Card entity counter is extracted.** | Radio button **Default Exclude** Refer “get-by-code-type” API under master data where code type is “cep-ac -no-counter”. | +| | Post Transactions under PA Account selected based on | **If Counter is a customer-centric Counter and there are multiple PA Types included in the counter bucket extraction**, the PA Type to use in the transaction posting can be selected based on the any of the following: * Account with most recent customer-initiated transaction * Account with highest spend in the past month + month-to-date * Account with lowest spend in the past month + month-to-date * Account based on ATG of Pool **Note: This is conditon filed. Just be actived and required if customer entity counter is extracted.** | Drop-down Select one Refer “get-by-code-type” API under master data where code type is “cep-ac-posted”. | +| | Execution Sequence Number /Thứ tự thi hành | The execution sequence to get the priority to run request. | 9(4) Should be greater than 0 if provided | +| | **Run schedule**: CEP Rules are evaluated for execution by a CEP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by CEP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle Lookup value from “Code_Management” table where type code is ‘Cep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: Text box with HH:MM format. | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. Refer “get-by-code-type”API under master data where code type is “month-of-year”. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. . . - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle | * + - 1. This option includes following fields: - Time of day to excute request\*: This field is time format field. If CEP run as an offline job then it is not used in OLS. 2. CEP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N days after AOD | * + - 1. This option includes following fields: - N parameter: CEP Batch extracts Counter on N days after the **AOD** of the Account. 9(2) format for N parameter. - Time of day to excute request\*: The time to CEP batch job running to trigger this request. This field is time format field. If CEP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +1. The following is a decision matrix for the possible combinations of “Counter Bucket to Extract” & “Run Schedule” for CEP batch job, where the following notation is used: + 1. “Current Bucket” is the Bucket with the earliest ED greater than the current processing date ==tbd== + 2. “Previous Bucket” is the Bucket with the latest ED smaller than the current processing date ==tbd== + 3. “Bucket Before Previous” is the Bucket with the latest ED smaller than the Previous Bucket ED==tbd== + +| | | | | +| --- | --- | --- | --- | +| | **Counter Bucket To Extract** | | | +| **Run Schedule Choice** | **Current** | **Previous** | **Period Before Last** | +| * Daily | Extract Current Bucket where State = C or is NULL. | Extract Previous Bucket where State = C or is NULL | Extract Bucket Before Previous, where State = C or is NULL | +| * Monthly on Day N of Month | +| * Statement Cycle Date | +| * N Days after AOD | +| * Annually, on Day N of Month M | + +* 1. In all cases, if there is no batch run on the scheduled day, the batch is executed the next day on which there is an end-of-day batch run + 2. Counter state is update when CEP extract based on Counter definition setup : + + If counter state is update on aware then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “A” if CEP rule hit CP rule. + + If counter state is update on extract then to avoid extracting the same Bucket again in the next run, the rules triggered by the CEP transaction must update the State of the extracted Bucket from “C” to “E” if CEP trigger CP rule regardess hit campaign rule or not. + + If counter state is never updated then even CEP extract and hit CP rule then counter state still is C. + +#### Exception flow + +N/A + +### Redemption Extract & Process (REP) Rule + +#### Requirement Definition + +1. Some campaigns require the reward amount is tracked in a dedicated Pool which is then redeemed and extracted as a cash rebate or partner points (e.g. frequent flyer miles) and output to be credited into a receiving account. +2. This is done using a Rule that is designed to “Redeem, Extract & Process” – i.e. and REP rule. +3. An REP Rule is added to the Campaign by selecting Rule Type as “REP” when adding the Rule in a Campaign set-up. + +#### Process flow + +#### Trigger + +* + - 1. The campaigns require the system automation extract the pool balances. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/update REP Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +* + - 1. Please help to refer on the figma. + +#### Business rules + +* + - 1. REP is one of rule type of Campaign Rule. REP Rule can be created/updated under Campaign Moduel as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Redeem Extract and Process" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is REP, the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: Generation information.** This step setup the generation information of REP rule and mandatory step. Don't. Next step is blocked if all required field in this step are not provided | | | | +| | Campaign ID\*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under selected campaign. Drop-down list if create from separately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | Counter Extract & Process [CEP] | Display. Refer "get-by-code-type" API under master data with code type is"rule-type" | +| | Effective From Date \*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date(depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period” | Date The date format must adhere to the configured format | +| | Effective To Date\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date The date format must adhere to the configured format | +| **Step 2: Rule setting** | | | | +| | Pool to Extract\*/Pool kết xuất | Pool to redeem for output as cash rebate or points posting to Destination Account. * The full amount of the Pool balance is deducted from the Pool and output to the destination account or system. For campaigns where the reward is extracted and output to destination account on a scheduled basis, a separate Pool should be defined for each Campaign. | Drop-down Select one Lookup value from”Pool_Definition” table. Refer “Pool Definition”API under Campaign Management | +| | Minimum Pool Balance | This is an optional field which defines the minimum number of points that a Pool must have before it is to be redeemed by the REP Batch. | 9(12,2) Should be greater than 0 if provided | +| | Trigger Campaign rule | This option to allow REP rule trigger Campaign Rule to check criterion and computer the balance to extract If trigger CP rule option then REP will trigger redeem rule type for criterion validation and the balance to extract is smallest value of available balance and formula result. | Switch button Default OFF | +| | Redeem TC\* | Select TC under which to post this redemption. | Drop-down Select one Lookup value from “Transaction_Code”table Refer “OLS Transaction Code” API under Campaign Management | +| | Redeem Transaction Description\* | The text to be used in the redemption transaction record Description field. | X(50) | +| | Log Transactions Under This Store\* | The redemption transaction generated by this Rule must be logged with a Store id, based on this selection | Drop-down Select one Lookup value from “Store” API | +| | -ve Bal. Adjust. Transaction Code/Mã giao dịch điều chỉnh âm | In the event the balance value extracted (pool balance to extract) is negative, it will be posted as a negative adjustment if this TC is provided, based on the Rule linked to this TC | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer to "OLS Transaction Code" API under Campaign Management | +| | Adjustment Transaction Reason/ Lí lo điều chỉnh | Condition field. This field is actived and required when Adjust TC is selected | Drop-down Select one Lookup value from "Reason_code" table. Refer "Reason Code"API under Code maintenance | +| | Adjustment Transaction Description/ Mô tả giao dịch điều chỉnh | The transaction description of negative adjustment transaction Condition field. This field is actived and required when Adjust TC is selected | X(50) | +| | Output Redemption As/ | This drop-down contains the list of output types pre-configured in the REP batch properties file. The drop-down text describes the output to be generated from the redemption data. The currently supported outputs are: | | | | --- | --- | | **Output Type** | **File ID** | | * Cash Rebate to Exteranl System | OLSCRTXN | | Drop-down Select one Lookup value from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “output-red-channel”. =tbd== | +| | **Run schedule**: REP Rules are evaluated for execution by a REP Batch which is scheduled to run every day as part of the end-of-day batch stream. This parameter determines when this Rule will be executed by REP Batch The tabs are: Day – Month – Annulaly – N days after AOD – Statement Cycle – N months of AOD Lookup value from “Code_Management” table where type code is ‘rep-run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master | | | +| | Day | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 50. This is select one field. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n day at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “daily-repeat”. **Time of day to excute request**: | +| | Month | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n month where n from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Last day of month: This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occur on every n month on each selected day of the month and at the selected time. | **Repeat every**: Drop-down Select one Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “monthly-repeat”. **Day of month**: Drop –down Multiple select Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Annually/Hàng năm | ![](data:image/png;base64...) * + - 1. This option includes following fields: - Repeat every\*: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year\*: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month\*: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31 - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. Request will occurred every n year on the selected day and selected month. | **Repeat every**: Get data from “Code_Management” table. Refer “get-by-code-type” API under master data with code type is “yearly-repeat”. **Month of year** Drop –down Select one Hardcoding from 1- 12. **Day of month**: Drop –down Select one Hardcoding from 1- 31. **Time of day to excute request**: Text box with HH:MM format | +| | Statement Cycle /Kì sao kê | * + - 1. This option includes following fields: - Time of day to excute request\*: The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 2. REP Batch extracts specified Counter on days when there is a Statement output and extracts only accounts which were statemented on that day, evaluates the value against the award Rule and adds the award to Pool in award Rule. =tbd== | **Time of day to excute request**: Text box with HH:MM format | +| | N day after AOD/N ngày sau khi mở tài khoản | * + - 1. This option includes following fields: - N parameter: REP Batch extracts Counter during the end-of-day batch for all PA N days after the **AOD** of the PA. 9(2) format for N parameter. - Time of day to excute request: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. 1. =TBD== | **Time of day to excute request**: Text box with HH:MM format | +| | N months from AOD/N tháng từ ngày mở tài khoản | This option includes following fields: * + - N parameter\*: REP Batch extracts balance during the end-of-day batch for all Account after N months from the **AOD** of the Account. - Time of day to excute request\*: There are 2 drop-down to select hour from 0 upto 23 and minutues from 00 upto 59. The time to REP batch job running to trigger this request. This field is time format field. If REP run as an offline job then it is not used in OLS. | **N param** 9(2): Should be greater than or equal to 0 if provided **Time of day to excute request**: Text box with HH:MM format | + +#### Post-condition + +REP batch job extract balance based on REP rule type configure. + +=tbd== + +#### Exception flow + +### Item Redemtion Rule Type (ITRD) + +#### Requirement Definition + +Item redemption Rule Type is used to to evaluate item redemption transactions. + +The same approach as Award rule to evaluate the inputted data but there is no reward pool, formula and contributor on this rule type. + +Redemption pool which be used to redeem wil be configured in item price instead. + +#### Process flow + +Update later + +#### Trigger + +If you want to perform an item redemption transaction in the OLS, then an Item Redemption Rule must be created. + +#### Pre-Condition + +1. User have to have the access right in the Campaing Rule moudle to can add/modify Item Redemption Rule. +2. All drop-down value must available in the system. + +#### Wireframe + +Please refer Award Rule Type. + +#### Business rules + +* + - 1. ITRD is one of rule type of Campaign Rule. ITRD Rule can be created/updated under Campaign module as a parr of campaign or Create from "Campaign Rule" screen under "Campaign Management" module. + 2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the create form. User must to choose"Item Redemption" Rule type to go to next step. If Rule type is not selected user must to select existing template to continue otherwise "Next" botton is disbale". + 3. Click on Edit button in the screen to bring up the edit from as illustrated in section Wireframe. When the Rule Type in the Rule Header is Item Redemption , the following is displayed for specifying parameters based on which to extract the balane value: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: General information** | | | | +| | Campaign ID \*/ Mã chiến dịch | The Id and Campaign Name of the campaign to which this Rule belongs | Display if rule under campaign module. Drop-down if create fromseparately screen. Lookup value from Campaign Table. Refer to "Campaign"API under Campaign Management | +| | Campaign Rule ID\*/Mã quy tắc chiến dịch | Rule identifier. Support system-generated. For reference only | X(10) | +| | Campaign Rule Name\*/Tên quy tắc chiến dịch | Name of this Rule, for easy user reference | X(50) | +| | Description/ Mô tả | Long description of this Rule, for user reference | X(500) | +| | Rule Type\*/ Loại quy tắc | The rule type which user selected on step 0 | Display | +| | Effective Date From\*/ Ngày bắt đầu hiệu lực | Apply this rule only to transactions with Transaction Date/Post Date (depended on effect rule based on between the Start and End Dates (inclusive) – the “Effective Period”. | Date | +| | Effective Date To\*/Ngày hiệu lực kết thúc | All “Effective Periods” defined by “Start Date” and “End Date” always start at 00:00:00 and end at 23:59:59 midnight of the respective dates. To date must equal or greater than from date | Date | +| **Step 2: Rule setting :** If madatory fields in step 1 are not provided then step 2 is blocked **Rule Detail** | | | | +| | Effective Period is Based On\*/ Hiệu lực dựa trên | Determining whether the transaction being processed is within the Rule Effective Period is by using either the Transaction Date in the transaction data, or the system batch date (which is used as the Post Date for transaction processed during the day) | Radio button. Default "Transaction Date". Lookup value from "Code_Management" table. Refer to "get-by-code-type" API under master data with code type is "date-to-use-txn" | +| | Message Template ID/Mẫu tin nhắn | Message template containing the message text for sending an SMS or Email if this Rule is hit (depending on the template type) or to return the text from the message template in the response message to and online request. The message templates support a range of placeholders including all data elements in the transaction context, Customer and Account records | Drop-down. Select one API: =tbd= | +| | Stop if criteria met/Dừng tặng thưởng khi thỏa mãn điều kiện | If this is selected to Yes, the current transaction will not be processed against other Rules linked to the TC of the current transaction if the criteria in this Rule are met. | Switch botton. Defaut OFF | +| | **Link Transaction Code** * + 1. At least one transaction code must be provided 2. On the same campaign rule ID then transaction code must be unique 3. One the same combination of Rule Type and Transaction Code then Execution Sequence must be unique. In this part the system support “Quick add” feature for Transaction Code to allow a more efficient way to set up rules | | | +| | Add linked transaction code/Thêm mới mã giao dịch liên kết | Click on “Add” button to add linked TC to the rule. Multiple TCs can be linked to the Rule. TCs can be removed from the panel by clicking on the delete button. | Button | +| | Transaction Code\*/Mã giao dịch | This field is for selecting the Transaction Code to trigger this Rule. When a TC is selected, all Rules linked to the TC, if any, will be listed in the panel “View Other Rules linked selected TC”, together with the current Rule, in the Execution Sequence number order. Take note that TC must be unique on each Campaign Rule | Drop-down. Select one. Lookup value from "Transaction_Code" table. Refer "OLS Transaction Code" API under Campaign Management | +| | Execution Sequence\*/Trình tự thi hành | Execution Sequence of the Campaign Rule. | 9(04) Should be greater than 0 if provided | +| | View Other Rules linked Selected TC | Click on this option to view all Active Campaign Rule in the system which under the same Rule type linked to the transaction code. | | | | | --- | --- | --- | | **Field (EN/VN)** | **Description** | **Data type** | | Listing page order by Execution Sequence descring. Support paging also | | | | Rule ID/ Mã quy tắc | Campaign Rule ID linked to | Display Refer “Find Campaign Rule Linked By TxnCode” API under Campaign Rule API | | Rule Name/ Tên quy tắc | Name of Campaign Rule | Display Refer “Campaign Rule “API to get rule name. | | Execution Sequence | Excusion sequence of campaign rule | Dislay as format number | | Hyperlink | +| | Add new transaction code/ Thêm mới mã giao dịch | Quick add feature to support user add Transaciton Code from this screen. The new transaction will be automatiom approved when campaign rule is approved | Button | +| **Step 3: Rule Criteria :** The same approach as Award rule Refer to section 4.13 [Campaign Rule Criteria](#_Campaign_Rule_Criteria_1) | | | | + +#### Post-condition + +To post item redemption transaction, the item redemption transaction have to pass validation of Item Redemption Rule which linked to the Redemption Transaction code, otherwise the transaction is failed. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Transaction Rule Analysis (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + +### Campaign Insight + +#### Requirement Definition + +* + - 1. Campaign Insight enables to combine data from across multiple data source into single chart in order to track and display customer/campaign activities clearly. + +#### Process flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have the access right on Campaign Insight module to asssess to these dashboards. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Clicking on the chart icon at the top of the main Campaign list page will toggle between the Campaign list view and the Campaign Insight view. +2. Campaign Insight update constantly, giving user a real-time view of customer behavior, campaign activities. +3. Click “Campaign Insight” in the menu on OLS ‘s main menu. In the top right-hand on each dashboard enter/select the filter key to generate chart/graph. +4. OLS support following chart: + +##### Top 10 Best customer of the campaign + +* + - * 1. This chart show the total point earn of each customer (on top 10 ) on each selected period of selected campaign. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter key** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table. Refer to “Campaign API” under Campaign Management. Default empty. If Campaign is not provided then get top 10 customer of whole system. | +| | Period | This is drop-down filter key Optional and select one only OLS support following periods: * + 1. This week 2. This month 3. Last month 4. This quarter 5. This year Default as “This month” If period is not selected then get data of whole system. | +| **Layout:** ![](data:image/png;base64...) | | | +| | Customer information | Display top N customer including bellow information: * + 1. Top customer / 2. Customer full name and Registration date 3. CIF Number 4. Total earned point on selected period | +| | View all | Use scroll bar to view full list top 10 best customer. | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” of selected campaign to determine the top 10 customer who got top 10 earned point on each period. Pool type should be point pool only…==TBD=== Use transaction date to determine period. | | + +##### Number of enrrolled customers not - eligible because of criteria + +This chart display total number of enrolled customers not -eligible campaing rule on each error code during each selected month. + +Dashboard descriptions + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | +| **I: Layout 1** ![](data:image/png;base64...) | | | | +| **Filter key** | | | | +| | Campaign | | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | +| | Period | | Last 12 months | +| **Layout description** | | | | +| | Vertical axis | | Fixed 12 last months from currenlty month. Currently month on the top of chart. | +| | Horizontal axis | | Total number of enrolled customers not-eligible because of criteria. Use differernce colors to distinguish the difference erorr code on the same month. Should have the description for each error code. Hover over the bar graph to view a count of customers for the error code defined | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use Transaction date time of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | +| **II : Layout 2** ![](data:image/png;base64...) | | | | +| **Filter** | | | | +| | Campaign | This is a drop-down filter key. Mandatory field and allow select one only. Lookup active campagin from Campaign table If Campaign is not provided then get data of whole system. | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) Default as “This month” | | +| **Layout description** | | | | +| | Vertical axis | Total number of enrolled customers not-eligible because of criteria. Each error is separaty column in the chart. Use differernce colors to distinguish the difference months on the same error in case “Last 3 months” is selected”. Hover over the bar graph to view a count of customers for the error code defined | | +| | Horizontal axis | Error code Should have the description for each error code when move mouse on the chart. | | +| **Data source** | | | | +| | Get data from OLS_ORPHAN_TXN_NO_HIT table for selected campaign to determine the customer enroll in each month but did not get award because of criteira. The customer should have all transactions which did not hit any award rule (The rule get award points) on this campaign. Use last_update_date of OLS_ORPHAN_TXN_NO_HIT table to determine period. | | | + +##### Number of enrolled customers eligibe vs not- eligible because of criteria + +This chart display total number of enrolled customers: not -eligible campaing rule vs eligible campaign rule during each selected month. + +1. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Descriptions** | +| **Filter** | | | +| | Campaign | This is a drop-down filter key. Optional field and allow multiple select Lookup active campagin from Campaign table If Campaign is not selected then get all campaigns. | +| | Period | Last 12 months | +| **Layout:** ![](data:image/png;base64...) | | | +| | Vertical axis | Total customer. We have 2 areas, one for enrolled customer eligible and other one for erolled customer not -eligible. Hover over the line graph to view a count of customers for the date range/time frame defined | +| | Horizontal axis | Fixed last 12 months from curenlty month. Curently month on the right side. | +| **Data source** | | | +| | Get data from TRANSACTIONs table to get total number of enrolled customers eligible of selected campaign per each months. Get data from OLS_ORPHAN_TXN_NO_HIT table to get the total number of enrolled customers NOT-eligible of selected CP per each month. Should there is no customer in intersection of eligible and Not- eligible | | + +##### Earned points Vs redemmed points + +* + 1. This chart used to compare total earned point with total redeemed point during each selected period. + 2. Dashboard description + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months (including curently month) 4. Last 12 months Default as “This month” | +| **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | +| | Vertical axis | Total point each selected period. Green line for earned point and red line for redemmed points. | +| | Horizontal axis | Condition data. If Period “Last 12 months” is selected then horizontal axis is including last 12 months from currently month. Total point will be monthly total point If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “ Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points for the date range/time frame defined | +| **Data source** | | | +| | Get data from TRANSACTIONS table with transaction type = “Award” for earned point /Transaction type = “Redeem” for redemmed point during each selected month. The transaction should be not cancellation. Use transaction date to determine period. | | + +##### Redemptions point on each channel + +* + - * 1. This chart allow user can see that awared points used for wich purpose: Which channel user customer use to redeem point month. The fluctuation of redeemed point with previous month to user can change the campaign stratery to meet customer’s behaviors. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Icon ![](data:image/png;base64...) | Icon for each channel: Item redemption Automation redemption Pay with Points. | +| | Total redemmed points and rate ![](data:image/png;base64...) | #1: Total redemmed points on each channel and Percentage on total redemmed points of all 3 channels. #2: Percentage increase /descrese of redemmed poins which is compared with previous month on each chanel. Red color if #1 less than previous month Ograne color if no change on the ratio between 2 months. Green color if greater than previous month. Take note that “This month” will compare with last month and “Last month’ will compare with before last month. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table for item redemption. Get data from TRANSACTIONS table which posted by REP for Automation redemption. Get data from TRANSACTIONS table which assigned as PwP transactions for Pay with Points . Use transaciton date to determine period. | | + +##### Redemption on each item type + +* + - * 1. This chart allow user can see that awared points used for wich purpose. How many item to be redemmed and the best item which customer prefer to redeem each period: Currently month OR last month. Therefore user can base on this to understand customer’s behaviors and customer’s habit. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter** | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total redemmed points Use Bar chart to describe redemmed points per each item type. | +| | Right vertical axis | Total redemption quantity. Use line chart to describe redemption quantity per each item type | +| | Horizontal axis | Item type list which is redemmed on this period. Hover over the line graph to view a count of Redemmed quantity for the each item type. Hover over the bar graph to view a count of redeemed points for the each item type. | +| **Data source** | | | +| | Get data from CAT_CATALOGUE_TRANS_DETAILS table to get total redemmed point and total quanity per each item type. Use transaction date time do determine period. Period based on sysmonth | | + +##### Customer’s activities + +* + - * 1. This dashboard describes the fluctuation of total number of new customer vs churn customer on each month. Based on this chart user can see have/should have implemented a solutution to reduce the churn. + 2. **Dashboard descriptions** + +| | | | +| --- | --- | --- | +| **Index** | **Field** | **Description** | +| **Filter** | | | +| | Month | Last 12 months | +| **Layout** ![](data:image/png;base64...) | | | +| | Left vertical axis | Total number of customers. Per each month we have 2 cloumns : Green column for new customer and Orange column for churn customer. | +| | Right vertical axis | The line chart will describe the customer churn rate. The units of measurement is percentage. | +| | Horizontal axis | Fixed 12 last months from currenlty month. Curently month on the right side. | +| **Data source** | | | +| | New customer = New customer added in OLS system Churn customer = The customer unactive in OLS system Customer churn rate = Number of customer churn /Total customer (including new and churn customer) Use Last_update_date in OLS system to determine period. | | + +##### Campagin statistic + +* 1. Use this dashboard to measure the impact of existing campaigns. The information available on the Campaign Statistics screen helps users analyze where you can make campaign changes to improve results. + 2. Dashboard descriptions + +| | | | +| --- | --- | --- | +| **Index** | **Filed** | **Description** | +| **Filter: Just use for detail listing only** | | | +| | Campaign | This is a drop-down filter key. Optional and allow multiple select. Lookup active campagin from Campaign table Default empty. If Campaign is not provided then get data of whole system. | +| | Period | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. This quarter 4. This year 5. Select custom data Default as “This month” | +| **Layout** ![](data:image/png;base64...) | | | +| | Campagin statistic ![](data:image/png;base64...) | This part display some following indicators: * + 1. Total Campaigns: Total availble campaign in the system 2. Total customer: Total number of enrroled customer. 3. Total new customers on this day. 4. Total spending: Total nett amount for all purchase transactions on these campaigns. 5. Total cash rebate: Total cash rebate which customer got when errolled these campaigns. 6. Total awarded point: Total uni point which customer got when errolled these campaigns. These above value are updated realtime base one sysdatetime. | +| | Detail listing ![](data:image/png;base64...) | * This part includes following fields: + 1. Campaign ID: From selected Campaign 2. Target total spending value: From Campaign’s configuration 3. Actual total spending: Total nett transaction amount 4. Target Active Customer Count: From Campaign ‘s configuration 5. Actual Customer Count: Total number of enrolled customers. 6. New customer: Total number of new enrolled customer on this day. 7. Total rewarded points: Total earned points. * When click on each Campaign ID, the system will bring up to Campaign detail Screen. * Implement scroll bar and paging for campaign listing. | +| **Data source** | | | +| | Get data from TRANSACTIONs table for number of customers/ total spending and awarded points Get data from CAMPAIGN table for target value. Use transaciton date to determine period. | | + +#### Post-condition + +* + 1. User can use these charts to decide the campaign strategy to meet customer’s demand. + +#### Exception flow + +N/A + +### One tester (HAVE TO BE ADDED) + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow + diff --git a/docs/specs/archive/onecatalogue.md b/docs/staging/structured/catalogue/catalogue.md similarity index 89% rename from docs/specs/archive/onecatalogue.md rename to docs/staging/structured/catalogue/catalogue.md index 5a414bc..8750c7a 100644 --- a/docs/specs/archive/onecatalogue.md +++ b/docs/staging/structured/catalogue/catalogue.md @@ -1,377 +1,372 @@ ---- -title: "OneCatalogue" -type: OpenSpec -status: Draft ---- -# OneCatalogue - -## About Redemption Item in OLS system - -### Overview - -1. The catalogue is used to set up items for online (web site, Mobile App) redemptions. -2. Redemption items such as Cash-back rebates, frequent flyer miles conversion and merchant vouchers can be set up in the redemption catalogue. -3. Front-end systems access the catalogue through web services to display available items. -4. Front-end systems accept user requests to redeem and send these requests to OLS for authorization (deduction of the relevant points) and to generate the fulfilment files for sending to designated recipient systems. -5. Catalogues are managed through the browser-based administration screens, which update the catalogue in real-time. Once “Approved” the item is available commencing on the Start Date. -6. Functions include adding catalogues to the system, adding items to catalogues, setting price rules and processing redemption requests from front-end systems. -7. OLS also provides an administration function for back-office staff to redeem items through the administration screens directly on behalf of customers. - -## Catalogue - -### Requirement Definition - -* + - 1. A Catalogue must be defined and all items to be included in the Catalogue must be tagged with the Catalogue code before customers access the items. - 2. A Catalogue code is tagged against each Item Master record. - 3. More than one Catalogue can be configured at the same time, but each Catalogue must have its own set of Item master records. - 4. Each Catalogue has a Start / End date range and items in the Catalogue will be picked for presentation to customer only if the current date falls in the Start / End date range for that Catalogue. - -### Process Flow - -==tbd== - -### Trigger - -* + - * 1. If an item is to be tagged to a Catalouge that has not yet been defined. - -### Pre-Conditions - -1. Users have to have access rights in “Catalogue” screen under “OneCatalouge” module. -2. Depending on the user's access rights, they can view, add, edit, or approve catalogue records. - -### Wireframe - -[Image Removed] - -### Business Rules - -1. Click on Catalouge icon in navigation panel under OneCatalouge to get a listing of existing catalogs. -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Catalouge is illustrated in section 7.2.5. -3. **Descriptions** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **General Information /Thông tin chung** | | | | -| | Catalogue Code \*/Mã nhóm danh mục | User-specified code identifying the catalogue. Used by front-end system when requesting for item information. | ~~X(20)~~ X(10) | -| | Description\*/ Mô tả | A description of this catalogue. For user reference only. Default description which will be used in case there is no specific description for chosen language. | X(50) | -| | Effective From Date \*/Có hiệu lực từ ngày | Catalogue is effective only when the processing date is between Start Date and End Date, inclusive. | Date | -| | Effective To Date \*/Có hiệu lực đến ngày | Date | -| | Icon/ Biểu tượng | Allow to upload/remove the icon of catalogue | Image | -| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | -| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | -| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | -| | Description\*/Mô tả | A description of this catalogue. For user reference on MP only. | X(100) | - -### Post- Conditon - -The Catalouge information for each item can be returned to the front-end during an Item Enquiry response message for the front-end to use in searching the catalogue for items. - -### Exception Flow - -N/A - -## Category - -### Requirement Definition - -A catalog is the main folder to organize categories and items for materials. A category is a group within a catalog that contains items. All items to be included in the Catalogue must be tagged with the Category code. Multiple Categories can be linked to form a hierarchy of categories. The hierarchy of categories is used on Member site. - -### Process Flow - -### Trigger - -If an item is to be tagged to a catagory that has not yet been defined. - -### Pre-Conditions - -1. Users have to have access rights in “Category” screen under “OneCatalouge” module. -2. Depending on the user's access rights, they can view, add, edit, or approve category records. - -### Wireframe - -[Image Removed] - -### Business Rules - -1. Click on the category icon in the navigation panel under OneCatalouge to get a listing of existing catalogues. -2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the category is illustrated in section 7.3.4. -3. **Descriptions** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **General Information /Thông tin Chung** | | | | -| | Category Code \*/Mã danh mục vật phẩm | User-specified code identifying the category. Used by front-end system when requesting item information. | ~~X(20)~~ X(10) | -| | Description\*/ Mô tả | A description of this category. For user reference only. Default description which will be used in case there is no specific description for the chosen language. | X(100) | -| | Effective From Date /Có hiệu lực từ ngày | Category is effective only when the processing date is between the Start Date and the End Date, inclusive. If an effective date is not provided then this is a non-expire category. | Date | -| | Effective To Date /Có hiệu lực đến ngày | Date | -| | Parent Category | Multiple Categories can be linked to form a hierarchy of categories. | Drop-down Select one The parent categories value from master data. | -| | Display Ordering /Thứ tự hiển thi | The display ordering sequence on the Member Site. | 9(3) | -| | Icon/ Biểu tượng | Allow to upload/remove the icon of the category. | Image | -| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | -| | Image /Ảnh vật phẩm | Condition field This field is only active and required when the image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | -| | Preview | Preview of selected image | Image | -| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | -| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | -| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | -| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | -| | Description\*/Mô tả | A description of this category in the choosen language. For user reference on MP only. | X(100) | - -### Post –Condition - -### Exception Flow - -## Item master - -### Requirement Definition - -Describe details about a particular item: e.g. prices, quantities, availability dates, terms and conditions, etc. Item Master Records cannot be created unless the Stock Code is in place. - -### Process Flow - -### Trigger - -New items need to be defined. - -### Pre –Condition - -1. Users have to have access rights in the “Item Master” screen under the “OneCatalouge” module. -2. Depending on the user's access rights, they can view, add, edit, or approve Item Master records. - -### Wireframe - -[Image Removed] - -### Business Rules - -1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing catalogs. -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Master is illustrated in section 7.4.4 -3. **Description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **General information: Mandatory Step** | | | | -| | Catalogue Code\*/Nhóm vật phẩm | The Catalogue for which this item is being configured. | Drop-down Select one | -| | Category/Danh mục vật phẩm | Select the category under which this item is to be tagged, to facilitate searching in the customer-facing page – e.g. Retailer Vouchers, Frequent Flyer Points, Cash Rebate, etc. | Drop-down Multiples select | -| | Item Code\*/Mã vật phẩm | Enter the item code to be added to the catalogue. This is Item identify. | X(10) | -| | Item Name \*/Tên vật phẩm | Short description field used by customer-facing application for display for Catalogue item. The text can include control characters. This is default name in case there is no specific item name of chosen language in the member site. | X(50) | -| | Redemption From Date From\*/Có hiệu lực từ ngày | “**From Date**” & “**To Date**” specify the period within this item is available and may be included in the Catalogue display and when after which it becomes unavailable and is excluded from the Catalogue display. OLS will reject the Start Date and End Date if they are outside the Catalogue/Category Start Date and End Date period. Once the item has been started for redemption, only End date will be allowed to modify. | Date | -| | Redemption To Date \*/ Có hiệu lực đến ngày | Date | -| | Redemption Store /Đối tác | Supplier of this item. The merchant (Store) that has to be configured appropriately in order for straight-through settlement processing. | Drop-down Select one | -| | Redemption Transaction Code\*/Mã giao dịch đổi thưởng | OLS TC used for redemption processing and logging. | Drop-down Select one | -| | Award Transaction Code/Mã giao dịch tặng thưởng | OLS TC If selected, the **OLS** **Transaction Code”** used to locate any award campaign rules to be executed as a result of the catalogue item redemption. | Drop-down Select one | -| | Item Type \*/ Loại vật phẩm | The type of item Choose one of following types : * + 1. Miles 2. Physical 3. eVoucher 4. Donation 5. Cash rebate 6. Other | Radio button Item type list from master data | -| | Voucher Code /Mã voucher | Condition field A drop-down to select voucher code This field is only active and required when item is an eVoucher | Drop-down Select one | -| | Face value/ Partner Point / Giá trị vật phẩm | Condition field This field is only active and required for Cash rebate/eVoucher/Miles item. This is the value of the cash rebate/voucher /miles that customer sees. This value is not used if the Face Value is also specified in the Item Price set-up | 9(14,2) Should be positive value | -| | Display on Member Site | Turn off to restrict this item in member site. | Switch button Default ON | -| | Hot item /Vật phẩm hot | Condition field This field is active only when this item is displayed on the member site Choose to indicate this is a hot item. Used to display on Member Site. | Switch button Default OFF | -| | Display Ordering/ Thứ tự hiển thị | Condition filed This field is active only when this item is displayed on the member site The ordering sequence to display on member site | 9(3) Should be greater than 0 if provided | -| | Track Quantiy on Hand/ Theo dõi số lượng vật phẩm | ON mode if the item is an item and that requires inventory control: the “Quantity-on-Hand” is updated for such items during redemption. If this is a Voucher Code item, this field is force-set to Yes and cannot be changed. | Switch button Default OFF | -| | Initialize Quantity of Stocks/ Số lượng ban đầu | Condition filed This field is only active and required if track quantity on hand. Canot edit this value if this item has been redeemed. This field is not activated for the Evoucher item due to the number of voucher being generated by another feature (via the Voucher Code screen or batch file). | 9(9) Should be positive value. In case item has been redemmed, then not allow to modify this field. Just display only | -| **Item detail : Mandatory step** **This step involves configuring the details of each item in multiple languages. By doing so, the system can utilize the specific details tailored to each language.** | | | | -| | Select Language /Chọn ngôn ngữ | Click to add specific item detail. | Button | -| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | -| | Item name\*/Tên vật phẩm | Specific item name in the choosen language. | X(50) | -| | Item Description/Mô tả vật phẩm | Specific item description in the chosen language. | X(100) | -| | Item content/Thông tin chi tiết | The content of item in the choosen language | X(2000) | -| | How to use /Cách sử dụng | The way to use the item in the choosen language | X(2000) | -| | Term and Conditon/ Điều khoản | Term and Conditon Free text to be returned in the Terms and Conditions field in the Web Service message and in redemption output template letters and email. | X(2000) | -| **Item Image /Ảnh vật phẩm** Optional step | | | | -| | Select image | Click to add image for item | Button | -| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | -| | Image /Ảnh vật phẩm | Condiiton field This field is only active and required when image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | -| | Sort Order | The display odering sequence on Member Site. | 9(3) Should be greater than 0 if provided | -| | Preview | Preview of selected image | Image | -| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | -| **Contact and Address information** Optional step | | | | -| | Add Address | Click to add item address where we can to use this item | Button | -| | City\* | The drop-down to select the city where can use this item | Drop-down Select one | -| | Address | Address detail | X(200) | -| | Email | Email address | X(100) | -| | Phone | Phone number | X(20) | - -### Post-Conditions - -* + 1. The newly created item should have all required fields populated with valid data. - 2. The system should add/updated items in the database. - 3. Other screen which lookup to item screen must be able to use new item. - -### Exception Flow - -## Item price - -### Requirement Definition - -* + - 1. Outlines the specifc criteria, functionalities and parameter that determine and manage item prices in the OLS: - 1. Point valuation: Define the conversion rate between reward points and redemption quanity (e.g 100 point = 1 Ticket movie voucher) to establish the baseline for item redemption. - 2. Criterions pricing: specify if different pricing tiers will be available for customer based on their account type or redemption channel or specific criterions such as gender, redemption quantity,etc. - 3. Redemption options: Define the types of items price available for redemption, including using point only or both cash and points. - -### Process Flow - -[Image Removed] - -### Trigger - -* + - 1. New item is defined and must define item price to process redemption processing for this item. - 2. If an item is to be tagged to a price that has not yet been defined. - -### Pre-Conditions - -1. Users have to have access rights in “Item Master” screen under “OneCatalouge” module. -2. User have to have access rights in “Item Price” Screen under “OnCatalouge” module. -3. Depending on the user's access rights, they can view, add, edit, or approve Item Price records. - -### Wireframe - -[Image Removed] - -### Business Rules - -1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing item master. -2. Click to view detail any active item master records to bring up the “Item Price” screen as a new tab under item master detail record. -3. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Price is illustrated in section 7.5.5 -4. **Edit Screen Description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **General information** | | | | -| | Item Code \*/ Mã vật phẩm | Item code | Display if configure item pirce under specific item. Drop-down list to select an item code to configure the item price | -| | Price Code\*/Mã giá | The identify of the item price For user refrence only | X(10) | -| | Pirce Name \*/Tên giá | Default name of the price For user reference only | X(100) | -| | Effective Start Date \*/ Hiệu lực từ ngày | **From Date**” & “**To Date**” specify the period within this price. | Date | -| | Effective End Date \*/ Hiệu lực tới ngày | Date | -| | Redemption Channel \*/Kênh đổi thưởng | The drop-down to select the redemption channel. Supported channels are: Call Center Mobile Application Internet Banking Etc | Drop-down Select one | -| | Account Type Group/Nhóm loại tài khoản | Optional filed If Account Type or Account level is selected then account type group is blocked and vice versa. | Drop-down Multi-select | -| | Product Account Level /Hạng tài khoản | Optional field The drop-down to select the Account level (Card Level) to this this price applies. Leave as empty if all Account level are applies to this prce. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Select one | -| | Product Account Type/Loại tài khoản | Optional field Optional field Multi-select drop-down to select the Account Type (Card Type) of selected account level in previous step which will be applies to this price. Leave as empty if all account types of selected PAL are applies to this price. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Multi-select | -| | Redemption Pool\*/Pool đổi thưởng | Select the Pool from which to deduct points for redeeming this item | Drop-down Select one | -| | Use Only Points from Selected PA Type/Chỉ sử dụng điểm từ các loại nhóm tai khoản được chỉ định | Restrict the use of points for redemption of this item at this price to only points earned by the selected account Type/ATG | Switch button Default OFF | -| | Face value /Trị giá vật phẩm | If transacting Customer/Account meets the criteria in this set-up, what the Customer receives is this “Face Value”. E.g. if this is 500 KrisFlyer Miles, Customer receives 500 KrisFlyer Miles for redeeming one of this item. | 9(12,2) Should be greater than 0 if provided | -| | Price in point \*(Full redemption) / Giá trị điểm | Price of item if paid for fully in points from the selected Pool | 9(12,2) Should be greater than 0 if provided | -| | Original price /Giá gốc | The original price of the item For user reference only | 9(12,2) Should be greater than 0 if provided | -| | Partial Redemption Allowed/Cho phép đổi thưởng 1 phần | If allowed, customer can use a mix of points and cash to pay for this item. The number of points and amount of cash are derived from “Price in Cash Value-per Point” and “Minimum Partial Redeem Points”. See the description for these fields. | Swith button Default OFF | -| | Minimum Partial Redeem Points/Số điểm tối thiểu | Condition field This field is only active and required when Partinal Redemption is allowed. Customer must use at least this number of points to redeem this item. | 9(12,2) Should be greater than or equal to 0 if provided 0 for full cash redemption | -| | Cash per point/ Số tiền chi trả | Condition field This field is only active and required when Partinal Redemption is allowed. This is used to calculate the amount of cash required to redeem this item after taking into account the points redeemed, if any. | 9(12,2) Should be greater than 0 if provided | -| | Appliable Taxes | The drop-down list to select the tax rate to be applicable. | Drop –down Select one Get data from “Tax Rate Maintenance” Screen | -| **Price detail :** **Optional step. If not provide then use default item price name to display if needed** | | | | -| | Select language /Chọn ngôn ngữ | Click to add item price detail on each language For user reference only | Button | -| | Language \*/Ngôn ngữ | The drop-down to select the language to setup the specific item price detail | Drop-down Select one | -| | Item price Name \*/Tên giá | The specific name of chosen language For user reference only | X(100) | -| | Description/ Mô tả | The description of the price For user reference only | X(500) | -| **Item criteria** A part to add criteria to meet the price The approach the same as Rule criteria but just display all criteria which be tagged to “Item price “ module only | | | | -| | | [Image Removed] | Click to add new criteria | -| | | [Image Removed] | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “[Image Removed]” button to create new group. | -| | | [Image Removed] | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | -| | | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute and to be tagged for “Item Price “ module | -| | | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. | -| | | [Image Removed] | Click to delete criteria | -| | | [Image Removed] | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | - -### Post-Conditions - -With the item price configuration then here is the flow to get item price. - -Valid price - -[Image Removed] - -What is the price of the transaction - -[Image Removed] - -### Exception Flow - -## Voucher Code - -### Requirement Definition - -1 If the Item to be set up is for distribution of Voucher Numbers to customers, and these Voucher Numbers are from external partner merchants, then the Voucher Numbers must first be set up in OLS by uploading/creating the stock of Voucher Numbers. - -2 This voucher upload file must contain the Voucher Code (which identifies what this voucher is for – e.g. “$5 Lazada Voucher”), the period within which the vouchers are accepted at the partner merchant, and the individual voucher serial numbers (Voucher Numbers). - -3 The file format is set out later (to be decided). - -4 This upload can be done using the “Upload” functions in this screen. - -### Process Flow - -### Trigger - -N/A - -### Pre-Conditions - -1. Users have to have access rights in “Voucher Management” screen under “OneCatalouge” module. -2. Depending on the user's access rights, they can view, add, edit, or approve Voucher records. - -### Wireframe - -* + - 1. **Create/Edit mode** - -[Image Removed] - -* + - 1. **View mode** - -[Image Removed] - -1. Listing page -2. **Voucher Detail view** - 1. Listing Page - -[Image Removed] - -* 1. View - -Click to any record on the listing page to bring up the detail view as following: - -[Image Removed] - -### Business Rules - -1. Click on Voucher icon in navigation panel under OneCatalogue to get a listing of existing Voucher Code as illustrated in section Wireframe. -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Voucher is illustrated in section Wireframe. -3. Double click on any existing record in Active Tab then the Voucher Detail listing is illustrated in section 7.6.5. -4. The system just allow to view the Voucher detail only. -5. Can not allow deleting the voucher Code if voucher have been redeemed. -6. **Screen description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Screen 1: Voucher Code** | | | | -| | **Voucher statistic / Tổng hợp thông tin voucher** **This is displayed for active record only** | | | -| | Total Voucher /Tổng voucher | Total the serial number voucher belong to the choosen voucher code | Display as interger format | -| | Available Vouchers /Số voucher khả dụng | Total the valid voucher and ready to use: The voucher has not yet been redeemed and non- expired. | -| | Redeemed Vouchers/ Voucher đã đổi thưởng | Total the numner of the successfully redeemed vouchers. | -| | Cancelled Vouchers/ Voucher đã hủy | Total the number of the fail redeemed vouchers which is cancelled by customers/system by specific reason. | -| | Expired Vouchers/Voucher đã hết hạn | Total the number of expired voucher that has not yet been redeemed. Use processing date to compare with expiry date of the voucher. | -| | **Voucher Code Detail information** | | | -| | Voucher Code\*/Mã voucher | Identifies the voucher. | ~~X(20)~~ X(10) | -| | Description /Mô tả | The description of the voucher. For user reference only. | X(100) | -| | Supplier / Nhà cung cấp | The partner/ organization that issues or provides the voucher | Drop-down Select one | -| | Expiry Policy \*/ Hạn sử dụng | A drop-down list with the following choices: * Fixed Date: Voucher will expire after the date specified in the “Expiry Date” parameter. * N days from Transaction Date: Voucher will expire after N days from Redemption Date (Transaction Date). * N days from Post Date: Voucher will expire after N days from redemption transaction is posted on the OLS. * N Months from Transaction Date: Voucher will expire after N months from redemption Date. * N months from Post Date: Voucher will expire after N moths from the moment a redemption transaction is posted on the OLS. | Drop-down Select one | -| | Expiry Date / Ngày hết hạn | Condition field This field is only active and required when the expiry policy is “Fixed Date”. **A transaction which redeem this voucher is not allowed to have Transaction Date later than this date.** Can not allow editing the policy (including the relative field that be used to determine expiry date of the voucher) | Date | -| | N Param/ Tham số N | Condition field This field is only active and required when the Expiry Policy selected in the previous step requires a parameter N param. e.g. “N days from Transaction Date” | 9(3) Should be greater than or equal to 0 if provided | -| | Generate Voucher /Khởi tạo voucher | Turn on when the voucher is generated by OLS instead partner. The system will automation create the number of vouher which user will provide on next step. This field can’t be changed if the voucher have been redeemed. | Swith button Default OFF | -| | Quantity /Số lượng | Condition filed This filed is only active and required if “Generate Voucher” in the previous step under ON mode. Specifies the number of voucher codes to be generated. **When a voucher code record is approved in the system, the system should automatically generate voucher numbers corresponding to the entered quantity.** This field can’t be changed if the voucher have been redeemed. In case users want to change then it should be “re-stock”/ “void” voucher use case instead. | 9(5) Should be greater than 0 if provided | -| | This is a promo code/ Đây là mã khuyến mãi | Turn on when this is a promo code. For user reference only | Swith button Default OFF | -| | ~~Voucher Type/Loại voucher~~ Promotion Type/Loại khuyến mãi | Conditon filed This field is only active and required when this voucher is a promo code. A drop-down list with the following choices: * Fixed Percentage Discount: This type of voucher offers a discount as a percentage of the total purchase amount. * Fixed Monetary Value Discount: Instead of a percentage, this voucher provides a fixed monetary discount. * Cashback Voucher: For this type of voucher, the customer receives a certain percentage of the purchase amount back as cashback to use on future purchases. * Gif Voucher: This type of voucher is often purchased as a gift for someone else. It typically has a fixed monetary value that the recipient can use towards their purchases. | Drop-down Select one | -| | Value /Giá trị | The specific value which customer can get from chosen voucher type. Condition field This field is only active and required when “Fixed Monetary Value” / “Fixed Percentation Discount” are selected on the previous step. | 9(14,2) Should be greater than 0 if provided | -| **Screen 2: Voucher Detail** **Each voucher No is displayed under one detail record in listing page** **Voucher detail is introduced as a subtab of Active voucher record.** | | | | -| | Voucher Code | Choosen voucher code | Display | -| | Voucher No | The serial voucher number of choosen voucher | -| | Redemption Date | The date when voucher is redeemed | -| | Expiry Date | Expiry date of the voucher number which is based on choosen expiry policy of the choosen voucher | -| | Redemption Indicator | One of following values: * No: If voucher is not used for any redemption transaction. * Yes: If voucher have been redeemed by customer. | -| | Fulfillment Status | One of following values: * New: When voucher is created/uploaded in OLS then the fuillment status should be new to indicator that voucher to be availbale to redeem. * Issued: The FFS is changed into Issued when voucher is successfully redeemed in the OLS. * **Fulfilled: The FFS is changed into Fulfilled when voucher is successfully redeemed and partner accept this voucher.** * Cancelled: FFS is changed intpo “Cancelled” if the customer cancels the transaction or if there are issues with the voucher that prevent its redemption. * Rejected: The vendor has rejected the voucher due to some reasons such as term and conditions, policy changes.etc. The fufillment status is updated when fulfilment status is changed. | - -* + - 1. User who can create new voucher can use “upload” function to upload the voucher file into OLS - -### Post-Conditions - -### Exception Flow - +## OneCatalogue + +### About Redemption Item in OLS system + +#### Overview + +1. The catalogue is used to set up items for online (web site, Mobile App) redemptions. +2. Redemption items such as Cash-back rebates, frequent flyer miles conversion and merchant vouchers can be set up in the redemption catalogue. +3. Front-end systems access the catalogue through web services to display available items. +4. Front-end systems accept user requests to redeem and send these requests to OLS for authorization (deduction of the relevant points) and to generate the fulfilment files for sending to designated recipient systems. +5. Catalogues are managed through the browser-based administration screens, which update the catalogue in real-time. Once “Approved” the item is available commencing on the Start Date. +6. Functions include adding catalogues to the system, adding items to catalogues, setting price rules and processing redemption requests from front-end systems. +7. OLS also provides an administration function for back-office staff to redeem items through the administration screens directly on behalf of customers. + +### Catalogue + +#### Requirement Definition + +* + - 1. A Catalogue must be defined and all items to be included in the Catalogue must be tagged with the Catalogue code before customers access the items. + 2. A Catalogue code is tagged against each Item Master record. + 3. More than one Catalogue can be configured at the same time, but each Catalogue must have its own set of Item master records. + 4. Each Catalogue has a Start / End date range and items in the Catalogue will be picked for presentation to customer only if the current date falls in the Start / End date range for that Catalogue. + +#### Process Flow + +==tbd== + +#### Trigger + +* + - * 1. If an item is to be tagged to a Catalouge that has not yet been defined. + +#### Pre-condition + +1. Users have to have access rights in “Catalogue” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve catalogue records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Catalouge icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Catalouge is illustrated in section 7.2.5. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin chung** | | | | +| | Catalogue Code \*/Mã nhóm danh mục | User-specified code identifying the catalogue. Used by front-end system when requesting for item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this catalogue. For user reference only. Default description which will be used in case there is no specific description for chosen language. | X(50) | +| | Effective From Date \*/Có hiệu lực từ ngày | Catalogue is effective only when the processing date is between Start Date and End Date, inclusive. | Date | +| | Effective To Date \*/Có hiệu lực đến ngày | Date | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of catalogue | Image | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this catalogue. For user reference on MP only. | X(100) | + +#### Post- Conditon + +The Catalouge information for each item can be returned to the front-end during an Item Enquiry response message for the front-end to use in searching the catalogue for items. + +#### Exception Flow + +N/A + +### Category + +#### Requirement Definition + +A catalog is the main folder to organize categories and items for materials. A category is a group within a catalog that contains items. All items to be included in the Catalogue must be tagged with the Category code. Multiple Categories can be linked to form a hierarchy of categories. The hierarchy of categories is used on Member site. + +#### Process Flow + +#### Trigger + +If an item is to be tagged to a catagory that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Category” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve category records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on the category icon in the navigation panel under OneCatalouge to get a listing of existing catalogues. +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the category is illustrated in section 7.3.4. +3. **Descriptions** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General Information /Thông tin Chung** | | | | +| | Category Code \*/Mã danh mục vật phẩm | User-specified code identifying the category. Used by front-end system when requesting item information. | ~~X(20)~~ X(10) | +| | Description\*/ Mô tả | A description of this category. For user reference only. Default description which will be used in case there is no specific description for the chosen language. | X(100) | +| | Effective From Date /Có hiệu lực từ ngày | Category is effective only when the processing date is between the Start Date and the End Date, inclusive. If an effective date is not provided then this is a non-expire category. | Date | +| | Effective To Date /Có hiệu lực đến ngày | Date | +| | Parent Category | Multiple Categories can be linked to form a hierarchy of categories. | Drop-down Select one The parent categories value from master data. | +| | Display Ordering /Thứ tự hiển thi | The display ordering sequence on the Member Site. | 9(3) | +| | Icon/ Biểu tượng | Allow to upload/remove the icon of the category. | Image | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condition field This field is only active and required when the image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Content Configuration: This step is used to setup the description of catalogue follow each language.** **This is optional step** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific description | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Description\*/Mô tả | A description of this category in the choosen language. For user reference on MP only. | X(100) | + +#### Post –Condition + +#### Exception Flow + +### Item master + +#### Requirement Definition + +Describe details about a particular item: e.g. prices, quantities, availability dates, terms and conditions, etc. Item Master Records cannot be created unless the Stock Code is in place. + +#### Process Flow + +#### Trigger + +New items need to be defined. + +#### Pre –Condition + +1. Users have to have access rights in the “Item Master” screen under the “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Item Master records. + +#### Mockup + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing catalogs. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Master is illustrated in section 7.4.4 +3. **Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information: Mandatory Step** | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The Catalogue for which this item is being configured. | Drop-down Select one | +| | Category/Danh mục vật phẩm | Select the category under which this item is to be tagged, to facilitate searching in the customer-facing page – e.g. Retailer Vouchers, Frequent Flyer Points, Cash Rebate, etc. | Drop-down Multiples select | +| | Item Code\*/Mã vật phẩm | Enter the item code to be added to the catalogue. This is Item identify. | X(10) | +| | Item Name \*/Tên vật phẩm | Short description field used by customer-facing application for display for Catalogue item. The text can include control characters. This is default name in case there is no specific item name of chosen language in the member site. | X(50) | +| | Redemption From Date From\*/Có hiệu lực từ ngày | “**From Date**” & “**To Date**” specify the period within this item is available and may be included in the Catalogue display and when after which it becomes unavailable and is excluded from the Catalogue display. OLS will reject the Start Date and End Date if they are outside the Catalogue/Category Start Date and End Date period. Once the item has been started for redemption, only End date will be allowed to modify. | Date | +| | Redemption To Date \*/ Có hiệu lực đến ngày | Date | +| | Redemption Store /Đối tác | Supplier of this item. The merchant (Store) that has to be configured appropriately in order for straight-through settlement processing. | Drop-down Select one | +| | Redemption Transaction Code\*/Mã giao dịch đổi thưởng | OLS TC used for redemption processing and logging. | Drop-down Select one | +| | Award Transaction Code/Mã giao dịch tặng thưởng | OLS TC If selected, the **OLS** **Transaction Code”** used to locate any award campaign rules to be executed as a result of the catalogue item redemption. | Drop-down Select one | +| | Item Type \*/ Loại vật phẩm | The type of item Choose one of following types : * + 1. Miles 2. Physical 3. eVoucher 4. Donation 5. Cash rebate 6. Other | Radio button Item type list from master data | +| | Voucher Code /Mã voucher | Condition field A drop-down to select voucher code This field is only active and required when item is an eVoucher | Drop-down Select one | +| | Face value/ Partner Point / Giá trị vật phẩm | Condition field This field is only active and required for Cash rebate/eVoucher/Miles item. This is the value of the cash rebate/voucher /miles that customer sees. This value is not used if the Face Value is also specified in the Item Price set-up | 9(14,2) Should be positive value | +| | Display on Member Site | Turn off to restrict this item in member site. | Switch button Default ON | +| | Hot item /Vật phẩm hot | Condition field This field is active only when this item is displayed on the member site Choose to indicate this is a hot item. Used to display on Member Site. | Switch button Default OFF | +| | Display Ordering/ Thứ tự hiển thị | Condition filed This field is active only when this item is displayed on the member site The ordering sequence to display on member site | 9(3) Should be greater than 0 if provided | +| | Track Quantiy on Hand/ Theo dõi số lượng vật phẩm | ON mode if the item is an item and that requires inventory control: the “Quantity-on-Hand” is updated for such items during redemption. If this is a Voucher Code item, this field is force-set to Yes and cannot be changed. | Switch button Default OFF | +| | Initialize Quantity of Stocks/ Số lượng ban đầu | Condition filed This field is only active and required if track quantity on hand. Canot edit this value if this item has been redeemed. This field is not activated for the Evoucher item due to the number of voucher being generated by another feature (via the Voucher Code screen or batch file). | 9(9) Should be positive value. In case item has been redemmed, then not allow to modify this field. Just display only | +| **Item detail : Mandatory step** **This step involves configuring the details of each item in multiple languages. By doing so, the system can utilize the specific details tailored to each language.** | | | | +| | Select Language /Chọn ngôn ngữ | Click to add specific item detail. | Button | +| | Language \*/Ngôn ngữ | A drop-down list to select the language which need to be setup specific description. | Drop-down Select one Get from master data | +| | Item name\*/Tên vật phẩm | Specific item name in the choosen language. | X(50) | +| | Item Description/Mô tả vật phẩm | Specific item description in the chosen language. | X(100) | +| | Item content/Thông tin chi tiết | The content of item in the choosen language | X(2000) | +| | How to use /Cách sử dụng | The way to use the item in the choosen language | X(2000) | +| | Term and Conditon/ Điều khoản | Term and Conditon Free text to be returned in the Terms and Conditions field in the Web Service message and in redemption output template letters and email. | X(2000) | +| **Item Image /Ảnh vật phẩm** Optional step | | | | +| | Select image | Click to add image for item | Button | +| | Image group /Nhóm hình ảnh | Drop-down list to select the image group | Drop-down Select one | +| | Image /Ảnh vật phẩm | Condiiton field This field is only active and required when image group is selected | Drop-down Select one Lookup value from Image Stock screen by selected image group. | +| | Sort Order | The display odering sequence on Member Site. | 9(3) Should be greater than 0 if provided | +| | Preview | Preview of selected image | Image | +| | Add image/Thêm mới ảnh vật phẩm | Quick add feature to support user add image from this screen. The new image will be automatiom approved when the category is approved | Button | +| **Contact and Address information** Optional step | | | | +| | Add Address | Click to add item address where we can to use this item | Button | +| | City\* | The drop-down to select the city where can use this item | Drop-down Select one | +| | Address | Address detail | X(200) | +| | Email | Email address | X(100) | +| | Phone | Phone number | X(20) | + +#### Post-Condition + +* + 1. The newly created item should have all required fields populated with valid data. + 2. The system should add/updated items in the database. + 3. Other screen which lookup to item screen must be able to use new item. + +#### Exception Flow + +### Item price + +#### Requirement Definition + +* + - 1. Outlines the specifc criteria, functionalities and parameter that determine and manage item prices in the OLS: + 1. Point valuation: Define the conversion rate between reward points and redemption quanity (e.g 100 point = 1 Ticket movie voucher) to establish the baseline for item redemption. + 2. Criterions pricing: specify if different pricing tiers will be available for customer based on their account type or redemption channel or specific criterions such as gender, redemption quantity,etc. + 3. Redemption options: Define the types of items price available for redemption, including using point only or both cash and points. + +#### Process Flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. New item is defined and must define item price to process redemption processing for this item. + 2. If an item is to be tagged to a price that has not yet been defined. + +#### Pre-Condition + +1. Users have to have access rights in “Item Master” screen under “OneCatalouge” module. +2. User have to have access rights in “Item Price” Screen under “OnCatalouge” module. +3. Depending on the user's access rights, they can view, add, edit, or approve Item Price records. + +#### Wireframe + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Item Master icon in navigation panel under OneCatalouge to get a listing of existing item master. +2. Click to view detail any active item master records to bring up the “Item Price” screen as a new tab under item master detail record. +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Item Price is illustrated in section 7.5.5 +4. **Edit Screen Description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **General information** | | | | +| | Item Code \*/ Mã vật phẩm | Item code | Display if configure item pirce under specific item. Drop-down list to select an item code to configure the item price | +| | Price Code\*/Mã giá | The identify of the item price For user refrence only | X(10) | +| | Pirce Name \*/Tên giá | Default name of the price For user reference only | X(100) | +| | Effective Start Date \*/ Hiệu lực từ ngày | **From Date**” & “**To Date**” specify the period within this price. | Date | +| | Effective End Date \*/ Hiệu lực tới ngày | Date | +| | Redemption Channel \*/Kênh đổi thưởng | The drop-down to select the redemption channel. Supported channels are: Call Center Mobile Application Internet Banking Etc | Drop-down Select one | +| | Account Type Group/Nhóm loại tài khoản | Optional filed If Account Type or Account level is selected then account type group is blocked and vice versa. | Drop-down Multi-select | +| | Product Account Level /Hạng tài khoản | Optional field The drop-down to select the Account level (Card Level) to this this price applies. Leave as empty if all Account level are applies to this prce. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Select one | +| | Product Account Type/Loại tài khoản | Optional field Optional field Multi-select drop-down to select the Account Type (Card Type) of selected account level in previous step which will be applies to this price. Leave as empty if all account types of selected PAL are applies to this price. If Account type group are selected in previous step then this field is blocked and vice versa | Drop-down Multi-select | +| | Redemption Pool\*/Pool đổi thưởng | Select the Pool from which to deduct points for redeeming this item | Drop-down Select one | +| | Use Only Points from Selected PA Type/Chỉ sử dụng điểm từ các loại nhóm tai khoản được chỉ định | Restrict the use of points for redemption of this item at this price to only points earned by the selected account Type/ATG | Switch button Default OFF | +| | Face value /Trị giá vật phẩm | If transacting Customer/Account meets the criteria in this set-up, what the Customer receives is this “Face Value”. E.g. if this is 500 KrisFlyer Miles, Customer receives 500 KrisFlyer Miles for redeeming one of this item. | 9(12,2) Should be greater than 0 if provided | +| | Price in point \*(Full redemption) / Giá trị điểm | Price of item if paid for fully in points from the selected Pool | 9(12,2) Should be greater than 0 if provided | +| | Original price /Giá gốc | The original price of the item For user reference only | 9(12,2) Should be greater than 0 if provided | +| | Partial Redemption Allowed/Cho phép đổi thưởng 1 phần | If allowed, customer can use a mix of points and cash to pay for this item. The number of points and amount of cash are derived from “Price in Cash Value-per Point” and “Minimum Partial Redeem Points”. See the description for these fields. | Swith button Default OFF | +| | Minimum Partial Redeem Points/Số điểm tối thiểu | Condition field This field is only active and required when Partinal Redemption is allowed. Customer must use at least this number of points to redeem this item. | 9(12,2) Should be greater than or equal to 0 if provided 0 for full cash redemption | +| | Cash per point/ Số tiền chi trả | Condition field This field is only active and required when Partinal Redemption is allowed. This is used to calculate the amount of cash required to redeem this item after taking into account the points redeemed, if any. | 9(12,2) Should be greater than 0 if provided | +| | Appliable Taxes | The drop-down list to select the tax rate to be applicable. | Drop –down Select one Get data from “Tax Rate Maintenance” Screen | +| **Price detail :** **Optional step. If not provide then use default item price name to display if needed** | | | | +| | Select language /Chọn ngôn ngữ | Click to add item price detail on each language For user reference only | Button | +| | Language \*/Ngôn ngữ | The drop-down to select the language to setup the specific item price detail | Drop-down Select one | +| | Item price Name \*/Tên giá | The specific name of chosen language For user reference only | X(100) | +| | Description/ Mô tả | The description of the price For user reference only | X(500) | +| **Item criteria** A part to add criteria to meet the price The approach the same as Rule criteria but just display all criteria which be tagged to “Item price “ module only | | | | +| | | ![](data:image/png;base64...) | Click to add new criteria | +| | | ![](data:image/png;base64...) | Depended on the purpose of each campaign rule and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | +| | | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | +| | | Right panel | List all active criteria on the system. Each criteria per category will be defined as an attribute and to be tagged for “Item Price “ module | +| | | Drag/Drop criteria | Each criteria can be drag one more time on each CP rule. The operator and filler value for each criteria will be display base on data type of selected criteria. | +| | | ![](data:image/png;base64...) | Click to delete criteria | +| | | ![](data:image/png;base64...) | Operator between difference groups on the same campagn rule OR operator between difference criterions on the same group per each Campaign Rule. | + +#### Post-Condition + +With the item price configuration then here is the flow to get item price. + +Valid price + +![](data:image/x-emf;base64...) + +What is the price of the transaction + +![](data:image/x-emf;base64...) + +#### Exception Flow + +### Voucher Code + +#### Requirement Definition + +1 If the Item to be set up is for distribution of Voucher Numbers to customers, and these Voucher Numbers are from external partner merchants, then the Voucher Numbers must first be set up in OLS by uploading/creating the stock of Voucher Numbers. + +2 This voucher upload file must contain the Voucher Code (which identifies what this voucher is for – e.g. “$5 Lazada Voucher”), the period within which the vouchers are accepted at the partner merchant, and the individual voucher serial numbers (Voucher Numbers). + +3 The file format is set out later (to be decided). + +4 This upload can be done using the “Upload” functions in this screen. + +#### Process Flow + +#### Trigger + +N/A + +#### Pre-Condition + +1. Users have to have access rights in “Voucher Management” screen under “OneCatalouge” module. +2. Depending on the user's access rights, they can view, add, edit, or approve Voucher records. + +#### Wireframe + +* + - 1. **Create/Edit mode** + +![](data:image/png;base64...) + +* + - 1. **View mode** + +![](data:image/png;base64...) + +1. Listing page +2. **Voucher Detail view** + 1. Listing Page + +![](data:image/png;base64...) + +* 1. View + +Click to any record on the listing page to bring up the detail view as following: + +![](data:image/png;base64...) + +#### Business Rule + +1. Click on Voucher icon in navigation panel under OneCatalogue to get a listing of existing Voucher Code as illustrated in section Wireframe. +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Voucher is illustrated in section Wireframe. +3. Double click on any existing record in Active Tab then the Voucher Detail listing is illustrated in section 7.6.5. +4. The system just allow to view the Voucher detail only. +5. Can not allow deleting the voucher Code if voucher have been redeemed. +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Screen 1: Voucher Code** | | | | +| | **Voucher statistic / Tổng hợp thông tin voucher** **This is displayed for active record only** | | | +| | Total Voucher /Tổng voucher | Total the serial number voucher belong to the choosen voucher code | Display as interger format | +| | Available Vouchers /Số voucher khả dụng | Total the valid voucher and ready to use: The voucher has not yet been redeemed and non- expired. | +| | Redeemed Vouchers/ Voucher đã đổi thưởng | Total the numner of the successfully redeemed vouchers. | +| | Cancelled Vouchers/ Voucher đã hủy | Total the number of the fail redeemed vouchers which is cancelled by customers/system by specific reason. | +| | Expired Vouchers/Voucher đã hết hạn | Total the number of expired voucher that has not yet been redeemed. Use processing date to compare with expiry date of the voucher. | +| | **Voucher Code Detail information** | | | +| | Voucher Code\*/Mã voucher | Identifies the voucher. | ~~X(20)~~ X(10) | +| | Description /Mô tả | The description of the voucher. For user reference only. | X(100) | +| | Supplier / Nhà cung cấp | The partner/ organization that issues or provides the voucher | Drop-down Select one | +| | Expiry Policy \*/ Hạn sử dụng | A drop-down list with the following choices: * Fixed Date: Voucher will expire after the date specified in the “Expiry Date” parameter. * N days from Transaction Date: Voucher will expire after N days from Redemption Date (Transaction Date). * N days from Post Date: Voucher will expire after N days from redemption transaction is posted on the OLS. * N Months from Transaction Date: Voucher will expire after N months from redemption Date. * N months from Post Date: Voucher will expire after N moths from the moment a redemption transaction is posted on the OLS. | Drop-down Select one | +| | Expiry Date / Ngày hết hạn | Condition field This field is only active and required when the expiry policy is “Fixed Date”. **A transaction which redeem this voucher is not allowed to have Transaction Date later than this date.** Can not allow editing the policy (including the relative field that be used to determine expiry date of the voucher) | Date | +| | N Param/ Tham số N | Condition field This field is only active and required when the Expiry Policy selected in the previous step requires a parameter N param. e.g. “N days from Transaction Date” | 9(3) Should be greater than or equal to 0 if provided | +| | Generate Voucher /Khởi tạo voucher | Turn on when the voucher is generated by OLS instead partner. The system will automation create the number of vouher which user will provide on next step. This field can’t be changed if the voucher have been redeemed. | Swith button Default OFF | +| | Quantity /Số lượng | Condition filed This filed is only active and required if “Generate Voucher” in the previous step under ON mode. Specifies the number of voucher codes to be generated. **When a voucher code record is approved in the system, the system should automatically generate voucher numbers corresponding to the entered quantity.** This field can’t be changed if the voucher have been redeemed. In case users want to change then it should be “re-stock”/ “void” voucher use case instead. | 9(5) Should be greater than 0 if provided | +| | This is a promo code/ Đây là mã khuyến mãi | Turn on when this is a promo code. For user reference only | Swith button Default OFF | +| | ~~Voucher Type/Loại voucher~~ Promotion Type/Loại khuyến mãi | Conditon filed This field is only active and required when this voucher is a promo code. A drop-down list with the following choices: * Fixed Percentage Discount: This type of voucher offers a discount as a percentage of the total purchase amount. * Fixed Monetary Value Discount: Instead of a percentage, this voucher provides a fixed monetary discount. * Cashback Voucher: For this type of voucher, the customer receives a certain percentage of the purchase amount back as cashback to use on future purchases. * Gif Voucher: This type of voucher is often purchased as a gift for someone else. It typically has a fixed monetary value that the recipient can use towards their purchases. | Drop-down Select one | +| | Value /Giá trị | The specific value which customer can get from chosen voucher type. Condition field This field is only active and required when “Fixed Monetary Value” / “Fixed Percentation Discount” are selected on the previous step. | 9(14,2) Should be greater than 0 if provided | +| **Screen 2: Voucher Detail** **Each voucher No is displayed under one detail record in listing page** **Voucher detail is introduced as a subtab of Active voucher record.** | | | | +| | Voucher Code | Choosen voucher code | Display | +| | Voucher No | The serial voucher number of choosen voucher | +| | Redemption Date | The date when voucher is redeemed | +| | Expiry Date | Expiry date of the voucher number which is based on choosen expiry policy of the choosen voucher | +| | Redemption Indicator | One of following values: * No: If voucher is not used for any redemption transaction. * Yes: If voucher have been redeemed by customer. | +| | Fulfillment Status | One of following values: * New: When voucher is created/uploaded in OLS then the fuillment status should be new to indicator that voucher to be availbale to redeem. * Issued: The FFS is changed into Issued when voucher is successfully redeemed in the OLS. * **Fulfilled: The FFS is changed into Fulfilled when voucher is successfully redeemed and partner accept this voucher.** * Cancelled: FFS is changed intpo “Cancelled” if the customer cancels the transaction or if there are issues with the voucher that prevent its redemption. * Rejected: The vendor has rejected the voucher due to some reasons such as term and conditions, policy changes.etc. The fufillment status is updated when fulfilment status is changed. | + +* + - 1. User who can create new voucher can use “upload” function to upload the voucher file into OLS + +#### Post-Condition + +#### Exception Flow + diff --git a/docs/specs/archive/customer_management.md b/docs/staging/structured/customer/customer.md similarity index 84% rename from docs/specs/archive/customer_management.md rename to docs/staging/structured/customer/customer.md index 3a0b1eb..e193261 100644 --- a/docs/specs/archive/customer_management.md +++ b/docs/staging/structured/customer/customer.md @@ -1,1687 +1,1682 @@ ---- -title: "Customer management" -type: OpenSpec -status: Draft ---- -# Customer management - -## Customer profile - -### Requirement Definition - -1. OLS administration screens include a “Customer Profile” function to view Customer details. -2. Customer records are view-only, and can only be updated from source systems by batch ==TBD=== - -### Process Flow - -[Image Removed] - -### Trigger - -* + - 1. User want to verify/ get customer’s information. - -### Pre-Conditions - -1. User have to have the access right on both “Customer Profile module under “Customer Mangement” Group. - -### Wireframe - -* + - * 1. Summary listing page - -[Image Removed] - -* + - * 1. Filter - -[Image Removed] - -* + - * 1. Create/Edit mode - -1. [Image Removed] - * + - 1. Detail view - -[Image Removed] - -### Business Rules - -1. Click on Customer Profile icon in Main Menu to list customer records, as illustrated in the [wrireframe](#_Wireframe_13). -2. Use the filter to locate particular customer, which will be listed in the display. -3. Click on a row to view details of the customer record, as illustrated in the [wireframe](#_Wireframe_13). -4. Filter description: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Filter** | | | | -| | Quick search | As common function, OLS allows find customer record by quick search function. Put and press enter any key related to these field to find data. | | -| | Gender / Giới tính | If Gender are provide then just get customer who have selected gender If gender are not provided then get all customer | Drop -down Allow multiple select | -| | Country Origin /Quốc gia | If Country are provide then just get customer who have selected Country Issused If Country are not provided then get all customer | Drop -down Allow multiple select | -| | Date of Birth/Ngày sinh | Find customer who have day of birth matched with selected date | Date Time picker | -| | Card number/ Số thẻ | Find customer who have the account of inputed Card number | Text box | -| | Account number/Số tài khoản | Find customer who have the inputed Account | Text box | - -1. **Screen description** - -Screen description at create/edit mode - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Step 1: Customer Profile / Hồ sơ khách hàng** | | | | -| | CIF number \* / Số CIF | Unique CIF Number assingn to each customer. | X(30) | -| | Frist Name \*/ Tên | Customer First Name | X(50) | -| | Last Name \* / Họ | Customer last name Frist Name + Last Name will be customer Name which will be stored in database for refering | X(50) | -| | Date of Birth\*/ Ngày sinh | Customer birth date | Date | -| | Registration Date/ Ngày đăng kí | The date customer open an account | Date | -| | Gender / Giới tính | Customer Gender | Drop-down Select one Lookup value from Code\_Management table where code type is “gender”. Refer to “get-type-by-code”API under Master data | -| | Customer Status \*/Trạng thái khách hàng | Customer status | Drop-down Select one Lookup value from Code\_Management table where code type is “customer-status”. Refer to “get-type-by-code”API under Master data | -| | Customer Block Code | Customer block code | X(10) | -| | Marital Status/ Tình trạng hôn nhân | Customer marital ima status | Drop-down Select one Lookup value from Code\_Management table where code type is “marital-status”. Refer to “get-type-by-code”API under Master data | -| | ID Type/ Loại ID | ID Type of cardholder ID | Drop-down Select one Lookup value from Code\_Management table where code type is “cardholder-idtype”. Refer to “get-type-by-code”API under Master data | -| | Cardholder ID/ Số ID | Cardholder ID Condition field. This field is required when Cardholder type is selected otherwise this will be optional field. | X(30) | -| | Country Origin/ Quốc gia | Customer country orgin | Drop-down Select one Lookup value from “Country” table. Refer “Country Code” API under Code Maintenance | -| | Customer Income/Thu nhập | Customer income | 9(14,2) Should be greater than or equal to 0 if provided | -| | Datetime of maitenance date/ Ngày cập nhật thông tin | The sysdate to create/update record via OA screen. The maintenance date from request if input via batch job | Datetime The date format must adhere to the configured format Display for view mode only | -| | Profile Picture /Ảnh hồ sơ | Drag or drop photo Or Browse file to upload image file | | -| **Step 2: Contact Detail/ Thông tin liên hệ** At least one contact detail record should be provided Each customer can have more than one contact detail information such as customer contact and guardian contact…. | | | | -| | Addess Type\*/ Loại địa chỉ | Adress type A drop-down list to select one of following address: Home Address Business Address Shipping Address Billing Address | Drop-down Select one Address type should be unique on each customer | -| | Phone number\*/ Số điện thoại | Phone number | X(30) | -| | Email Address\*/ Địa chỉ Email | Email Adress This field must be under email format | X(50) | -| | Address 1/ Địa chỉ 1 | The main address | X(100) | -| | Address 2/ Địa chỉ 2 | Other address | X(100) | -| | State/Tỉnh-Khu vực | State | Drop-down Select one Lookup value from “State\_Code” table Refer to “State code” API under Code maintenance | -| | City/ Thành phố | City | Drop-down Select one Lookup value from “City\_Code” table Refer to “City code” API under Code maintenance | -| | Zip Code/ Mã bưu điện | Zip code/postal code | Drop-down Select one Lookup value from “ZIP\_CODE” table Refer to “Zip Code” API under Code Maintenance | - -* 1. **Processing** - + If a request is adding a record which whose CIF # locates an existing Client record in OLS with record Status = “A”, the incoming record will be rejected. - + If a request is updating or deleting a CIF # that does not locate an existing Client record with record Status = “A” in OLS, the request will be rejected. - + If a request is deleting a CIF# that locates a Client record that is linked to one or more Account that is still active in OLS, the request will be rejected. - + When new customer is added in OLS then: - -+ Customer record is added in both Client and Client\_corr table. - -+ The corresponding LOYALTY\_ACCOUNT is created. - -* + - When customer is deleted then: - -+ Logically delete the record by moving it to History table. - -+ Locate record in LOYALTY\_ACCOUNT and move that to History table. - -* + - Records added thru this screen cannot be updated by records from the OLS batch. Record created/updated by OLSCUST batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. - 1. **View mode of active record is display as customer 360 which is described** **in section 5.2.** - -### Post-Conditions - -* + - * 1. Able to access submodule in customer management module which will be described more detail as following section. - -### Exception Flow - -N/A - -## Customer 360 - -### Requirement Definition - -1. OLS administration screens include a “Customer 360” function to view Customer details. -2. Customer 360 contains key information about customer. User can use it as a strategy guide to creating personalized experiences. - -### Process Flow - -N/A - -### Trigger - -N/A - -### Pre-Conditions - -1. User need to have the access right in Customer Profile module in order to able to view this dashboard. -2. User must select a customer in customer profile listing page to bring up the customer dasboard. - -### Wireframe - -[Image Removed] - -[Image Removed] - -### Business Rules - -1. Clicking on the chart icon at the top of the main Customer list page will toggle between the Customer list view and the Customer dashboard view. -2. Customer dashboard update constantly, giving user a real-time view of customer behavior and information. -3. Click any customer record in listing page to see the customer profile of each customer. -4. **OLS support following information:** - -#### Customer information - -[Image Removed] - -* + 1. Click “See profile details” to see customer profile detail. The system bring up the screen as pop-up screen for customer profile as illustrated as following: - -[Image Removed] - -1. User can edit/delete customer from this screen. - -#### Customer’s rewards statistic - -[Image Removed] - -* + 1. This part displays statistical indicators related to the customer's rewards. OLS introduces 2 indicators: - -+ Points: The customer’s total available points. Use sysdate to determine the balance bucket periods. - -+ Cash back: The customer’s total available cash back. Use sysdate to determine the balance bucket periods. - -#### Account / Card information - -* + 1. The Customer’s account holdings and all of the customer’s card are displayed, regardless of whether account or card number is used. - 2. **The Account/ Card information listing give user have a general overview of customer’s cards:** - -**+ A = Set of card list of all account in the selected customer** - -**+ B= Set of card lists for the specifically selected customer.** - -**Therefore C= Card in listing page = Distinct cards from the union of A and B** - -* + 1. **In case account there is no card is added then just show the account list of selected customer.** - 2. Quick shortcut to support adding new Card or new Account from this screen. - 3. Detail listing description: - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Filed** | **Description** | **Data type** | -| **Layout** [Image Removed] | | | | -| | Account type\*/Loại tài khoản | The combination of Product Account Level and Prodcut Account Type of customer. All Customer’s account holding are displayed here. | Display | -| | Account Number\* /Số tài khoản | Product Account No. | Link Click on each Account number to bring up the Account Detail screen to see more about this account. See more on [Account](#_Account) section | -| | Card Number/Số thẻ | Card number | Link Click on each Card number to bring up the Card Detail screen to see more about this card. See more on [Card](#_Card) section. | -| | CIF Number\*/Số CIF | CIF number of card will be the same as selected CIF number for Principal card For supplement card then this is CIF number of Card instead CIF Number of Account. | Display | -| | Card Status/Trạng thái thẻ | Card status | Display Lookup value from Card table | -| | Card indicator/Chỉ thị thẻ | Card indicator | Display Lookup value from Card table | -| | Card block code/Mã chặn tài khoản | Card block code | Display Lookup value from Card table | -| | Card expiry date/Ngày hết hạn thẻ | Card expiry date | Display Lookup value from Card table | -| | Account block code/Mã chặn tài khoản | Account block code | Display Lookup value from Product\_Account table | -| | Account status\*/Trạng thái tài khoản | Account status | Display Lookup value from Product\_Account table | -| | Account Open Date\*/Ngày mở tài khoản | Account Open Date | Display Lookup value from Product\_Account table | - -#### Transaciton statistic - -A combination of two charts is used to describe the transaction statistic for selected period of a customer. - -The line chart describes the fluctuations in a customer's balance for the selected pool over a specified period. - -The combo chart illustrates the relationship between the total number of transactions and the total number of transacted merchants for the selected pool over a specified period. - -Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | | -| **Filter** [Image Removed] | | | | -| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months 4. Last 6 months Default as “This month” This filter is apply for both graph | | -| | Pool | Mandatory field Allow multiple select Lookup value from Pool Defintion Display Pool ID and Pool Name per each pool. This filter is applied for left graph only | | -| | Account type | Drop-down list to select combination of PAT and PAL. Allow multiple select. This filter is applied for right graph only | | -| | MCC | Drop-down list to select MCC of the transaction. Allow multiple select Display code and description per each MCC This filter is applied for right graph only | | -| **Line chart** **Layout** [Image Removed] [Image Removed] | | | | -| | Vertical axis | Total point each selected period/ selected pool Each line is assinged for one transaction type. | | -| | Horizontal axis | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. If Period “Last 6 months” is selected then horizontal axis is including last 6 months from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points/ adjusted points for the date range/time frame defined. | | -| **Data source** | | | | -| Get data from the TRANSACTION table with transaction type = “Award” for earned points/Transaction type = “Redeem” for redeemed points / Transaction type =’ Adjust” for Adjusted points during each selected month on the selected pool. The transaction should not be a cancellation transaction. Use the transaction date to determine the period. | | | | -| **Combo chart** Layout [Image Removed] [Image Removed] | | | | -| | Left vertical axis | | Total number of transacted merchants during selected period of selected pool Use Bar chart to describe total number per each period | -| | Right vertical axis | | Total number of transaction during selected period of selected pool Use line chart to describe total number per each period | -| | Horizontal axis | | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of transaction for the each day/month Hover over the bar graph to view a count of transacted merchant for the each day/month | -| **Data source** | | | | -| | Lookup value from TRANSACTIONS table Use transaction date to determine period Use Store data as merchant to determine transacted merchant Each OLS Reference No should be one and only transaction. | | | - -#### Customer Activities - -* + - * 1. The all customer activites will be triggerd and displayed here. - 2. Some types of customer activities as following: - 1. Loyalty program - -All OLS transaction of customer such as: - -* + - Enrolling in and participating in OLS loyalty programs. - - Redeeming points - - Transfer points - - Earn points - 1. Feedback and Review - + Leaving customer’s feedback on the portal app. - 2. Email engagement - + Receive email from OMR - 3. Account management - -Refering to all bellow action in portal app such as: - -* + - Updating customer information, such as contact details, payment methods, and preferences. - - Password resets and login activity. - -1. Allow user filter data by time frame (Start date and End date). -2. Layout - -[Image Removed] - -#### Customer Segmentation - -* + - 1. Deviding the customer base into segmentation groups based on specific characteristics, behaviors and demographics. - 2. Introduce the criteritions on each segmentation group and the conditons to meet each criterion. Based on this, OLS introduce a program to collect data and devide customers into each segment. - 3. Demographic segmentation includes following segment: - 1. Gender: Famale or Male - 2. Age: Teenager / Adult/ Middle- Aged person/ Senior Citizens: Based on criteria (Age’s range) to devide customer’s age. - 3. Matirial Status: Single or Married - 4. Income: Low / Medium / High: Based on criteria (customer’s income range) to devide icom segment. - 5. Layout - -[Image Removed] - -1. Behaviors segmentation includes following segment: - 1. Frequency of purchase: Daily / Weekly/Montly..: Based on the frequency of the transaction to devide this segment. - 2. Membership class: Depending on the organization, business. Some common types of membership class: - * Basic membership - * Premium membership - * Platium membership - * Gold membership - * Daimon membership - * VIP membership - 3. Purchase channel: Categorizing customers based on customer’s preferred purchase channels, such as in-store, online, mobile app, or phone (Call to call center)… - 4. Hobby: Based on customer’s hobby to create siutable loyatly program. - -6. Layout - -[Image Removed] - -#### Most Redemmed Items - -The top 10 (this value should be configurable value) redeemed items of the customer are displayed here. - -Just show top 5 item on each page. - -Each row contains a summary for an item, including the item code, the total redeemed quantity, and the redeemed points/cash amount to use for the specificed period. - -Shortcut to support quick add new item redemption transaction from this screen. - -Listing page description: - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field** | **Descriptions** | **Data type** | -| **Layout** [Image Removed] | | | | -| F**ilter** | | | | -| | Period | Period used to filter data. | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. Today 2. This month 3. Last month 4. Last 3 motnhs Default as “To day” | -| | Item type | Optional field The drop-down to select item type to get top N item. If item type is not provided then top N of all item type will be displayed. | Drop down Multiple select Default Evoucher type | -| **Listing page** | | | | -| | Item code/Mã vật phẩm | Item code | Display Lookup value from CAT\_CATALOGUE\_TRANS\_DETAIL table | -| | Item Name/Tên vật phẩm | Item Name | Display Lookup value from ITEM table | -| | Category/ | The categories are assigned to item | Display Lookup value from Item table Each item can be assinged more than one category | -| | Quantiy/Số lượng | Total redemmed quantity of selected customer for top item on selected period | Display as number format Lookup value from CAT\_CATALOGUE\_TRANS\_DETAIL table | -| | Redemmed points/ Điểm đã sử dụng | Total redemmed point of selected customer for top item on selected period | Display as number format Lookup value from CAT\_CATALOGUE\_TRANS\_DETAIL table | -| | Cash Amount used/Tiền đã sử dụng | Cash used to redeem | Display as number format Lookup value from CAT\_CATALOGUE\_TRANS\_DETAIL table | -| **Data source** | | | | -| | Lookup value from CAT\_CATALOGUE\_TRANS\_DETAIL table Use Post\_Date to determine period Order by quantity descending order. | | | - -#### Balance information - -1. The all customer’s pool balances are displayed here. -2. Each row contains the summary for a Pool: the total balance (sum of all buckets in a Pool), redeemable balance and the expiry date of the earliest expiring bucket. -3. Listing page descriptions - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | -| Layout [Image Removed] | | | | -| **Fitler** | | | | -| | Pool | Optional field A drop-down to select the reward pools, which quickly retrieves the customer's balance. If Pool is provided then the system display all balance of the selected pool of the customer. If pool is not provided then all pool balance of the customer are displayed. | Drop –down Default as empty Multiple select Lookup from pool definition screen Display only the pools with a non-zero balance. | -| **Listing page** | | | | -| | Pool ID/Mã pool | Pool ID | Link Click on the pool id to bring up the “[Pool Balance Enquiry](#_Balance_Detail_Enquiry) ” detail view of this pool. | -| | Pool Name/Tên pool | Pool Name | Display Lookup value from Pool Definition | -| | Balance/Số dư | Sum all balance buckets of a pool of customer. | Display as number format Lookup value from LAB table | -| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of a pool of customer. The bucket should have: Start date <= Processing date <= Expiry date | Display as number format Lookup value from LAB table | -| | Earliest Exp Bal and Date/ Số dư gần nhất | The earliest expiring bucket date for a pool, for non-0 balance buckets. And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | - -### Post – condition - -* + 1. User can use it as a strategy guide to creating personalized experiences.. - -### Exception Flow - -N/A - -## Account - -### Requirement Definition - -Account tab show all customer’s holding account. - -Account information means anything relating to customer’s holding acccount which sent from external system to OLS or Added by user via OLS system. - -### Process Flow - -[Image Removed] - -### Trigger - -N/A - -### Pre-Conditions - -1. Users have to have access rights in both “Customer Profile” and “Account” modules under “Customer Mangement” Group in order to able to view this screen. -2. User must select a customer in customer profile listing page to access the “Account” tab. -3. An account type must be available in the OLS system before adding any account of that type. - -### Wireframe - -Summary listing page - -[Image Removed] - -Figure 1: Listing page - -[Image Removed] - -Figure 2: Filter - -Add/Edit mode - -[Image Removed] - -[Image Removed] - -Detail view - -* 1. Record detail - -[Image Removed] - -* 1. Record status and history - -[Image Removed] - -### Business Rules - -Account records are updated in the external system and then loaded into OLS. - -Account records can be added by adding functions in administration screens. - -Click on the Account tab in the Customer profile screen to bring up the Account listing as illustrated in the [wireframe](#_Wireframe_4). - -Use the filter to locate a particular Account, which will be listed in the display. - -Click on a row to view details of the Account record, as illustrated in the [wareframe](#_Wireframe_4). - -Screen description - -| | | | | | | -| --- | --- | --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Description** | | | **Data type** | -| | CIF numnber\* / Số CIF) | CIF number of selected customer | | | Display | -| | Product Account Level (PAL) \* /Hạng tài khoản | Product Account Level of Account | | | Drop-down Lookup value from PRODUCT\_ACCOUNT\_LEVEL table Refer to “ Product Account Level” API under “Code Maintenance” | -| 2. | Product Account Type (PAT)\* /Loại tài khoản | Product account type which belongs to selected PAL that assigned to Account Combination PAL and PAT as Account Type of Account | | | Drop-down Lookup value from PRODUCT\_ACCOUNT\_TYPE table where PAL as selected PAL Refer “ Product Account Type” API under “Code Maintenance” | -| 3 | Account Number\*/ Số tài khoản | Product Account Number | | | X(20) Combination Account Type + Account Number should be unique. An Combination Account No + Account Type is assigned to an ASN. ASN is unique in the OLS system | -| | Account Open Date \*/Ngày mở tài khoản | Product Account Open Date | | | Date The date format must adhere to the configured format | -| | Account Indicator\*/ Chỉ thị tài khoản | P- Personal account C- Corporate Account | | | Drop-down Select one Lookup value from “Code Management” table where type code is “Acct-indicator”. Refer “List-by-code-type” API under Master Data. | -| | Account block code/ Mã chặn tài khoản | The account block code is used to check block transaction via TP or on some MQ validation | | | X(10) | -| | Block code reason / Mã lí do chặn tài khoản | Reason to block account | | | X(100) | -| | Block code last update date/ Ngày chặn cuối cùng | The day to block account | | | Date The date format must adhere to the configured format | -| | Cycle / Ngày sao kê | Statement cycle date | | | 9(02) Should be greater than 0 if provided | -| | Account status\*/ Trạng thái tài khoản | Product account status The Account status is used to check block transaction via TP or on some MQ validation | | | Drop-down Select one Lookup value from “Account Status” screen (Account\_status table). Refer “Account status” API under Code Maintenance | -| **Card information/Thông tin thẻ** When click to view any active account then this pannel is display to show the card of cards belong to selected account. The pannel includes following information: | | | | | | -| | Card number / Số Thẻ | | Card Number | Display Lookup value from Card\_Product\_Account\_Rel table where account is selected account. Refer “Card” API under Customer Management | | -| | Card status/ Trạng thái thẻ | | Card Status Display both code and description of status | Lookup value from Card table by Card Number Lookup description from Code\_Management table by code type is “card-status”. Refer “Card” API and “get-by-code-type” API | | -| | Card Indicator/Chỉ thị thẻ | | Card indicator Display both Code and description of indicator | Display Lookup value from Card table by Card Number Lookup description from Code\_Management table by code type is “card-indicator”. Refer “Card” API and “get-by-code-type” API | | -| | Card Creation Date/ Ngày tạo thẻ | | Creation Date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | -| | Card Expiry Date /Ngày hết hạn | | Expiring date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | -| | CIF number/ Số CIF | | CIF number of Card | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | -| | Card block code/Mã chặn thẻ | | Card block code | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | - -Each account is belong to only one Customer. OLS don’t support to change CIF number of account in this screen. If have to change CIF number of the account then it should be processed via CIF Merge batch if needed. - -Records added thru this screen cannot be updated by records from the OLSACCT batch. Record created/updated by OLSACCT batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. - -When an account is added then: - -* If locate any exiting record with the same combination Account No+ Account Type in OLS (record status is “A”) then the record is rejected. -* If not then: - + - Account record is added in PRODUCT\_ACCOUNT table. - - The corresponding LOYALTY\_ACCOUNT\_PRODUCT is created - -When an account is modified then : - -* If there is no combination Account No+ Account Type is found in OLS then the record is rejected. -* If found the same combination Account No+ Account Type existing record in OLS then update Product Account fields with the incoming field values accordingly. The original record is moved to his table after record is approved. -* Upgrade Account case :==tbd=== - -When account is deleted then: - -* If there is no combination Account No+ Account Type is found in OLS then the record is rejected -* If locates a Product Account record that has a Card record with record Status “A” linked to it, the incoming delete action is rejected. -* If found the same combination Account No+ Account Type existing record in OLS then move record into history table. The corresponding LOYALTY\_ACCOUNT\_PRODUCT is moved to his table as well. - -### Post – Codition - -* 1. Allow to add Card. - 2. Allow to post transaction with new account. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Card - -### Requirement Definition - -Card tab show all customer’s card. - -Card information means anything relating to customer’s card which sent from external system to OLS or added by users on the OLS system. - -### Process Flow - -[Image Removed] - -### Trigger - -N/A - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Card” modules under “Customer Mangement” Group to able to view this screen. -2. User must select a customer in customer profile listing page to access the “Card” tab. -3. An account must be available in the OLS system before adding any card of that account. - -### Wireframe - -Summary listing page - -[Image Removed] - -Figure 1: Listing page - -[Image Removed] - -Create/Edit view - -[Image Removed] - -[Image Removed] - -Detail record view - -* 1. Record detail - -[Image Removed] - -* 1. Record status and history - -[Image Removed] - -### Business Rules - -Card records are updated in external system and then loaded into OLS, so OLS only provides view functions in administration screens for Card records. There is no further actions. - -Click on Card tab in Customer profile screen to brings up the Card listing as illustrated in the [wareframe](#_Wireframe_5). - -Use the filter to locate particular Card, which will be listed in the display. - -Click on a row to view details of the Card record, as illustrated in the [wareframe](#_Wireframe_5). - -Create/Edit screen description - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | -| | CIF number \*/Số CIF | CIF Number of Card | Drop-down Get data from Client table Default as CIF Number of selected customer but user can modify if Supplement Card is added. Support quick search CIF number by enterd al least 4 digits of CIF number. | -| | Account Type\*/ Loại tài khoản | Combination of Product Account Level and product account type PAT : Visa [001] PAL: Debit [830] Account type : 830-001 | Drop-down Lookup value from PRODUCT\_ACCOUNT table where Account Type is Account type of select customer (Use CIF number which is selected from listing page). Refer to “Product account” API under “Customer Management”. | -| | Account number \*/ Số tài khoản | Product Account number | Drop-down All account of selected account type of selected customer. Refer to “Product account” API under “Customer Management” | -| 3 | Card number\* /Số thẻ | Card number | X(20) Must be unique value in whole system. | -| | Masked Card Number/ ==tbd== | Masked Card Number | X(20) | -| | Cardholder Name\*/ Tên chủ thẻ | Cardholder Name | X(50) | -| | Card Indicator\*/ Chỉ thị thẻ | Card indicator: S- Supplement Card P – Principal Card K – Corporate Card …. For principal card then CIF of card must be the same as CIF of Account. | Drop-down Select one Lookup value from “Code management” table where type code is “card-indicator”. Refer “list-by-code-type” API under “Master Data”. | -| | Card status \*/Trạng thái thẻ | Card status The Card status is used to check block transaction via TP or on some MQ validation | Drop-down Lookup value from “Card Status” screen (Card\_status table). Refer “Card status” API under Code Maintenance | -| | Card block code/Mã chặn thẻ | Card block code The Card block code is used to check block transaction via TP or on some MQ validation | X(10) | -| | Card activation date /Ngày kích hoạt thẻ | Card activation date | Date | -| | Card creation date\*/ Ngày mở thẻ | Card creation date | Date | -| | Card expiry date \*/ Ngày thẻ hết hạn | Card expiry date | Date | -| | Old Card Number/ Số thẻ cũ. | Old Card Number | Drop-down list Card belong to selected account. In BAU processing, this is the existing card number to be replaced by new Card Number in this record. This field should have a value only if this record is ADDING a NEW CARD NUMBER which is to replace the OLD CARD NUMBER. Both new card and old card should under the same account. | -| | ==tbd== | | | - -1. Records added thru this screen cannot be updated by records from the OLSCARD batch. Record created/updated by OLSCARD batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. -2. When a record is adding with whose Card Number already exists in OLS, the record will be rejected. -3. When a record is adding/updating with whose Account does not exists in OLS, the record will be rejected. -4. When a record is adding/updating with whose CIF Number does not exists in OLS, the record will be rejected. -5. **Processing** - -* Each Card is belong to only one Account and only one customer. OLS don’t support to change CIF number Or Account of Card in this screen. If have to change CIF Numnber of card or account of card then it should be processed via CIF Merge batch if needed. -* When a record is adding with inputed data passed the card record validation then: - + - The card record is added in CARD table. - - The linked record to the Account through CARD\_PRODUCT\_ACCOUNT\_REL table is added as well. -* When a record is updated whose Card Number passes the validations then the Card record and the Card–Account relationship record are updated. Original record is moved to his table. -* When a Card is deleted then the Card record is moved to history table to indicate a logical delete. The corresponding CARD\_PRODUCT\_ACCOUNT\_REL record for this card is also moved to history table. -* For principal card CIF number of account should be the same CIF number of card. -* For replacement case: A new Card issued to the Cardmember in case of loss, theft, mutilation or non-receipt of a Card. Therefore new card is coming to replace old card. When replace card then: - + - Add the incoming record as a new Card record with the same PSN as old card number. - - The linked record to the Account through CARD\_PRODUCT\_ACCOUNT\_REL table is added as well. - - Old Card Number will continue to be processed until the Card Status and/or Block Code is/are updated to make the card ineligible. - - All Attributes, Counters and Pool Buckets which were linked to the old Card number will be automatically linked to the new Card record. - -1. Card listing will be the list card of all account of selected customer. - -### Post – Codition - -N/A - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Pool Balance Detail - -### Requirement Definition - -OLS will support Pool balance enquiry as a tab on Customer Profile Screen. - -Pool Balance tab to list a summary of all Pools of the customer. - -### Process Flow - -[Image Removed] - -### Trigger - -User would like to check balance detail of customer. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Balance Enquiry” modules under “Customer Mangement” Group to able to view this screen. -2. User must select a customer in customer profile listing page to access the “Pool Balance Detail” feature. - -### Wireframe - -Summary listing page - -* + 1. Listing page - -[Image Removed] - -* + 1. Filter - -[Image Removed] - -1. Detail view - * 1. Detail view per each pool - -[Image Removed] - -* + 1. Click on each row in Pool Balance View to brings up the pop-op detail view - -[Image Removed] - -### Business Rules - -* 1. Click on Pool Balance tab to list a summary of all Pools of the customer. - 2. All summary of pool balance display in listing page. - 3. This screen just display only. There is no Add/Mofify action on this screen. - 4. Each row contains the summary for a Pool: the total non-balance (sum of all buckets in a Pool), and redeemable balance and the expiry date of the earliest expiring bucket. - 5. Use the filter to locate particular pool balance detail record, which will be listed in the display. - 6. Click on any record to bring up the breakdown of the Pool in that row on the “Pool Balance Detail” Screen as illustrated in the [Wireframe](#_Wireframe_2). - 7. User stories and acceptance criteria - -[Image Removed] - -* 1. Pool Balance Detail screen descriptions - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | -| **Pool Balance /Số dư pool** | | | | -| | Pool ID / Mã pool | Pool ID | Display | -| | Pool Name/ Tên pool | Pool Name | Display Lookup value from Pool Definition | -| | Pool type/ Loại pool | Pool Type | Display Lookup value from Pool Definition | -| | Pool Entity level / Cấp thực thể pool | Pool Entity level | Display Lookup value from Pool Definition and master data table | -| | Balance / Số dư | Sum all balance buckets of selected pool | Display as number format Lookup value from LAB table | -| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of selected pool The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | -| | Next Expiring Balance/ Số dư hết hạn gần nhất | The earliest non-expiring balance bucket of the selected pool. | Display as number format Lookup value from LAB table | -| **Pool Balance View/ Chi tiết số dư pool** The breakdown of the Pool in that row following: [Image Removed] 1. Each row is a bucket containing the remaining points earned by the Account/Card shown, and expiring on the date shown. Expired buckets but haven’t yet forfeited will be shown as well. 2. If Customer pool level then all Pools buckets of the customer are shown under each speparaty account even it is customer entity-level. 3. If Account pool level then all only the Pool buckets earned by the presented Account will be shown. 4. If Card pool level then only the Pool buckets earned by the presented card will be shown. | | | | -| | Account type/ Loại tài khoản | Combination of Product Account Type and Product Account level of Account | Display Lookup from Product\_Account table Lookup from Product\_Account number by ASN from LAB table. | -| | Account No/ Số tài khoản | Product Account Number | Display Lookup from Product\_Account number by ASN from LAB table. | -| | Card Number/ Số thẻ | Card number | Present for Card pool entity level only | -| | Pool ID/ Mã pool | Pool ID | Selected pool | -| | Balance / Số dư | Non zero balance | Display Loopkup value from LAB table. Group by Expiry date / LA/ASN/CSN/Pool ID | -| | Expiry Date/ Ngày hết hạn | Expring date | Display Loopkup value from LAB table | - -### Post – Codition - -N/A - -### Exception Flow - -N/A - -## Transaction History - -### Requirement Definition - -* + - 1. Transaction History is a tab under Customer profile. - 2. A transaction history is a running record of all of the transactions logged in OLS including cancellation transactions. - 3. Noted that: Transaciton hisstory listing depened on housekeep parameter. Nomarly It will show all transaction on the last 12 months. - -### Process Flow - -[Image Removed] - -### Trigger - -User would like to check transaction history of customer. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Transaction History” modules under “Customer Mangement” Group in order to view this screen. -2. User must select a customer in customer profile listing page to access the “Transaction History” tab. - -### Wireframe - -* + - * 1. Summary listing page - -[Image Removed] - -* + 1. Detail record - 1. Transaction Detail - -[Image Removed] - -* 1. Record status - -[Image Removed] - -1. Right panels - * + Quick view desribes expand information for this transaction. - + Click on each item to bring up the according tab - + Support scrollbar for pop-up detail view. - 1. Reward details - -[Image Removed] - -* 1. Item Redemption Transaction Details - -[Image Removed] - -* 1. Counter Transaction Details - -[Image Removed] - -### Business Rules - -* 1. Click on Transaciton History tab to list all transaction of the customer as illustrated in the [wireframe](#_Wireframe_3). - 2. One transaction detail record is combination of all input field (assinged to an OLS Reference No). - 3. Transaction history listing all transaction in OLS of customer include cancellation transactions. - 4. This screen just view only. There is no futher action. - 5. Use the filter to locate particular transactions, which will be listed in the display. - 6. Click a listed record to display the details of the transaction as illustrated in the following: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Account Detail/Chi tiết tài khoản** | | | | -| | Account Number/ Số tài khoản | Transacting Product Account Number | Display Lookup value from TRANSACTIONS table | -| | Product Account Type/ Loại tài khoản | Transacting Product Account Type | Display Lookup value from TRANSACTIONS table | -| | Product Account Level/Hạng tài khoản | Transacting Product Account Level | Display Lookup value from TRANSACTIONS table | -| | Card Number/ Số thẻ | Transacting Card Number | Display Lookup value from TRANSACTIONS table | -| **Transaction Detail/ Chi tiết giao dịch** | | | | -| | Invoice No/ Số hóa đơn | Internal invoice No generated by OLS system. | Unique for each transaction Display only Lookup value from TRANSACTIONS table | -| | Reference No/Số tham chiếu giao dịch | OLS Transaction Reference Number | Unique for each transaction Display only Lookup value from TRANSACTIONS table | -| | Source Reference Number | Reference number from source system For refrence only | Display | -| | OLS Transaction Code | OLS Transaction Code | Display Lookup value from TRANSACTIONS table | -| | Gross Amount/ Giá trị giao dịch gộp | Gross transaction amount | | -| | Nett Amount/Giá trị giao dịch ròng | Nett transaction Amount | | -| | Redeem points/Điểm đổi thưởng | Redeem points Total redeem points of the choosen transaction. The total point shoule equal to total redeem points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | -| | Points Redeemed Amount/ Giá trị điểm đổi thưởng | Redemmed point Amount Total redeem point amount of the choosen transaction. The total point shoule equal to total redeem point amount on each campaign rule which will be display on quick view. | | -| | Adjust Points/ Điểm điều chỉnh | Adjustment point Total adjustment points of the choosen transaction. The total point shoule equal to total adjust points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | -| | Points Adjustment Amount/ Giá trị điểm điều chỉnh | Adjustment points amount Total adjust point amount of the choosen transaction. The total point shoule equal to total adjust point amount on each campaign rule which will be display on quick view. | | -| | Award Points/ Điểm thưởng | Earned points Total award points of the choosen transaction. The total point shoule equal to total award points on each campaign rule which will be display on quick view | Display Lookup value from TRANSACTION table | -| | Points Awarded Amount/Giá trị điểm thưởng | Earned points amount Total award point amount of the choosen transaction. The total point shoule equal to total award point amount on each campaign rule which will be display on quick view. | -| | Transaction Date/Ngày giao dịch | Transaction Date Time | -| | Post Date/ Ngày đăng | Post Date | -| | Settlement Date/ Ngày ghi sổ | Settlement Date | -| | Cancellation Indicator/Chỉ thị hủy | Cancellation Indicator | -| | MCC | Transaction MCC Code | -| | Store/ Cửa hàng-đơn vị | Transaction Store ID | -| | Terminal / Cấp thiết bị đầu cuối | Transaction Terminal ID | -| | Transaction Description/Mô tả giao dịch | Transaction Description in OLS or Shop Name from external source system. | -| | Currency Code/ Mã tiền tệ | Currency code of the original transaction amount | -| | Country Code /Mã quốc gia | Country code of the original transaction. | -| | Transaction Mode/ Phương thức giao dịch | Mode of transaction at point of payment | -| | Transaction Channel /Kênh giao dịch | Transaction channel | -| | Salary Credit/ Chỉ báo tiền lương | Indicates bundled deposit account is receiving regular salary credits | -| | POS Entry Mode/ =tbd= | POS Entry Mode | -| | Reason Code/ Mã lí do | Adjustment reason code | For Adjustment transaction | - -1. Quick view in right panel displays the award, redeem, adjust and counter update details of the transaction including the campaign rules applied to the transaction and the Pool Units earned and redeemed. Click on each item to bring up the according tab. - 1. Award/Redeem/Adjust detail: Total balance in right panel should be equal to blanace which is displayed in transaction detail. This quick view displays the reward details of the transaction. - -| | | | -| --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Descriptions** | -| | Campaign Rule / Quy tắc chiến dịch | Campaign rule that transaction has been triggered This value may be empty if transaction does not trigger campaign rule | -| | Transaction Type/ Loại giao dịch | Transaction Type | -| | OLS Transaction Code/Mã giao dịch OLS | OLS Transaction Code | -| | Pool/ Pool | Reward Pool | -| | Pool Unit/ Đơn vị Pool | Award/Redeem/Adjust points Depended on transaction type | -| | Pool Unit Amount / Giá trị đơn vị Pool | Award/Redeem/Adjust points amount Depended on transaction type | - -* 1. Counter Transaction Detail: - + This part displays the counter value, which is updated by the transaction on each campaign rule. - -| | | | -| --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Descriptions** | -| | Campaign Rule / Mã quy tắc | Campaign rule that transaction has been triggered | -| | Counter / Bộ đếm | The counter for that transaction has been updated | -| | Entity / Cấp thực thể | Entity level of counter | -| | Counter Value/Giá trị bộ đếm | Counter Value | -| | Bucket Number/ Bộ đếm số | Counter bucket number which one is updated by this transaction. | -| | Bucket Start Date/ Ngày bộ đếm bắt đầu | The start date of the counter bucket for the updated counter has been changed | -| | Bucket End Date /Ngày bộ đếm kết thúc | The end date of the counter bucket for the updated counter has been changed | - -* 1. Item Redemption Transaction Detail - + This quick view displays the item redemption details of the transaction. - -| | | | -| --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Descriptions** | -| | Item / Mã vật phẩm | Item | -| | Descriptions/ Mô tả | Remark of the redemption transaction | -| | Redemmed quantity / Số lượng đổi thưởng | Redemmed quantity | -| | Redeemed points/ Điểm đổi thưởng | Redeemed points | -| | Cash Amount used/Số tiền đã dùng | Cash amount is used to redeem item. | - -### Post – Codition - -N/A - -### Exception Flow - -N/A - -## No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT - -### Requirement Definition - -* + - 1. In the nearest version, there is no screen to be tracking the transaction which did not trigger campaign rule by some reasons. - 2. In this version, we introduce a new screen under the 'Customer Management' module to track all non-eligible transactions (those that did not meet the rule criteria) or transactions with no linked rules - 3. A 'No-Hit Transaction' is a running record of all transactions sent to OLS to trigger a CP rule but not eligible for a campaign rule or incoming transactions with no linked campaign rule. If an incoming transaction hits Rule A but does not hit Rule B, this transaction will still appear on this screen for Rule B - 4. Noted that: Listing is depending on housekeep parameter. Nomarly It will show all transaction on the last 12 months. - -### Process Flow - -[Image Removed] - -### Trigger - -* + - * 1. User would like to verfiy why transaction did not hit campaign rules. - -### Pre-Conditions - -Incoming transactions trigger campaign but do not hit CP. - -User have to have access rights in both “Customer Profile” and “No hit CP- Transaction” modules under “Customer Mangement” Group in order to view this screen. - -User must select a customer in customer profile listing page to access the “No hit CP- Transaction” tab. - -### Wireframe - -Summary listing page - -[Image Removed] - -Detail view - -* 1. Record detail - -[Image Removed] - -* 1. Record status - -[Image Removed] - -### Business Rules - -* 1. Click on No Hit CP- Transaction tab to list all No-Hit CP transaction of the customer as illustrated in the [wireframe](#_Wireframe_15). - 2. One transaction detail record is one incoming transaction ( assinged to one Invoice No). - 3. Detail view screen will display all campaign rule which transaction trigger but does not hit. - 4. This screen just view only. There is no further actions. - 5. Use the filter to locate particular transactions, which will be listed in the display. - 6. Lookup no – hit transactions from OLS\_ORPHAN\_TXN\_NO\_HIT table for transaction which trigger campaign rule but not meet rule criteria OR transaction no linked any campaign rule. - 7. This screen should desribe detail why transactions do not hit CP rule such as if critertia do not meet then which criteria failed. TP should response detail the error description to can show in this screen. - 8. Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Account Information** | | | | -| | CIF Number | Transacted CIF Number If incoming transaction are not provided then lookup by Account/ Card which are provided. | Display | -| | Product Account No | Transacted Product Account Number and combination of Product Account Level and Product Account Type. If Incoming transaction are not provided then lookup by Card Number which is provided | Display | -| | Account Type | -| | Card number | Transacted Card Number | From incoming transaction | -| **Transaction Detail** | | | | -| | Invoice No | Unique Invocie No which generate by OLS system to determine unique incoming transaction. | Display | -| | Transaction Type | Transaction Type of CP rule AWD- Award RED- Redeem ADJ- Adjust | Display | -| | OLS Transaction Code | Transaction code which used to locate CP rule. | | -| | Transaction Date Time | Transaction Date and Time | Display as date time format. The date format must adhere to the configured format From incoming transaciton | -| | Transaction Amount | Transaction Gross Amount from incoming transaction for Award/Redeem transaction Adjust point for Adjustment transction | Display as number format 999,999,999.99 From incoming transaciton | -| | Corporate | Transaction corporate ID Lookup value from transaction store | Display | -| | Chain | Transaction chain ID Lookup value from transaction store | Display | -| | Store | Transaciton Store ID | Display From incoming transaciton | -| | Terminal | Transaction Terminal ID | Display From incoming transaciton | -| | Transaction MCC | Transaction MCC Id | Display From incoming transaciton | -| | Transaction Description | Transaction description | Display From incoming transaciton | -| | Currency Code | Currency code of the original transaction amount | Display From incoming transaciton | -| | Transaction Mode | Mode of transaction at point of payment | Display From incoming transaciton | -| | DCC indicator | DCC indicator From incoming transaciton If empty then mean for non -DCC transaction | Display | -| | Tap2Pay Indicator | Tap2Pay Indicator If empty then mean for transaction is not a Tap2Pay(token) transaction | Display | -| | Token Requestor ID | Token Requestor ID (mobile pay) 3rd party wallet providers (Apple Pay, Samsung Pay, Android Pay etc | From incoming transaciton | -| | Salary Credit | Salary Credit | From incoming transaction Indicates bundled deposit account is receiving regular salary credits | -| | POS Entry Mode | POS entry Mode | From incoming transaction | -| **CP Rule Listing** **Detail error description for each campaign Rule which incoming transaction trigger but do not hit this campaign Rule** | | | | -| | Campaign ID | Campain ID | Lookup value by Campaign Rule ID | -| | Campain Rule | Campaign Rule ID | Display | -| | Pool ID | The reward pool of campaign rule | Display Lookup value by Campaign Rule ID | -| | Error Code | Error response code from OLS | Display | -| | Error Descriptions | Error response description | Display | - -Post-condition - -* + - 1. User can adjust incoming transaciton to meet Campain Rule or explain to customer why they do not get reward. - -### Exception Flow - -N/A - -## Statement - -### Requirement Definition - -* + 1. Statement Enquiry is a list of all transactions for a customer/ account over a set period, usually monthly. The statement includes earned, redeemed and adjusted, as well as the beginning and ending balance for the period, along with any interest earned. - -### Process Flow - -[Image Removed] - -### Trigger - -User would like to review/verify statement detail of customer. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Statement Enquiry” modules under “Customer Mangement” Group in order to this screen. -2. User must select a customer in customer profile listing page to view customer profile and access the “Statement Enquiry” tab. - -### Wireframe - -* + - 1. Summary listing page - -[Image Removed] - -* + - 1. Detail view - 1. Record detail - -[Image Removed] - -* 1. Record status - -[Image Removed] - -### Business Rules - -* + 1. OLS statement output support Customer level and Account level, however statement records will be stored under Account level therefore Statement Enquiry show under Account level for both Statement Pool Entity level. - 2. Statement Enquiry includes all active statement records of statement pool. - 3. Statement records are updated by OLS batch jobs, so in administration functions (OA) only provides view in screens. There is no further actions. - 4. Click on Statement Enquiry tab to list all statement records of the customer as illustrated in the [wireframe](#_Wireframe_6). - 5. Click a listed record to display the details of the transaction as illustrated in the [wireframe](#_Wireframe_6). - 6. Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Statement detail** | | | | -| | Loyalty Account Number | Loyalty Account Number | Display Lookup value from STATEMENT table | -| | Product Account Number | Product Account Number | Display Lookup value from PRODUCT\_ACCOUNT table by ASN in Statement table. | -| | Account Type | Combination of Product Account Level and Product Account Type | -| | Pool ID | Statement Pool | Display Lookup value from STATEMENT table | -| | Cycle start date | Cycle start date time Provious statement cycle | -| | Statement Opening balance | Previous Statement Points Balance | -| | Total Award | Total earned points in this cycle | -| | Total Redeem | Total redemmed points in this cycle | -| | Total Adjust | Total Adjusted points in this cycle | -| | Statement Closing Blance | Accumualted points | -| | Expired points | Balance in expired buckets which have not yet been forfeited | -| | Last transaction Date | Last transaction post date on this cycle | -| | Cycle statement date | Cycle statement date time | -| **Transaction Detail** This part display all transaction of account/customer on each cycle. [Image Removed] Get data from TRANSACTION table where: * + 1. LA is LA of customer statement records. 2. Pool ID is statement pool 3. ASN is ASN of Account statement records. 4. Post date from Cycle Start Date upto Last Transaction Date 5. Without cancellation transaction 6. Points are not equal to 0 | | | | -| | Reference Number | OLS Reference Number | Display | -| | Transaction Type | Transaction Type of this transaction | Display Lookup value from Transaction table | -| | Unit | Earned/ Redeemed/Adjusted point Depended on transaction type Group by Reference No,Post Date,Transaction date and Txn type | -| | Post Date | Post Date time | -| | Transaction Date | Transaction Date Time | - -### Post – Condition - -N/A - -### Exception Flow - -N/A - -## Attribute - -### Requirement Definition - -* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according attribute: - 1. Customer profile screen dislays customer information and Customer attribute lisitng. - 2. Account Detail screen dislays Account information and Account attribute of customer. - 3. Card detail screen displays Card information and Card attribute of customer. - 1. In new OLS version Attribute will be displayed on separately tab under Customer profile module. - -### Process Flow - -[Image Removed] - -### Trigger - -* + 1. User would like to review/ verify attribute detail of customer. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Attribute” modules under “Customer Mangement” Group to able to view this screen. -2. Users must select a customer on the customer profile listing page to access the "Attribute Enquiry" tab. - -### Wireframe - -* + - 1. Summary listing page - -[Image Removed] - -Figure 1: Listing page - -[Image Removed] - -Figure 2: Filter - -* + - 1. Detail view - 1. Record detail - -[Image Removed] - -* 1. Record status and history - -[Image Removed] - -### Business Rules - -* + - * 1. Get data from ATTRIBUTE\_VALUE table. The attribute values inserted/update form OLS batch process (Attribute maintenance batchs or OMR batch job) OR can be updated by the Attribute maintenance batch as well as by Campaign Rules. - 2. This screen just display atribute value only. There is no further action. - 3. The Attributes listing screen is accessed from the Attribute Tab in the Customer profile module. Clicking on the Attributes Tab will bring up a listing of Attributes, as illustrated in the [wireframe](#_Wireframe_7). - 4. In this screen will display all attribute of customer including Customer attribute/Account attribute/ Card attribute. - 5. Clicking on the Attribute value row in listing page will bring up the attribute value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). - 6. Description of Attribute value detail field - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/Vn)** | **Description** | **Data type** | -| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity ID and Effect date. | | | | -| | Entity /Thực thể | Optional field Including: Client/Product\_Account/ Card If Client entity is selected then listing all customer attribute of customer. If Product\_Account entity is selected then listing all account attribute of customer. If Card entity is selected then listing all card attribute of customer. If Entity is not provided then get all attribute of customer which under Customer/ Account/Card entity level | Drop-down Allow multiple select. Default as empty | -| 2. | Effective Date From /Ngày bắt đầu có hiệu lực | Mandatory Listing attribute value during selected date frame. | Date time | -| 3. | Effective Date To/Ngày kết thúc hiệu lực | -| | Only effective records listed/Chỉ hiển thị các giá trị thực thể có hiệu lực | Use processing date to compare with attribute value effective date. If selected then only effective records listed If non-select then all attribute record including expired attribute value records listed | Check box Default as selected | -| **Attribute value detail field / Thông tin chi tiết thuộc tính** | | | | -| | Attribute Group/Nhóm thuộc tính | Attribute group of attribute | Display Lookup value from ATTRIBUTE\_MAINTENANCE table by Attribute ID | -| | Attribute ID/ID thuộc tính | Attribute ID | Display Lookup value from ATTRIBUTE\_VALUE table | -| | Attribute Name / Tên thuộc tíng | Attribute Name | Display Lookup value from ATTRIBUTE\_MAINTENANCE table by Attribute ID | -| | Entity / Thực thể | Entity level of attribute Indicates the Entity to which this Attribute belongs Client: Customer Product\_Account : Account Card: Card | Display Lookup value from ATTRIBUTE\_MAINTENANCE table by Attribute ID | -| | Entity ID/ ID thực thể | The identifier for the Entity to which the Attribute value in this record belongs. If Entity is : • “Product\_Account”, this field contains the PA Number • “Card”, this field contains the Card Number • “Client”, this field contains the CIF Number * “Store”, this field contains the Store ID * ……etc…. | Entity value will be : * + 1. CSN for customer attribute. 2. ASN for account attribute 3. PSN for Card attribute. Use Entity and Entity\_ID of attribute for lookup according value: | -| | Account Type/ Loại tài khoản | Combinaiton of Product Account Level and Product Account Type of Account attribute. Present for Account attribute only | Display Lookup value from PRODUCT\_ACCOUNT table | -| | Attribute value /Giá trị thuộc tính | Attribute value | Display Lookup value from ATTRIBUTE\_VALUE table | -| | Effective Date From/ Ngày bắt đầu có hiệu lực | Start date of the effective period for the Attribute value | -| | Effective Date To/Ngày kết thúc hiệu lực | End date of the effective period for the Attribute value | -| **List of Campaign/Danh sách chiến dịch** **This appear when user click to view detail of any record** [Image Removed] | | | | -| | Campaign ID/ID chiến dịch | Campaign ID which reference to Campaign Rule | Display Lookup value from “Campaign Rule screen” | -| | Campaign Name | Name of Campaign | Display Refer to “Campaign “ API under Campaign Management Lookup value from “Campaign” table. | -| | Campaign Rule | Campaign Rules which reference to this attribute | Display Lookup value from “Campaign Rule” screen to list all campaign rules which includes this attribute on at least following items: * + 1. Attribute Criteria 2. Formula 8 3. Formula 7 4. Award limit | -| | Campaign Rule Name | Name of Campaign rule | Display Lookup value from “Campaign\_Rule” tablle Refer “Campaign Rule” API under Campaign Management | -| | Effect date | The Effect date of Campaign Rule Dislay both Effective from date and effective to dat e | Display The date format must adhere to the configured format | - -### Post-Conditions - -N/A - -### Exception Flow - -N/A - -## Counter - -### Requirement Definition - -* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according Counter: - - Customer profile screen dislays customer information and customer -level counter listing - - Account Detail screen dislays Account information and account -level counter of customer. - - Card detail screen displays Card information and card -level counter of customer. - 1. In new OLS version Counter will be displayed on separately tab under Customer profile module. - -### Process Flow - -### Trigger - -* + 1. Users would like to review and verify the counter detail of the customer. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Counter” modules under “Customer Mangement” Group in order to view this screen. -2. Users must select a customer on the customer profile listing page to access the "Counter " tab. - -### Wireframe - -* + - 1. Summary listing page - -[Image Removed] - -Figure 1: Listing page - -[Image Removed] - -Figure 2: Filter - -* + - 1. Record detail - 1. Record detail view - -[Image Removed] - -* 1. Record status - -[Image Removed] - -### Business Rules - -* + - * 1. Get data from the table that updates the counter value (Campaign\_Counter table). The counter values are inserted/updated from the OLS batch process that triggers the Campaign Rules as well as the OA screen. - 2. This screen just displays counnter value only. There is no further action. - 3. The Counter Detail listing screen is accessed from the Counter Tab in the Customer profile module. Clicking on the Counter Tab will bring up a listing of the counter, as illustrated in the [wireframe](#_Wireframe_8). - 4. In this screen will display all counter bucket for the chosen customer, including Customer-level counter/Account -level counter/ Card- level counter. - 5. Clicking on the Counter value row in listing page will bring up the counter value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). - 6. Description of Counter value detail field: - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | -| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity level and Counter bucket period | | | | -| | Entity /Thực thể | Optional field Including: **Customer [CU]/ Account [PA] /Card [CA].** If “Customer[CU]“ is selected then listing all customer -level counter of customer. If “Account [PA]” is selected then listing all account- level counter of customer. If “Card [CA]”is selected then listing all card -level counter of customer. If Entity level is not provided then get all counter level of customer which under Customer/ Account/Card entity level. | Drop-down Allow multiple select. Default as empty | -| 2. | Bucket Start Date / Ngày bắt đầu | Mandatory Listing counter value during selected date frame. | Date | -| 3. | Bucket End Date/ | -| | Only effective records listed/Chỉ hiện thị counter hiện tại | Use processing date to compare with counter bucket period. If selected then only effective records listed. Use processing date to determine the effective of the counter bucket. If non-select then all counter value record including expired counter records listed | Check box Default as selected | -| **Counter value detail field** | | | | -| | Counter/Bộ đếm | Counter | Display | -| | Entity /Cấp bộ đếm | Entity counter level Cust- CU Account – PA Card – CA | Display | -| | Entity ID/ID thực thể | The identifier for the Entity to which the counter value in this record belongs. If Entity is : • “Account”, this field contains the Account Number • “Card”, this field contains the Card Number • “Customer”, this field contains the CIF Number | Display | -| | What to count/ Tiêu chí đếm | The data entity that is to be counted or tracked | Display | -| | Counter Value/Giá trị bộ đếm | Counter value | Display as number format | -| | Bucket start date | Start date of the bucket period for the Counter value | Display as date format | -| | Bucket end date | End date of the bucket period for the Counter value | Display as date format | -| | Counter state/Tình trạng bộ đếm | Counter state A: Awared C: New | Display Show state code only | -| **Counter Statistic / Tổng hợp bộ đếm** [Image Removed] **This part will list the details of the counter history statistics for the chosen counter bucket in the listing page** | | | | -| | Reference No/ Số tham chiếu giao dịch | OLS Transaction Reference Number | Display | -| | Post Date /Ngày đăng | The post date of the transaction | Dipslay as date time format The date format must adhere to the configured format | -| | Counter Value/Giá trị bộ đếm | Counter value which is updated on this transaction | Display as number format | -| | Bucket Number/Số bộ đếm | The bucket number of selected counter | Display as interger number format | -| | Update Date | The system date when counter value is updated | Dipslay as date time format The date format must adhere to the configured format | -| | Updated by | The batch/User who post the transaction that make counter value is changed. | Display | - -### Post-Conditions - -N/A - -### Exception Flow - -N/A - -## Adjustment - -### Requirement Definition - -1. Adjustment transactions can be manually posted through the Customer Management module in the administration screen function under. -2. This screen display all manually adjustment transaction of customer. - -### Process Flow - -[Image Removed] - -### Trigger - -* + 1. User would like to review/ verify manually adjustment transaction of customer. - 2. There is some wrong in balance of customer then user have to manually adjust via OA screen. - -### Pre-Conditions - -1. User have to have access rights in both “Customer Profile” and “Adjustment Entry” modules under “Customer Mangement” Group in order to view this screen. -2. Users must select a customer on the customer profile listing page to access the "Adjusment Entry" tab -3. Depending on the user’s access rights, they can view/edit/add or approve manually Adjustment transaction records. - -### Wireframe - -* + - 1. Summary listing page - -[Image Removed] - -* + - 1. Active record - -Record detail - -[Image Removed] - -[Image Removed] - -1. Create/Edit form - -Create /Edit mode - -[Image Removed] - -[Image Removed] - -* + - After selected/inputted card/Account/CIF click to quick view icon to see right panel information - -[Image Removed] - -### Business Rules - -1. While under “Transaction Management” module in the administration screen function, manually adjustment transaction can be posted for any customer then in “Customer management”module manually adjustment transaction can be posted for selected customer only. -2. Click on the Adjustment Entry tab in the “Customer Profile “sreen to bring up the screen for accessing the Adjustment Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_9). -3. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Adjustment Entry screen is illustrated in the [wireframe](#_Wireframe_9). -4. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. -5. User stories and acceptance criteria - -[Image Removed] - -1. Screen desscriptions - -| | | | | | -| --- | --- | --- | --- | --- | -| **Index** | **Field** | **Desscription** | **Data type** | | -| **Adjustment detail** | | | | | -| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: CIF number/ Account / Card must be provided | Radio button Default posted by Card Look up value from master data | | -| | | | Under Customer management module | Under Transaction Management module | -| | Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Customer” API under Customer Management | -| | Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. Refer “==tbd== “ API | Drop-down Select one List all account level in the OLS system. Refer “Product Account Level” API under Code Maintenance service | -| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. Refer “==tbd== “ API | Drop-down Select one List all account type in the OLS system by selected Account level. Refer “Product Account Type” API under Code Maintenance service | -| | Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer Refer “Account “ API under Customer Management service | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Product Account” API under Customer Management. | -| | CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. Refer “Customer Profile” API under Customer Management. | -| | Quick view/Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF is invalid.t With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: [Image Removed] With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: [Image Removed] | Hyperlink/Icon | | -| | Adjustment Quantity is +ve/-ve \*/ Điều chỉnh âm/dương | Indicates whether the adjustment is a positive adjustment or a negative adjustment | Drop-down Select one Lookup value from “Code\_Management” table Refer “list-by-code-type” API with code type is “adj-type” | | -| | Store \*/Đơn vị/Cửa hàng | The store of transaciton | Drop-down Select one Lookup active Store record from “Store” screen Refer “Store” API under Merchant Managemant. | | -| | Pool Id \*/Mã pool | The pool to be adjusted Should respect pool entity level For example: Cant posted txn by Account if pool to be adjusted is card- entity level pool. | Drop-down Select one | | -| | Transaction Date\*/Ngày giao dịch | Transaction date | Time picker within time also DD-MM-YYYYY HH:MM:SSS Allow user input from keybroad | | -| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been adjusted. Present for postive adjustment only Show the balance bucket based on transaciton Date and expire policy of adjusted pool. When update transaction date / Card number (Account /CIF) OR Pool then this value should be automation updated. Allow user modify this value | Time picker without time DD-MM-YYYY Allow user input from keybroad | | -| | Bucket Expiry Date/ … | This is the expiry date of the bucket will be deduct poitn. Present for negative adjustment only If not selected then follow by TP processing for Redemption/Negative adjustment approach. If selected then just adjust on the selected bucket. | Drop-down Select one Loopkup value from customer balance based on adjusted pool/selected card. | | -| | Adjustment Quantiy \* /Số lượng điều chỉnh | The pool units by which to adjust the pool balance. | 9(12,2) Should be greater than 0 if provided | | -| | Reason Code \*/Mã lí do điều chỉnh | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the adjustment. | Drop-down Lookup value from Reason Code screen | | -| | Transaction Code \*/Mã giao dịch | OLS transaciton code of transaction | Drop- down Lookup value from OLS Transaction Code screen | | -| | Remarks/Ghi chú | A description of the adjustment. | X(100) | | -| **Quick view** **Balance Detail View** [Image Removed] Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | -| | Pool ID | Pool ID | Lookup value from LAB table | | -| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | -| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | -| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | -| **Bucket Balance Detail View** [Image Removed] The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | -| | Account number | Product Account No | Display Present for all pool entity-level | | -| | Product Account Type | Combination of Product Account Type and Product Account level of Account | -| | Product Account level | -| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | -| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | -| | Balance | Non zero balance | Display Loopkup value from LAB table. | | -| | Expiry Date | Expring date | Display Loopkup value from LAB table | | - -* + - 1. Edit Action just be applied for Pending/Rejected record. - 2. For Active Record just view only. - 3. After the transaction has been saved, it is put in the pending tab. - 4. An authorised user has to retrieve the transaction and approve it before it is processed and pool is updated: - -**Based on entity level/account selection alog** - -* 1. For postive adjustment transaction then: - + If have negative balance bucket then adjusted point used to offset negative balance bucket to 0 first. - + The remaining points will be added for selected bucket. - 2. For negative adjustment transaction then: - -[Image Removed] - -* + - 1. Approved transaction is putted in the active tab. - -### Post-Conditions - -* + - Pool balance buckets are updated. - - Transaciton is posted and viewable on the transaction history screen. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … - -## Transfer balance - -### Requirement Definition - -1. Transfer balance transactions can be manually posted through the Customer Management module in the administration screen function under. -2. Change in UI/UX and change to support both user can transfer balance from their account to other customer or transfer between its own self. - -### Process Flow - -[Image Removed] - -### Trigger - -* + 1. The user would like to review/verify the manually transferred points from a customer to another customer or between the customer's own accounts/cards. - -### Pre-Conditions - -1. User have to have the access rights in both “Customer Profile” and “Transfer Balance” modules under “Customer Mangement” Group in order to view this screen. -2. Users must select a customer on the customer profile listing page to access the "Transfer Balance" tab. -3. Depending on the user’s access rights, they can view/add/Edit or Approve manually transfer points transaction records. - -### Wireframe - -* + - 1. Summary listing page - -[Image Removed] - -* + - 1. View detail form - -[Image Removed] - -* + - 1. Create/Edit form - -[Image Removed] - -### Business Rules - -1. Click on the “Transfer Balances” tab in the “Customer Profile “screen to bring up the screen for accessing the Transfer Points listing page. The detail is illustrated in the [wireframe](#_Wireframe_10). -2. Click on the Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the Transfer Balance screen is illustrated in the [wireframe](#_Wireframe_10). -3. Noted that the Edit icon (!) and Delete icon just display for pending and rejected records only. -4. The point transfer function will transfer all pools linked directly from the “From” to the “To”. -5. Expiry Dates will be preserved unless a specific date is provided. -6. User stories and acceptance criteria - -[Image Removed] - -1. F**orm descriptions:** - -| | | | | -| --- | --- | --- | --- | -| **Seq** | **Field** | **Descriptions** | **Data type** | -| | Transfer mode \*/ Phương thức điều chuyển | Use transfer mode to determine the relationship between from transfer source and the transfer destination. Check on the “Internal” mode to transfer balances itself. Check on the “External” mode to transfer the balance from a customer to another customer in the OLS system. Use Application Parameter to allow/disallow transfer mode: Apply both or only Internal or only external | Radio button Default “Internal” transfer Lookup value from “Code\_Management” table where code type is ‘transfer-mode’. Refer “list-by-code-type” API under Master Data. | -| | Transfer Type\*/Loại điều chuyển | Condition field Depend on Transfer Mode to disable/enable as follows: Note: “X” stands for enable | | | | | | --- | --- | --- | --- | | **Transfer mode** | **Transfer Type disable/enable** | | | | **Card** | **Account** | **Client** | | Internal | X | X | | | External | X | X | x | | Radio button Default “Card”. Lookup value from “Code\_Management” table where code type is ‘entity-lvl’. Refer “list-by-code-type” API under Master Data. | -| | From \*/Từ | A card/Account/CIF number must be present which depends on the transfer mode. | Drop-down Select one | -| | Product Account Type /Hạng tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account type of the selected source account | Drop-down Select one | -| | Product Account level /Cấp tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account level of the selected source account | Drop-down Select one | -| | Quick view/Xem nhanh | Click on each quick view icon to retrieve the available balances of the customer after entering/selecting the card number. The details will be displayed in the right panel. See more in the Quick view part Show an error message if the Requesting Card is invalid. With Edit/Create mode the system will expand/collapse on the same screen to user can see and continue input needed information but with View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon See more in Quick view part | Hyperlink | -| | To \*/Đến | Card /Account/CIF number must be present which depened on transfer mode. If Transfer Type is “Account” then Account type is present. | Drop-down Select one | -| | Product Account Type /Hạng tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout type of selected destination Account | Drop-down Select one | -| | Product Account level /Cấp tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout level of selected destination Account | Drop-down Select one | -| | Pool ID\*/Mã pool | The pool from which to transfer Just show the pool of “From” balance buckets as following: X: Display | | | | | | --- | --- | --- | --- | | **Transfer Type** | **Pool balance bucket of “From” Customer.** | | | | **Pool Level Card** | **Pool level Account** | **Pool Level cust** | | Card | X Display distinct Card- entity Pool of balance bucket of Inputed card only | X Display distinct account -entity Pool of balance bucket of Account of Inputed card | X Display distinct customer -entity pool of balance bucket of customer of inputed card | | Account | | X Display distinct account- entity Pool of balance bucket of inputed account only | X Display distinct customer- eintiy pool of balance bucket of customer of inputed account | | Client | | | X Display distinct customer-entity pool of balance bucket of inputed CIF Number | | Drop- down Based on Transfer Type and “From” to lookup pool from LAB and Pool Definition table. | -| | Store\*/Cửa hàng-Đơn vị | The store which transaciton is logged | Drop -down Lookup value from Store screen- Store table. Refer “Store” API under Merchant Management | -| | Amount to Transfer \*/Mức điều chuyển | The amount to transfer. Defaults to the whole pool balance. | 9(14,2) Should be greater than 0 if provided | -| | Expiry Date (after transfer)/Ngày hết hạn | The expiry date of the points after the transfer. By default the expiry date will be the source expiry date. | Date time | -| | Transaction Code\*/Mã giao dịch | OLS transaction code which transaction is logged | Drop -down Lookup value from OLS TC screen. Refer “OLS Transaction Code” API under Campaign Management | -| | Reason Code \*/Mã lí do điều chuyển | Select from a list of pre-defined codes to identify the reason for the transfer | Drop-down Lookup value from Reason Code screen (Reason\_Code table). Refer “Reason Code” API under Code Maintenance | -| | Remarks/Ghi chú | Remarks to be appended to the transaction, for reference | Text box X(100) | -| **Bucket Balance Detail view of Source** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | -| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | -| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | -| | Product Account level/Cấp tài khoản | -| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | -| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | -| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | -| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | -| **Bucket Balance Detail view of Destination** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | -| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | -| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | -| | Product Account level/Cấp tài khoản | -| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | -| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | -| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | -| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | - -1. After the transaction has been saved, it is put in the pending list. -2. An authorised user has to retrieve the transaction and approve it before it becomes effective. -3. OLS will validate the status permission and block code permission for both “From” and “To”, the transfer transaction will be rejected if any permission disallowed to perform adjustment. -4. Transfer transaction will be rejected if Pool balance of “From” is insufficient. -5. The Approved transfer transaction is logged as Adjustment transactions and following by TP processing: - 1. Each bucket in the “From” is transferred as a negative adjustment to the “From” and logged as a positive Adjustment to the “To”. - 2. The Reason Code will be selected from a list of Adjustment Reason codes. - 3. The Adjustment Reason Code is important for determining the GL posting accounts. - -### Post-Conditions - -* + 1. Pool balance buckets are updated. - -### Exception Flow - -* + 1. Pool balance of “From” is insufficent. - 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … - 3. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Re-instatement - -### Requirement Definition - -1. This screen is used to re-instatement for expired balance bucket which have not been forfeited. -2. If balance have been forfeited, then “re-instatement” does not apply and an adjustment transaction should be used to return points to the customer. - -### Process Flow - -[Image Removed] - -### Trigger - -* + - 1. User want to review/verify Re-Instatement transaction - 2. User want to re-instate expired bucket. - -### Pre-Conditions - -1. User have to have access righsts in s both “Customer Profile” and “Re-Instatement” modules under “Customer Mangement” Group in order to view this screen. -2. Users must select a customer on the customer profile listing page to access the "Re-Instatement" tab. -3. Customers have pool expired bucket which have not been forfeited. -4. Depending on the user's access rights, they can view, add, edit, or approve manually Re-Instatement Transaction records. - -### Wireframe - -* 1. Summary listing page - -[Image Removed] - -* 1. Record detail view - -[Image Removed] - -* 1. Create/Edit form - -[Image Removed] - -### Business Rules - -1. Click on the “Re-Instatement” tab in the “Customer Profile “sreen to bring up the screen for accessing the Re-Instatement listing page. The detail as illustrated in the [wireframe](#_Wireframe_11). -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_11). -3. User stories and acceptance criteria - -[Image Removed] - -1. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. -2. Form description: - -| **Seq** | **Field** | **Description** | **Data type** | | -| --- | --- | --- | --- | --- | -| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | -| | | | **Under customer management** | **Under Transaction Management** | -| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | -| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | -| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | -| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | -| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | -| | Quick view /Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available/expired balances of the customer after entering the customer information. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF are invalid. With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: [Image Removed] With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: [Image Removed] | Hyperlink | | -| | Store \*/Cửa hàng\_Đơn vị | Store | Drop -down Select one | | -| | Pool Id \*/Mã pool | The pool to be adjusted. The pool of the bucket to Re-instate. Just list the pool have balance which has already expired, but are still within the grace period (haven’t forfeited), while respecting the pool entity-level based on transfer mode. E.g Use account to re-instate then cant select card pool entity-level | Drop-down Select one | | -| | Bucket to Re-instate \*/Số lô cần gia hạn | The drop-down displays the expired buckets of the selected pool which have not been forfeited The bucket to be re-instated must be selected individually and the new expiry date must be provided in the “Expiry Date” field. | Drop-down Select one Lookup value based on LAB table. | | -| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been re-instated. | Date The date format must adhere to the configured format | | -| | Reason Code \*/Mã lí do | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the re-instatement. | Drop-down Select one Lookup value from Reason Code screen with Reason type is Re-instatement Refer “Reason Code” API under Code Maintenance | | -| | Remarks/Ghi chú | Additional remarks on the re-instatement. | X(100) | | -| Quick View Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | -| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card. | | -| | Balance /số dư | Total Expired balance | -| | Expiry Date/Ngày hết hạn | Expiry date | -| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | -| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | -| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | -| | Product Account level/Cấp tài khoản | -| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | | -| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | -| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | -| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | - -1. After the transaction has been saved, it is put in the pending list. -2. An authorised user has to retrieve the transaction and approve it before it becomes effective. -3. The re-instatement will be posted as an Adjustment, with the Reason Code set to the selection. -4. The balance in the expired buckets will be set to 0. -5. If the bucket with the required expiry date exists, the adjustment amount will be added to the bucket. -6. Otherwise, a new bucket with the new expiry date as entered in the Re-instatement edit form is created with the balance from the expired bucket. - -### Post-Conditions - -### Exception Flow - -* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation … - 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Item Redemption - -### Requirement Definition - -1. Customers call the customer service (call center) and requests to redeem an item, giving identification and item code. -2. Item redemption requests are processed against the catalogue item set-up parameters. The details are described against the relevant parameter in the catalogue item set-up description in section 7. -3. All redemptions are in real-time. -4. Redemption through administration screens that requires approval is real-time only at time of approval. - -### Process Flow - -[Image Removed] - -### Trigger - -* + - 1. Users use this screen to assist customers in exchanging points for items. - 2. Users want to review and verify the redemption item transaction details of customers, which includes all online transactions via the OA screen or M as well. - -### Pre-Conditions - -1. Users have to have access rights in both “Customer Profile” and “Item Redemption Entry” modules under “Customer Mangement” Group in order to view this screen. -2. Users must select a customer to access the “Item Redemption Entry” tab. -3. Depending on the user's access rights, they can view, add, edit, or approve manually Item Redemption Transaction records. - -### Wireframe - -* 1. Summary listing page - -[Image Removed] - -* 1. Record detail view - -[Image Removed] - -Click on each item to bring up item detail view - -[Image Removed] - -* 1. **Create** - -**Step 1: Add General information** - -[Image Removed] - -[Image Removed] - -**Step 2: Add Physical /Evoucher item** - -[Image Removed] - -[Image Removed] - -**Step 2: Add Miles item** - -[Image Removed] - -[Image Removed] - -**Step 2: Add cash rebate item** - -[Image Removed] - -[Image Removed] - -**Step 2: Add other items** - -[Image Removed] - -[Image Removed] - -### Business Rules - -1. Click on the “Item Redemption Entry” tab in the “Customer Profile “screen to bring up the screen for accessing the Item Redemption Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_12). -3. User can’t modify transaction after transaction is posted. -4. User stories and acceptance criteria - -[Image Removed] - -1. Screen descriptions: - -| | | | | | -| --- | --- | --- | --- | --- | -| **Seq** | **Field** | **Description** | **Data type** | | -| **General information** | | | | | -| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from master data | | -| | Condition fileds as following descriptions | | **Under customer management** | **Under Transaction Management** | -| Card Number/Số thẻ | Any card belonging to the customer can be used for making a redemption Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | -| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of the choosen customer. | Drop-down Select one List all account level in the OLS system. | -| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the choosen customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | -| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | -| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | -| | Quick view /Xem nhanh | Click on each quick view icon (Balance Detail or Buket Balance Detail View Or Expired Balance View) to retrieve the available balances of the customer after entering the card number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card invalid. | Hyper link | | -| | Redemption Channel \*/Kênh đổi thưởng | Redemption Channel | Drop-down Select one Lookup value from master data | | -| | Redemption Date \*/Ngày đổi thưởng | The redemption transaction date | Date time Date time format must respect the date configuration format | | -| | Store\*/Đơn vị | The drop-down list to select any acitive Store in the OLS. Redemption Transaciton will be logged under this store. | Drop -down Select one | | -| | Appliable Fee/ Áp dụng phí | The fee will be applicable for this transaction if item has a fee See more about fee on Item price section. | Switch button Default OFF | | -| **Item details** | | | | | -| | Catalogue Code\*/Nhóm vật phẩm | The drop-down to select the effected catalog | Drop – down Select one Use Redemption Date to determine effected catalogue. | | -| | Item\*/Vật phẩm | The drop-down to select the item code to be redeemed. The item must belong to the selected catalogue. Display an error message if item has no matched price. | Drop-down Select one Use Redemption Date and selected catalogue to determine effected item. From selected item and inputed data to determine price of the item. Please refer Item price to get more detail | | -| | Redemption Mode\*/Loại đổi thưởng | A drop-down list with the following choices: * Fixed Partial (Cash + Points) * Fixed Points If Price configuration did not allow Partial Redeem then just Fixed Partial is disable. If Price configuration allow “Partial Redemption” mode then both mode are enable. | Radio button Defaut fixed points Look up value from master data | | -| | Unit Price \*/Giá mỗi đơn vị | Point required **For Fixed points Mode then this is Price in point in item price configuration and user can’t change.** **For Fixed Partial Mode, the sytem must automation populate than “Minimum Partial Redeem Points” in item price configuration and user can modify this value but Unit Price must be equal to or greater than “Minimum Partial Redeem Points”.** | 9(12,2) | | -| | Unit Cash Amount required./Tiền phải trả mỗi đơn vị | Condition field This field is only active and required Fixed Partial mode only. The system must automation populate as: ( **Full Price in Point – Unit Price** ) \* **Price in Cash (per point) ( from item Price Configuration)** | Display | | -| | Unit Face value/Giá trị mỗi đơn vị | Condition field Active only when this item required face value on the configruration **Get face value from Item price cofiguration with higher priority. Otherwise this is base face value from item master.** | Display as 9(14,2) format | | -| | Quantity on hand/Số lượng còn lại | Available item can be redeemed. Just display if the item is tracked by quantity. | Display as 9(9) format | | -| | Redemption Quantity\*/Số lượng đổi thưởng | Redemption quantity If the item is tracked by quantity, then the redemption quantity must not be greater than the quantity on hand. Don’t allow to redeem if redemption quantity is greater than quantity on hand | 9(5) Should be greater than 0 if provided | | -| | Total price\*/Tổng cộng | **The system must automation populate as Unit Price \* redemption quantity** | Display | | -| | Total Cash amount required/Tổng tiền phải trả | Condition field This field is only active and required Fixed Partial mode only. **The system must automation populate as** **Unit Cash Amount required\* Quantity.** | Display | | -| | Total face value/ Tổng giá trị | Condition field. Active only when this item required face value on the configruration **The system must automation populate as** **Unit Face value \* redemption quantity** | Display as 9(14,2) format | | -| | FFP Ship number/ Mã số thẻ | FFP ship number | X(50) Condition fields Display and required for Miles items and should be configurable. Automation populate value from Attribute value based on configuration attribute ID and allow user modify this one. These fields to be used to send to partner. | | -| | FFP First Name/Tên | FFP First Name | -| | FFP last name /Họ | FFP last name | -| | Delivery Address/Địa chỉ | Delivery Address 1 Condition field Only active for Evoucher item and Physical item Auto populate from customer’s address 1 and allow user modify. | X(100) | | -| | Zip code/Mã bưu điện | Zip code Condition field Only active for Evoucher item and Physical item. Auto populate from customer’s Zip code and allow user modify. | Drop-down Select one | | -| | Recipient Name/Người nhận | Recipient Name Condition field Only active and required for Evoucher item and Physical item. Auto populate from customer’s Full Name and allow user modify. | X(50) | | -| | Email adress /Địa chỉ email | Email address Auto populate from customer’s email and allow user modify. | X(50) | | -| | Mobile Phone/Số điện thoại | Mobile Auto populate from customer’s email and allow user modify. | X(50) | | -| | Remark/ Ghi chú | Additional remarks on the item redemption transaction | X(100) | | -| **Quick view** **Balance Detail View** [Image Removed] Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | -| | Pool ID | Pool ID | Lookup value from LAB table | | -| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | -| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | -| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | -| **Bucket Balance Detail View** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | -| | Account number | Product Account No | Display Present for all pool entity-level | | -| | Product Account Type | Combination of Product Account Type and Product Account level of Account | -| | Product Account level | -| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | -| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | -| | Balance | Non zero balance | Display Loopkup value from LAB table. | | -| | Expiry Date | Expring date | Display Loopkup value from LAB table | | -| Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | -| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card/Account/Customer | | -| | Balance /số dư | Total Expired balance | -| | Expiry Date/Ngày hết hạn | Expiry date | -| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | -| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | -| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | -| | Product Account level/Cấp tài khoản | -| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card os present. | | -| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | -| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | -| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | - -### Post-Conditions - -* + 1. Transactions are logged into the related table in the database. The transaction listing includes not only transaction which to be posted under the OA but also transaction to be posted from the member site. - 2. Balance are updated. Quantity on hand are updated if transaction is posted successfully in the system. - 3. The net transaction of the redemption transaction is the sum of the tax amount, total fee, and total cash required. - 4. At the end of day (EOD), all approved items include are output in a OLS output file to be sent to parnter to be tracking or created back to the account/customer used in the item redemption, etc. - 5. TP process to approve Transaction - -[Image Removed] - -### Exception Flow - -* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation… - 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Award Transaction - -### Requirement Definition - -### Process Flow - -Process follow for award transaction (Award service on TP side: ) - -[Image Removed] - -### Trigger - -### Pre-Conditions - -### Wireframe - -* + - 1. Create /Edit - -[Image Removed] - -### Business Rules - -1. Click on the “Award Transaction” tab in the “Customer Profile” screen to bring up the screen for accessing the Award Transaction Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). -2. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_10). -3. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. -4. User stories and acceptance criteria - -[Image Removed] - -1. Screen descriptions: - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Descriptions** | **Data type and data source** | -| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | | -| | Condition fileds as following descriptions | | Under Customer profile | | Under Transaction Management | -| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | | -| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | | -| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | | -| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Account number to find card. | | -| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | | -| | Quick view | Click on each quick view icon “Balance” to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: [Image Removed] With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: [Image Removed] | Hyperlink | | | -| | Transaction Code\* /Mã giao dịch | OLS Transaction Code This TC is used to locate the Campaign Rule to use for processing. | Drop-down Select one Lookup value from “Transaction\_Code” table. Refer “OLS Transaction Code” API under Campagin Management | | | -| | Transaction Date \*/Ngày giao dịch | Must be valid date. Transaction rejected if not valid. Transaction rejected if this date is older than sysdatetime by N days, where N is a system setting. | Date time | | | -| | Source Reference Number/Số giao dịch gốc | Source Transaction Reference Number Unique transaction identifier from source system | X(20) | | | -| | Store\*/Đơn vị/Cửa hàng | Transaction Store Id | Drop-down Select one Lookup value from “Store” table Refer “Store” API under merchant management | | | -| | Terminal /Thiết bị đầu cuối | Transaction Terminal Id | Drop-down Select one Lookup value from “Terminal” table Refer “Terminal” API under merchant management | | | -| | Transaction Amount\*/ Giá trị giao dịch | Transaction Gross amount Note: It is dependent on each project, Lets it be gross transaction amount first. | 9(14,2) Should be greater than 0 if provided | | | -| | Transaction Description/ Mô tả giao dịch | Shopname from Source system or OLS transaction description | X(100) | | | -| | Transaction Currency Code/ Mã tiền tệ giao dịch | It can be anpha code or number code. Let’s it be anpha code first | Drop-down Select one Lookup data from “Currency\_code” table Refer “Currency Code” API under Code Maintenance | | | -| | Transaction Mode/Phương thức giao dịch | Mode of transaction at point of payment | Radio button Lookup value from “Code\_Management” table where code type is “txn-mode’. Refer “get-by-code-type” API under master data | | | -| | POS Entry Mode/Phương thức thiết bị bán hàng | POS Entry Mode | X(04) This field is subdivided as follows: 0 – Unknow , 1- Manual (key entered) 3- Bar code ---Etc | | | -| | MCC code/Mã MCC | Merchant category code | Drop-down Select one Lookup value from “MCC” table Refer “MCC” API under merchant management | | | -| | Country Code/Mã quốc gia | Country code | Drop-down Select one Lookup value from “Country\_Code” table Refer “country code”API under Code Maintenance | | | -| | Salary Crediting Indicator/ Tài khoản nhận lương | Indicates bundled deposit account is receiving regular salary credits | Switch button Default OFF | | | -| | Transaction Channel/Kênh giao dịch | Transaction channel | Drop-down Select one Lookup value “Code\_Management” table where type code is “txn-channel” Refer “get-by-code-type” API under master data | | | -| **Quick view** **Balance Detail View** [Image Removed] Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | | -| | Pool ID | Pool ID | Lookup value from LAB table | | | -| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | | -| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | | -| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buck Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | | - -### Post-Codition - -Refer Process flow to get more detail for post-conditon when transaction is approved. - -### Exception -flow - -* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation. - 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - +## Customer management + +### Customer profile + +#### Requirement Definition + +1. OLS administration screens include a “Customer Profile” function to view Customer details. +2. Customer records are view-only, and can only be updated from source systems by batch ==TBD=== + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. User want to verify/ get customer’s information. + +#### Pre-Condition + +1. User have to have the access right on both “Customer Profile module under “Customer Mangement” Group. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + - * 1. Filter + +![](data:image/png;base64...) + +* + - * 1. Create/Edit mode + +1. ![](data:image/jpeg;base64...) + * + - 1. Detail view + +![](data:image/png;base64...) + +#### Business rules + +1. Click on Customer Profile icon in Main Menu to list customer records, as illustrated in the [wrireframe](#_Wireframe_13). +2. Use the filter to locate particular customer, which will be listed in the display. +3. Click on a row to view details of the customer record, as illustrated in the [wireframe](#_Wireframe_13). +4. Filter description: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Filter** | | | | +| | Quick search | As common function, OLS allows find customer record by quick search function. Put and press enter any key related to these field to find data. | | +| | Gender / Giới tính | If Gender are provide then just get customer who have selected gender If gender are not provided then get all customer | Drop -down Allow multiple select | +| | Country Origin /Quốc gia | If Country are provide then just get customer who have selected Country Issused If Country are not provided then get all customer | Drop -down Allow multiple select | +| | Date of Birth/Ngày sinh | Find customer who have day of birth matched with selected date | Date Time picker | +| | Card number/ Số thẻ | Find customer who have the account of inputed Card number | Text box | +| | Account number/Số tài khoản | Find customer who have the inputed Account | Text box | + +1. **Screen description** + +Screen description at create/edit mode + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Step 1: Customer Profile / Hồ sơ khách hàng** | | | | +| | CIF number \* / Số CIF | Unique CIF Number assingn to each customer. | X(30) | +| | Frist Name \*/ Tên | Customer First Name | X(50) | +| | Last Name \* / Họ | Customer last name Frist Name + Last Name will be customer Name which will be stored in database for refering | X(50) | +| | Date of Birth\*/ Ngày sinh | Customer birth date | Date | +| | Registration Date/ Ngày đăng kí | The date customer open an account | Date | +| | Gender / Giới tính | Customer Gender | Drop-down Select one Lookup value from Code_Management table where code type is “gender”. Refer to “get-type-by-code”API under Master data | +| | Customer Status \*/Trạng thái khách hàng | Customer status | Drop-down Select one Lookup value from Code_Management table where code type is “customer-status”. Refer to “get-type-by-code”API under Master data | +| | Customer Block Code | Customer block code | X(10) | +| | Marital Status/ Tình trạng hôn nhân | Customer marital ima status | Drop-down Select one Lookup value from Code_Management table where code type is “marital-status”. Refer to “get-type-by-code”API under Master data | +| | ID Type/ Loại ID | ID Type of cardholder ID | Drop-down Select one Lookup value from Code_Management table where code type is “cardholder-idtype”. Refer to “get-type-by-code”API under Master data | +| | Cardholder ID/ Số ID | Cardholder ID Condition field. This field is required when Cardholder type is selected otherwise this will be optional field. | X(30) | +| | Country Origin/ Quốc gia | Customer country orgin | Drop-down Select one Lookup value from “Country” table. Refer “Country Code” API under Code Maintenance | +| | Customer Income/Thu nhập | Customer income | 9(14,2) Should be greater than or equal to 0 if provided | +| | Datetime of maitenance date/ Ngày cập nhật thông tin | The sysdate to create/update record via OA screen. The maintenance date from request if input via batch job | Datetime The date format must adhere to the configured format Display for view mode only | +| | Profile Picture /Ảnh hồ sơ | Drag or drop photo Or Browse file to upload image file | | +| **Step 2: Contact Detail/ Thông tin liên hệ** At least one contact detail record should be provided Each customer can have more than one contact detail information such as customer contact and guardian contact…. | | | | +| | Addess Type\*/ Loại địa chỉ | Adress type A drop-down list to select one of following address: Home Address Business Address Shipping Address Billing Address | Drop-down Select one Address type should be unique on each customer | +| | Phone number\*/ Số điện thoại | Phone number | X(30) | +| | Email Address\*/ Địa chỉ Email | Email Adress This field must be under email format | X(50) | +| | Address 1/ Địa chỉ 1 | The main address | X(100) | +| | Address 2/ Địa chỉ 2 | Other address | X(100) | +| | State/Tỉnh-Khu vực | State | Drop-down Select one Lookup value from “State_Code” table Refer to “State code” API under Code maintenance | +| | City/ Thành phố | City | Drop-down Select one Lookup value from “City_Code” table Refer to “City code” API under Code maintenance | +| | Zip Code/ Mã bưu điện | Zip code/postal code | Drop-down Select one Lookup value from “ZIP_CODE” table Refer to “Zip Code” API under Code Maintenance | + +* 1. **Processing** + + If a request is adding a record which whose CIF # locates an existing Client record in OLS with record Status = “A”, the incoming record will be rejected. + + If a request is updating or deleting a CIF # that does not locate an existing Client record with record Status = “A” in OLS, the request will be rejected. + + If a request is deleting a CIF# that locates a Client record that is linked to one or more Account that is still active in OLS, the request will be rejected. + + When new customer is added in OLS then: + ++ Customer record is added in both Client and Client_corr table. + ++ The corresponding LOYALTY_ACCOUNT is created. + +* + - When customer is deleted then: + ++ Logically delete the record by moving it to History table. + ++ Locate record in LOYALTY_ACCOUNT and move that to History table. + +* + - Records added thru this screen cannot be updated by records from the OLS batch. Record created/updated by OLSCUST batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + 1. **View mode of active record is display as customer 360 which is described** **in section 5.2.** + +#### Post -condition + +* + - * 1. Able to access submodule in customer management module which will be described more detail as following section. + +#### Exception flow + +N/A + +### Customer 360 + +#### Requirement Definition + +1. OLS administration screens include a “Customer 360” function to view Customer details. +2. Customer 360 contains key information about customer. User can use it as a strategy guide to creating personalized experiences. + +#### Process flow + +N/A + +#### Trigger + +N/A + +#### Pre-condition + +1. User need to have the access right in Customer Profile module in order to able to view this dashboard. +2. User must select a customer in customer profile listing page to bring up the customer dasboard. + +#### Wireframe + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business Rules + +1. Clicking on the chart icon at the top of the main Customer list page will toggle between the Customer list view and the Customer dashboard view. +2. Customer dashboard update constantly, giving user a real-time view of customer behavior and information. +3. Click any customer record in listing page to see the customer profile of each customer. +4. **OLS support following information:** + +##### Customer information + +![](data:image/png;base64...) + +* + 1. Click “See profile details” to see customer profile detail. The system bring up the screen as pop-up screen for customer profile as illustrated as following: + +![](data:image/jpeg;base64...) + +1. User can edit/delete customer from this screen. + +##### Customer’s rewards statistic + +![](data:image/png;base64...) + +* + 1. This part displays statistical indicators related to the customer's rewards. OLS introduces 2 indicators: + ++ Points: The customer’s total available points. Use sysdate to determine the balance bucket periods. + ++ Cash back: The customer’s total available cash back. Use sysdate to determine the balance bucket periods. + +##### Account / Card information + +* + 1. The Customer’s account holdings and all of the customer’s card are displayed, regardless of whether account or card number is used. + 2. **The Account/ Card information listing give user have a general overview of customer’s cards:** + +**+ A = Set of card list of all account in the selected customer** + +**+ B= Set of card lists for the specifically selected customer.** + +**Therefore C= Card in listing page = Distinct cards from the union of A and B** + +* + 1. **In case account there is no card is added then just show the account list of selected customer.** + 2. Quick shortcut to support adding new Card or new Account from this screen. + 3. Detail listing description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Filed** | **Description** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| | Account type\*/Loại tài khoản | The combination of Product Account Level and Prodcut Account Type of customer. All Customer’s account holding are displayed here. | Display | +| | Account Number\* /Số tài khoản | Product Account No. | Link Click on each Account number to bring up the Account Detail screen to see more about this account. See more on [Account](#_Account) section | +| | Card Number/Số thẻ | Card number | Link Click on each Card number to bring up the Card Detail screen to see more about this card. See more on [Card](#_Card) section. | +| | CIF Number\*/Số CIF | CIF number of card will be the same as selected CIF number for Principal card For supplement card then this is CIF number of Card instead CIF Number of Account. | Display | +| | Card Status/Trạng thái thẻ | Card status | Display Lookup value from Card table | +| | Card indicator/Chỉ thị thẻ | Card indicator | Display Lookup value from Card table | +| | Card block code/Mã chặn tài khoản | Card block code | Display Lookup value from Card table | +| | Card expiry date/Ngày hết hạn thẻ | Card expiry date | Display Lookup value from Card table | +| | Account block code/Mã chặn tài khoản | Account block code | Display Lookup value from Product_Account table | +| | Account status\*/Trạng thái tài khoản | Account status | Display Lookup value from Product_Account table | +| | Account Open Date\*/Ngày mở tài khoản | Account Open Date | Display Lookup value from Product_Account table | + +##### Transaciton statistic + +A combination of two charts is used to describe the transaction statistic for selected period of a customer. + +The line chart describes the fluctuations in a customer's balance for the selected pool over a specified period. + +The combo chart illustrates the relationship between the total number of transactions and the total number of transacted merchants for the selected pool over a specified period. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | | +| **Filter** ![](data:image/png;base64...) | | | | +| | Period | This is drop-down filter key Madatory and select one only OLS support following periods: * + 1. This month 2. Last month 3. Last 3 months 4. Last 6 months Default as “This month” This filter is apply for both graph | | +| | Pool | Mandatory field Allow multiple select Lookup value from Pool Defintion Display Pool ID and Pool Name per each pool. This filter is applied for left graph only | | +| | Account type | Drop-down list to select combination of PAT and PAL. Allow multiple select. This filter is applied for right graph only | | +| | MCC | Drop-down list to select MCC of the transaction. Allow multiple select Display code and description per each MCC This filter is applied for right graph only | | +| **Line chart** **Layout** ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Vertical axis | Total point each selected period/ selected pool Each line is assinged for one transaction type. | | +| | Horizontal axis | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. Total point will be daily total point. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. If Period “Last 6 months” is selected then horizontal axis is including last 6 months from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of redemmed points/earned points/ adjusted points for the date range/time frame defined. | | +| **Data source** | | | | +| Get data from the TRANSACTION table with transaction type = “Award” for earned points/Transaction type = “Redeem” for redeemed points / Transaction type =’ Adjust” for Adjusted points during each selected month on the selected pool. The transaction should not be a cancellation transaction. Use the transaction date to determine the period. | | | | +| **Combo chart** Layout ![](data:image/png;base64...) ![](data:image/png;base64...) | | | | +| | Left vertical axis | | Total number of transacted merchants during selected period of selected pool Use Bar chart to describe total number per each period | +| | Right vertical axis | | Total number of transaction during selected period of selected pool Use line chart to describe total number per each period | +| | Horizontal axis | | Condition data. If Period “This month” or “Last Month” is selected then horizontal axis is including all day of the month. If Period “Last 3 months” is selected then horizontal axis is including last 3 month from currenlty month. Total points will be monthly total points. Hover over the line graph to view a count of transaction for the each day/month Hover over the bar graph to view a count of transacted merchant for the each day/month | +| **Data source** | | | | +| | Lookup value from TRANSACTIONS table Use transaction date to determine period Use Store data as merchant to determine transacted merchant Each OLS Reference No should be one and only transaction. | | | + +##### Customer Activities + +* + - * 1. The all customer activites will be triggerd and displayed here. + 2. Some types of customer activities as following: + 1. Loyalty program + +All OLS transaction of customer such as: + +* + - Enrolling in and participating in OLS loyalty programs. + - Redeeming points + - Transfer points + - Earn points + 1. Feedback and Review + + Leaving customer’s feedback on the portal app. + 2. Email engagement + + Receive email from OMR + 3. Account management + +Refering to all bellow action in portal app such as: + +* + - Updating customer information, such as contact details, payment methods, and preferences. + - Password resets and login activity. + +1. Allow user filter data by time frame (Start date and End date). +2. Layout + +![](data:image/png;base64...) + +##### Customer Segmentation + +* + - 1. Deviding the customer base into segmentation groups based on specific characteristics, behaviors and demographics. + 2. Introduce the criteritions on each segmentation group and the conditons to meet each criterion. Based on this, OLS introduce a program to collect data and devide customers into each segment. + 3. Demographic segmentation includes following segment: + 1. Gender: Famale or Male + 2. Age: Teenager / Adult/ Middle- Aged person/ Senior Citizens: Based on criteria (Age’s range) to devide customer’s age. + 3. Matirial Status: Single or Married + 4. Income: Low / Medium / High: Based on criteria (customer’s income range) to devide icom segment. + 5. Layout + +![](data:image/png;base64...) + +1. Behaviors segmentation includes following segment: + 1. Frequency of purchase: Daily / Weekly/Montly..: Based on the frequency of the transaction to devide this segment. + 2. Membership class: Depending on the organization, business. Some common types of membership class: + * Basic membership + * Premium membership + * Platium membership + * Gold membership + * Daimon membership + * VIP membership + 3. Purchase channel: Categorizing customers based on customer’s preferred purchase channels, such as in-store, online, mobile app, or phone (Call to call center)… + 4. Hobby: Based on customer’s hobby to create siutable loyatly program. + +6. Layout + +![](data:image/png;base64...) + +##### Most Redemmed Items + +The top 10 (this value should be configurable value) redeemed items of the customer are displayed here. + +Just show top 5 item on each page. + +Each row contains a summary for an item, including the item code, the total redeemed quantity, and the redeemed points/cash amount to use for the specificed period. + +Shortcut to support quick add new item redemption transaction from this screen. + +Listing page description: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| **Layout** ![](data:image/png;base64...) | | | | +| F**ilter** | | | | +| | Period | Period used to filter data. | This is drop-down filter key Mandatory and select one only OLS support following periods: * + 1. Today 2. This month 3. Last month 4. Last 3 motnhs Default as “To day” | +| | Item type | Optional field The drop-down to select item type to get top N item. If item type is not provided then top N of all item type will be displayed. | Drop down Multiple select Default Evoucher type | +| **Listing page** | | | | +| | Item code/Mã vật phẩm | Item code | Display Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Item Name/Tên vật phẩm | Item Name | Display Lookup value from ITEM table | +| | Category/ | The categories are assigned to item | Display Lookup value from Item table Each item can be assinged more than one category | +| | Quantiy/Số lượng | Total redemmed quantity of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Redemmed points/ Điểm đã sử dụng | Total redemmed point of selected customer for top item on selected period | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| | Cash Amount used/Tiền đã sử dụng | Cash used to redeem | Display as number format Lookup value from CAT_CATALOGUE_TRANS_DETAIL table | +| **Data source** | | | | +| | Lookup value from CAT_CATALOGUE_TRANS_DETAIL table Use Post_Date to determine period Order by quantity descending order. | | | + +##### Balance information + +1. The all customer’s pool balances are displayed here. +2. Each row contains the summary for a Pool: the total balance (sum of all buckets in a Pool), redeemable balance and the expiry date of the earliest expiring bucket. +3. Listing page descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| Layout ![](data:image/png;base64...) | | | | +| **Fitler** | | | | +| | Pool | Optional field A drop-down to select the reward pools, which quickly retrieves the customer's balance. If Pool is provided then the system display all balance of the selected pool of the customer. If pool is not provided then all pool balance of the customer are displayed. | Drop –down Default as empty Multiple select Lookup from pool definition screen Display only the pools with a non-zero balance. | +| **Listing page** | | | | +| | Pool ID/Mã pool | Pool ID | Link Click on the pool id to bring up the “[Pool Balance Enquiry](#_Balance_Detail_Enquiry) ” detail view of this pool. | +| | Pool Name/Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Balance/Số dư | Sum all balance buckets of a pool of customer. | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of a pool of customer. The bucket should have: Start date <= Processing date <= Expiry date | Display as number format Lookup value from LAB table | +| | Earliest Exp Bal and Date/ Số dư gần nhất | The earliest expiring bucket date for a pool, for non-0 balance buckets. And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | + +#### Post – condition + +* + 1. User can use it as a strategy guide to creating personalized experiences.. + +#### Exception flow + +N/A + +### Account + +#### Requirement Definition + +Account tab show all customer’s holding account. + +Account information means anything relating to customer’s holding acccount which sent from external system to OLS or Added by user via OLS system. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-condition + +1. Users have to have access rights in both “Customer Profile” and “Account” modules under “Customer Mangement” Group in order to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Account” tab. +3. An account type must be available in the OLS system before adding any account of that type. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +Add/Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business Rules + +Account records are updated in the external system and then loaded into OLS. + +Account records can be added by adding functions in administration screens. + +Click on the Account tab in the Customer profile screen to bring up the Account listing as illustrated in the [wireframe](#_Wireframe_4). + +Use the filter to locate a particular Account, which will be listed in the display. + +Click on a row to view details of the Account record, as illustrated in the [wareframe](#_Wireframe_4). + +Screen description + +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | | | **Data type** | +| | CIF numnber\* / Số CIF) | CIF number of selected customer | | | Display | +| | Product Account Level (PAL) \* /Hạng tài khoản | Product Account Level of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_LEVEL table Refer to “ Product Account Level” API under “Code Maintenance” | +| 2. | Product Account Type (PAT)\* /Loại tài khoản | Product account type which belongs to selected PAL that assigned to Account Combination PAL and PAT as Account Type of Account | | | Drop-down Lookup value from PRODUCT_ACCOUNT_TYPE table where PAL as selected PAL Refer “ Product Account Type” API under “Code Maintenance” | +| 3 | Account Number\*/ Số tài khoản | Product Account Number | | | X(20) Combination Account Type + Account Number should be unique. An Combination Account No + Account Type is assigned to an ASN. ASN is unique in the OLS system | +| | Account Open Date \*/Ngày mở tài khoản | Product Account Open Date | | | Date The date format must adhere to the configured format | +| | Account Indicator\*/ Chỉ thị tài khoản | P- Personal account C- Corporate Account | | | Drop-down Select one Lookup value from “Code Management” table where type code is “Acct-indicator”. Refer “List-by-code-type” API under Master Data. | +| | Account block code/ Mã chặn tài khoản | The account block code is used to check block transaction via TP or on some MQ validation | | | X(10) | +| | Block code reason / Mã lí do chặn tài khoản | Reason to block account | | | X(100) | +| | Block code last update date/ Ngày chặn cuối cùng | The day to block account | | | Date The date format must adhere to the configured format | +| | Cycle / Ngày sao kê | Statement cycle date | | | 9(02) Should be greater than 0 if provided | +| | Account status\*/ Trạng thái tài khoản | Product account status The Account status is used to check block transaction via TP or on some MQ validation | | | Drop-down Select one Lookup value from “Account Status” screen (Account_status table). Refer “Account status” API under Code Maintenance | +| **Card information/Thông tin thẻ** When click to view any active account then this pannel is display to show the card of cards belong to selected account. The pannel includes following information: | | | | | | +| | Card number / Số Thẻ | | Card Number | Display Lookup value from Card_Product_Account_Rel table where account is selected account. Refer “Card” API under Customer Management | | +| | Card status/ Trạng thái thẻ | | Card Status Display both code and description of status | Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-status”. Refer “Card” API and “get-by-code-type” API | | +| | Card Indicator/Chỉ thị thẻ | | Card indicator Display both Code and description of indicator | Display Lookup value from Card table by Card Number Lookup description from Code_Management table by code type is “card-indicator”. Refer “Card” API and “get-by-code-type” API | | +| | Card Creation Date/ Ngày tạo thẻ | | Creation Date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card Expiry Date /Ngày hết hạn | | Expiring date of Card | Display date format The date format must adhere to the configured format. Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | CIF number/ Số CIF | | CIF number of Card | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | +| | Card block code/Mã chặn thẻ | | Card block code | Display Lookup value from Card table by Card Number Refer “Card” API under Customer Management | | + +Each account is belong to only one Customer. OLS don’t support to change CIF number of account in this screen. If have to change CIF number of the account then it should be processed via CIF Merge batch if needed. + +Records added thru this screen cannot be updated by records from the OLSACCT batch. Record created/updated by OLSACCT batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. + +When an account is added then: + +* If locate any exiting record with the same combination Account No+ Account Type in OLS (record status is “A”) then the record is rejected. +* If not then: + + - Account record is added in PRODUCT_ACCOUNT table. + - The corresponding LOYALTY_ACCOUNT_PRODUCT is created + +When an account is modified then : + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then update Product Account fields with the incoming field values accordingly. The original record is moved to his table after record is approved. +* Upgrade Account case :==tbd=== + +When account is deleted then: + +* If there is no combination Account No+ Account Type is found in OLS then the record is rejected +* If locates a Product Account record that has a Card record with record Status “A” linked to it, the incoming delete action is rejected. +* If found the same combination Account No+ Account Type existing record in OLS then move record into history table. The corresponding LOYALTY_ACCOUNT_PRODUCT is moved to his table as well. + +#### Post – Codition + +* 1. Allow to add Card. + 2. Allow to post transaction with new account. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Card + +#### Requirement Definition + +Card tab show all customer’s card. + +Card information means anything relating to customer’s card which sent from external system to OLS or added by users on the OLS system. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Card” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Card” tab. +3. An account must be available in the OLS system before adding any card of that account. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Create/Edit view + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail record view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business rules + +Card records are updated in external system and then loaded into OLS, so OLS only provides view functions in administration screens for Card records. There is no further actions. + +Click on Card tab in Customer profile screen to brings up the Card listing as illustrated in the [wareframe](#_Wireframe_5). + +Use the filter to locate particular Card, which will be listed in the display. + +Click on a row to view details of the Card record, as illustrated in the [wareframe](#_Wireframe_5). + +Create/Edit screen description + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| | CIF number \*/Số CIF | CIF Number of Card | Drop-down Get data from Client table Default as CIF Number of selected customer but user can modify if Supplement Card is added. Support quick search CIF number by enterd al least 4 digits of CIF number. | +| | Account Type\*/ Loại tài khoản | Combination of Product Account Level and product account type PAT : Visa [001] PAL: Debit [830] Account type : 830-001 | Drop-down Lookup value from PRODUCT_ACCOUNT table where Account Type is Account type of select customer (Use CIF number which is selected from listing page). Refer to “Product account” API under “Customer Management”. | +| | Account number \*/ Số tài khoản | Product Account number | Drop-down All account of selected account type of selected customer. Refer to “Product account” API under “Customer Management” | +| 3 | Card number\* /Số thẻ | Card number | X(20) Must be unique value in whole system. | +| | Masked Card Number/ ==tbd== | Masked Card Number | X(20) | +| | Cardholder Name\*/ Tên chủ thẻ | Cardholder Name | X(50) | +| | Card Indicator\*/ Chỉ thị thẻ | Card indicator: S- Supplement Card P – Principal Card K – Corporate Card …. For principal card then CIF of card must be the same as CIF of Account. | Drop-down Select one Lookup value from “Code management” table where type code is “card-indicator”. Refer “list-by-code-type” API under “Master Data”. | +| | Card status \*/Trạng thái thẻ | Card status The Card status is used to check block transaction via TP or on some MQ validation | Drop-down Lookup value from “Card Status” screen (Card_status table). Refer “Card status” API under Code Maintenance | +| | Card block code/Mã chặn thẻ | Card block code The Card block code is used to check block transaction via TP or on some MQ validation | X(10) | +| | Card activation date /Ngày kích hoạt thẻ | Card activation date | Date | +| | Card creation date\*/ Ngày mở thẻ | Card creation date | Date | +| | Card expiry date \*/ Ngày thẻ hết hạn | Card expiry date | Date | +| | Old Card Number/ Số thẻ cũ. | Old Card Number | Drop-down list Card belong to selected account. In BAU processing, this is the existing card number to be replaced by new Card Number in this record. This field should have a value only if this record is ADDING a NEW CARD NUMBER which is to replace the OLD CARD NUMBER. Both new card and old card should under the same account. | +| | ==tbd== | | | + +1. Records added thru this screen cannot be updated by records from the OLSCARD batch. Record created/updated by OLSCARD batch cannot be CHANGED from the admin screen. This implicit check can be disabled through a parameter in App Param. +2. When a record is adding with whose Card Number already exists in OLS, the record will be rejected. +3. When a record is adding/updating with whose Account does not exists in OLS, the record will be rejected. +4. When a record is adding/updating with whose CIF Number does not exists in OLS, the record will be rejected. +5. **Processing** + +* Each Card is belong to only one Account and only one customer. OLS don’t support to change CIF number Or Account of Card in this screen. If have to change CIF Numnber of card or account of card then it should be processed via CIF Merge batch if needed. +* When a record is adding with inputed data passed the card record validation then: + + - The card record is added in CARD table. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. +* When a record is updated whose Card Number passes the validations then the Card record and the Card–Account relationship record are updated. Original record is moved to his table. +* When a Card is deleted then the Card record is moved to history table to indicate a logical delete. The corresponding CARD_PRODUCT_ACCOUNT_REL record for this card is also moved to history table. +* For principal card CIF number of account should be the same CIF number of card. +* For replacement case: A new Card issued to the Cardmember in case of loss, theft, mutilation or non-receipt of a Card. Therefore new card is coming to replace old card. When replace card then: + + - Add the incoming record as a new Card record with the same PSN as old card number. + - The linked record to the Account through CARD_PRODUCT_ACCOUNT_REL table is added as well. + - Old Card Number will continue to be processed until the Card Status and/or Block Code is/are updated to make the card ineligible. + - All Attributes, Counters and Pool Buckets which were linked to the old Card number will be automatically linked to the new Card record. + +1. Card listing will be the list card of all account of selected customer. + +#### Post – Codition + +N/A + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Pool Balance Detail + +#### Requirement Definition + +OLS will support Pool balance enquiry as a tab on Customer Profile Screen. + +Pool Balance tab to list a summary of all Pools of the customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to check balance detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Balance Enquiry” modules under “Customer Mangement” Group to able to view this screen. +2. User must select a customer in customer profile listing page to access the “Pool Balance Detail” feature. + +#### Wireframe + +Summary listing page + +* + 1. Listing page + +![](data:image/png;base64...) + +* + 1. Filter + +![](data:image/png;base64...) + +1. Detail view + * 1. Detail view per each pool + +![](data:image/png;base64...) + +* + 1. Click on each row in Pool Balance View to brings up the pop-op detail view + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on Pool Balance tab to list a summary of all Pools of the customer. + 2. All summary of pool balance display in listing page. + 3. This screen just display only. There is no Add/Mofify action on this screen. + 4. Each row contains the summary for a Pool: the total non-balance (sum of all buckets in a Pool), and redeemable balance and the expiry date of the earliest expiring bucket. + 5. Use the filter to locate particular pool balance detail record, which will be listed in the display. + 6. Click on any record to bring up the breakdown of the Pool in that row on the “Pool Balance Detail” Screen as illustrated in the [Wireframe](#_Wireframe_2). + 7. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +* 1. Pool Balance Detail screen descriptions + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | **Data type** | +| **Pool Balance /Số dư pool** | | | | +| | Pool ID / Mã pool | Pool ID | Display | +| | Pool Name/ Tên pool | Pool Name | Display Lookup value from Pool Definition | +| | Pool type/ Loại pool | Pool Type | Display Lookup value from Pool Definition | +| | Pool Entity level / Cấp thực thể pool | Pool Entity level | Display Lookup value from Pool Definition and master data table | +| | Balance / Số dư | Sum all balance buckets of selected pool | Display as number format Lookup value from LAB table | +| | Redeemable Balance/ Số dư khả dụng | The sum all non-balance buckets of selected pool The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | +| | Next Expiring Balance/ Số dư hết hạn gần nhất | The earliest non-expiring balance bucket of the selected pool. | Display as number format Lookup value from LAB table | +| **Pool Balance View/ Chi tiết số dư pool** The breakdown of the Pool in that row following: ![](data:image/png;base64...) 1. Each row is a bucket containing the remaining points earned by the Account/Card shown, and expiring on the date shown. Expired buckets but haven’t yet forfeited will be shown as well. 2. If Customer pool level then all Pools buckets of the customer are shown under each speparaty account even it is customer entity-level. 3. If Account pool level then all only the Pool buckets earned by the presented Account will be shown. 4. If Card pool level then only the Pool buckets earned by the presented card will be shown. | | | | +| | Account type/ Loại tài khoản | Combination of Product Account Type and Product Account level of Account | Display Lookup from Product_Account table Lookup from Product_Account number by ASN from LAB table. | +| | Account No/ Số tài khoản | Product Account Number | Display Lookup from Product_Account number by ASN from LAB table. | +| | Card Number/ Số thẻ | Card number | Present for Card pool entity level only | +| | Pool ID/ Mã pool | Pool ID | Selected pool | +| | Balance / Số dư | Non zero balance | Display Loopkup value from LAB table. Group by Expiry date / LA/ASN/CSN/Pool ID | +| | Expiry Date/ Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + +### Transaction History + +#### Requirement Definition + +* + - 1. Transaction History is a tab under Customer profile. + 2. A transaction history is a running record of all of the transactions logged in OLS including cancellation transactions. + 3. Noted that: Transaciton hisstory listing depened on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to check transaction history of customer. + +#### Pre-conditions + +1. User have to have access rights in both “Customer Profile” and “Transaction History” modules under “Customer Mangement” Group in order to view this screen. +2. User must select a customer in customer profile listing page to access the “Transaction History” tab. + +#### Wireframe + +* + - * 1. Summary listing page + +![](data:image/png;base64...) + +* + 1. Detail record + 1. Transaction Detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +1. Right panels + * + Quick view desribes expand information for this transaction. + + Click on each item to bring up the according tab + + Support scrollbar for pop-up detail view. + 1. Reward details + +![](data:image/png;base64...) + +* 1. Item Redemption Transaction Details + +![](data:image/png;base64...) + +* 1. Counter Transaction Details + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on Transaciton History tab to list all transaction of the customer as illustrated in the [wireframe](#_Wireframe_3). + 2. One transaction detail record is combination of all input field (assinged to an OLS Reference No). + 3. Transaction history listing all transaction in OLS of customer include cancellation transactions. + 4. This screen just view only. There is no futher action. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Click a listed record to display the details of the transaction as illustrated in the following: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Account Detail/Chi tiết tài khoản** | | | | +| | Account Number/ Số tài khoản | Transacting Product Account Number | Display Lookup value from TRANSACTIONS table | +| | Product Account Type/ Loại tài khoản | Transacting Product Account Type | Display Lookup value from TRANSACTIONS table | +| | Product Account Level/Hạng tài khoản | Transacting Product Account Level | Display Lookup value from TRANSACTIONS table | +| | Card Number/ Số thẻ | Transacting Card Number | Display Lookup value from TRANSACTIONS table | +| **Transaction Detail/ Chi tiết giao dịch** | | | | +| | Invoice No/ Số hóa đơn | Internal invoice No generated by OLS system. | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Reference No/Số tham chiếu giao dịch | OLS Transaction Reference Number | Unique for each transaction Display only Lookup value from TRANSACTIONS table | +| | Source Reference Number | Reference number from source system For refrence only | Display | +| | OLS Transaction Code | OLS Transaction Code | Display Lookup value from TRANSACTIONS table | +| | Gross Amount/ Giá trị giao dịch gộp | Gross transaction amount | | +| | Nett Amount/Giá trị giao dịch ròng | Nett transaction Amount | | +| | Redeem points/Điểm đổi thưởng | Redeem points Total redeem points of the choosen transaction. The total point shoule equal to total redeem points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Redeemed Amount/ Giá trị điểm đổi thưởng | Redemmed point Amount Total redeem point amount of the choosen transaction. The total point shoule equal to total redeem point amount on each campaign rule which will be display on quick view. | | +| | Adjust Points/ Điểm điều chỉnh | Adjustment point Total adjustment points of the choosen transaction. The total point shoule equal to total adjust points on each campaign rule which will be display on quick view. | Display Lookup value from TRANSACTIONS table | +| | Points Adjustment Amount/ Giá trị điểm điều chỉnh | Adjustment points amount Total adjust point amount of the choosen transaction. The total point shoule equal to total adjust point amount on each campaign rule which will be display on quick view. | | +| | Award Points/ Điểm thưởng | Earned points Total award points of the choosen transaction. The total point shoule equal to total award points on each campaign rule which will be display on quick view | Display Lookup value from TRANSACTION table | +| | Points Awarded Amount/Giá trị điểm thưởng | Earned points amount Total award point amount of the choosen transaction. The total point shoule equal to total award point amount on each campaign rule which will be display on quick view. | +| | Transaction Date/Ngày giao dịch | Transaction Date Time | +| | Post Date/ Ngày đăng | Post Date | +| | Settlement Date/ Ngày ghi sổ | Settlement Date | +| | Cancellation Indicator/Chỉ thị hủy | Cancellation Indicator | +| | MCC | Transaction MCC Code | +| | Store/ Cửa hàng-đơn vị | Transaction Store ID | +| | Terminal / Cấp thiết bị đầu cuối | Transaction Terminal ID | +| | Transaction Description/Mô tả giao dịch | Transaction Description in OLS or Shop Name from external source system. | +| | Currency Code/ Mã tiền tệ | Currency code of the original transaction amount | +| | Country Code /Mã quốc gia | Country code of the original transaction. | +| | Transaction Mode/ Phương thức giao dịch | Mode of transaction at point of payment | +| | Transaction Channel /Kênh giao dịch | Transaction channel | +| | Salary Credit/ Chỉ báo tiền lương | Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode/ =tbd= | POS Entry Mode | +| | Reason Code/ Mã lí do | Adjustment reason code | For Adjustment transaction | + +1. Quick view in right panel displays the award, redeem, adjust and counter update details of the transaction including the campaign rules applied to the transaction and the Pool Units earned and redeemed. Click on each item to bring up the according tab. + 1. Award/Redeem/Adjust detail: Total balance in right panel should be equal to blanace which is displayed in transaction detail. This quick view displays the reward details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Quy tắc chiến dịch | Campaign rule that transaction has been triggered This value may be empty if transaction does not trigger campaign rule | +| | Transaction Type/ Loại giao dịch | Transaction Type | +| | OLS Transaction Code/Mã giao dịch OLS | OLS Transaction Code | +| | Pool/ Pool | Reward Pool | +| | Pool Unit/ Đơn vị Pool | Award/Redeem/Adjust points Depended on transaction type | +| | Pool Unit Amount / Giá trị đơn vị Pool | Award/Redeem/Adjust points amount Depended on transaction type | + +* 1. Counter Transaction Detail: + + This part displays the counter value, which is updated by the transaction on each campaign rule. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Campaign Rule / Mã quy tắc | Campaign rule that transaction has been triggered | +| | Counter / Bộ đếm | The counter for that transaction has been updated | +| | Entity / Cấp thực thể | Entity level of counter | +| | Counter Value/Giá trị bộ đếm | Counter Value | +| | Bucket Number/ Bộ đếm số | Counter bucket number which one is updated by this transaction. | +| | Bucket Start Date/ Ngày bộ đếm bắt đầu | The start date of the counter bucket for the updated counter has been changed | +| | Bucket End Date /Ngày bộ đếm kết thúc | The end date of the counter bucket for the updated counter has been changed | + +* 1. Item Redemption Transaction Detail + + This quick view displays the item redemption details of the transaction. + +| | | | +| --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Descriptions** | +| | Item / Mã vật phẩm | Item | +| | Descriptions/ Mô tả | Remark of the redemption transaction | +| | Redemmed quantity / Số lượng đổi thưởng | Redemmed quantity | +| | Redeemed points/ Điểm đổi thưởng | Redeemed points | +| | Cash Amount used/Số tiền đã dùng | Cash amount is used to redeem item. | + +#### Post – Codition + +N/A + +#### Exception flow + +N/A + +### No Hit CP – Transaction –IF “RULE EVALUATION” IMPLEMENTED THEN THIS SCREEN IS REDUNDANT + +#### Requirement Definition + +* + - 1. In the nearest version, there is no screen to be tracking the transaction which did not trigger campaign rule by some reasons. + 2. In this version, we introduce a new screen under the 'Customer Management' module to track all non-eligible transactions (those that did not meet the rule criteria) or transactions with no linked rules + 3. A 'No-Hit Transaction' is a running record of all transactions sent to OLS to trigger a CP rule but not eligible for a campaign rule or incoming transactions with no linked campaign rule. If an incoming transaction hits Rule A but does not hit Rule B, this transaction will still appear on this screen for Rule B + 4. Noted that: Listing is depending on housekeep parameter. Nomarly It will show all transaction on the last 12 months. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - * 1. User would like to verfiy why transaction did not hit campaign rules. + +#### Pre-Conditions + +Incoming transactions trigger campaign but do not hit CP. + +User have to have access rights in both “Customer Profile” and “No hit CP- Transaction” modules under “Customer Mangement” Group in order to view this screen. + +User must select a customer in customer profile listing page to access the “No hit CP- Transaction” tab. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +Detail view + +* 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* 1. Click on No Hit CP- Transaction tab to list all No-Hit CP transaction of the customer as illustrated in the [wireframe](#_Wireframe_15). + 2. One transaction detail record is one incoming transaction ( assinged to one Invoice No). + 3. Detail view screen will display all campaign rule which transaction trigger but does not hit. + 4. This screen just view only. There is no further actions. + 5. Use the filter to locate particular transactions, which will be listed in the display. + 6. Lookup no – hit transactions from OLS_ORPHAN_TXN_NO_HIT table for transaction which trigger campaign rule but not meet rule criteria OR transaction no linked any campaign rule. + 7. This screen should desribe detail why transactions do not hit CP rule such as if critertia do not meet then which criteria failed. TP should response detail the error description to can show in this screen. + 8. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Account Information** | | | | +| | CIF Number | Transacted CIF Number If incoming transaction are not provided then lookup by Account/ Card which are provided. | Display | +| | Product Account No | Transacted Product Account Number and combination of Product Account Level and Product Account Type. If Incoming transaction are not provided then lookup by Card Number which is provided | Display | +| | Account Type | +| | Card number | Transacted Card Number | From incoming transaction | +| **Transaction Detail** | | | | +| | Invoice No | Unique Invocie No which generate by OLS system to determine unique incoming transaction. | Display | +| | Transaction Type | Transaction Type of CP rule AWD- Award RED- Redeem ADJ- Adjust | Display | +| | OLS Transaction Code | Transaction code which used to locate CP rule. | | +| | Transaction Date Time | Transaction Date and Time | Display as date time format. The date format must adhere to the configured format From incoming transaciton | +| | Transaction Amount | Transaction Gross Amount from incoming transaction for Award/Redeem transaction Adjust point for Adjustment transction | Display as number format 999,999,999.99 From incoming transaciton | +| | Corporate | Transaction corporate ID Lookup value from transaction store | Display | +| | Chain | Transaction chain ID Lookup value from transaction store | Display | +| | Store | Transaciton Store ID | Display From incoming transaciton | +| | Terminal | Transaction Terminal ID | Display From incoming transaciton | +| | Transaction MCC | Transaction MCC Id | Display From incoming transaciton | +| | Transaction Description | Transaction description | Display From incoming transaciton | +| | Currency Code | Currency code of the original transaction amount | Display From incoming transaciton | +| | Transaction Mode | Mode of transaction at point of payment | Display From incoming transaciton | +| | DCC indicator | DCC indicator From incoming transaciton If empty then mean for non -DCC transaction | Display | +| | Tap2Pay Indicator | Tap2Pay Indicator If empty then mean for transaction is not a Tap2Pay(token) transaction | Display | +| | Token Requestor ID | Token Requestor ID (mobile pay) 3rd party wallet providers (Apple Pay, Samsung Pay, Android Pay etc | From incoming transaciton | +| | Salary Credit | Salary Credit | From incoming transaction Indicates bundled deposit account is receiving regular salary credits | +| | POS Entry Mode | POS entry Mode | From incoming transaction | +| **CP Rule Listing** **Detail error description for each campaign Rule which incoming transaction trigger but do not hit this campaign Rule** | | | | +| | Campaign ID | Campain ID | Lookup value by Campaign Rule ID | +| | Campain Rule | Campaign Rule ID | Display | +| | Pool ID | The reward pool of campaign rule | Display Lookup value by Campaign Rule ID | +| | Error Code | Error response code from OLS | Display | +| | Error Descriptions | Error response description | Display | + +Post-condition + +* + - 1. User can adjust incoming transaciton to meet Campain Rule or explain to customer why they do not get reward. + +#### Exception flow + +N/A + +### Statement + +#### Requirement Definition + +* + 1. Statement Enquiry is a list of all transactions for a customer/ account over a set period, usually monthly. The statement includes earned, redeemed and adjusted, as well as the beginning and ending balance for the period, along with any interest earned. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +User would like to review/verify statement detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Statement Enquiry” modules under “Customer Mangement” Group in order to this screen. +2. User must select a customer in customer profile listing page to view customer profile and access the “Statement Enquiry” tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* + 1. OLS statement output support Customer level and Account level, however statement records will be stored under Account level therefore Statement Enquiry show under Account level for both Statement Pool Entity level. + 2. Statement Enquiry includes all active statement records of statement pool. + 3. Statement records are updated by OLS batch jobs, so in administration functions (OA) only provides view in screens. There is no further actions. + 4. Click on Statement Enquiry tab to list all statement records of the customer as illustrated in the [wireframe](#_Wireframe_6). + 5. Click a listed record to display the details of the transaction as illustrated in the [wireframe](#_Wireframe_6). + 6. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Statement detail** | | | | +| | Loyalty Account Number | Loyalty Account Number | Display Lookup value from STATEMENT table | +| | Product Account Number | Product Account Number | Display Lookup value from PRODUCT_ACCOUNT table by ASN in Statement table. | +| | Account Type | Combination of Product Account Level and Product Account Type | +| | Pool ID | Statement Pool | Display Lookup value from STATEMENT table | +| | Cycle start date | Cycle start date time Provious statement cycle | +| | Statement Opening balance | Previous Statement Points Balance | +| | Total Award | Total earned points in this cycle | +| | Total Redeem | Total redemmed points in this cycle | +| | Total Adjust | Total Adjusted points in this cycle | +| | Statement Closing Blance | Accumualted points | +| | Expired points | Balance in expired buckets which have not yet been forfeited | +| | Last transaction Date | Last transaction post date on this cycle | +| | Cycle statement date | Cycle statement date time | +| **Transaction Detail** This part display all transaction of account/customer on each cycle. ![](data:image/png;base64...) Get data from TRANSACTION table where: * + 1. LA is LA of customer statement records. 2. Pool ID is statement pool 3. ASN is ASN of Account statement records. 4. Post date from Cycle Start Date upto Last Transaction Date 5. Without cancellation transaction 6. Points are not equal to 0 | | | | +| | Reference Number | OLS Reference Number | Display | +| | Transaction Type | Transaction Type of this transaction | Display Lookup value from Transaction table | +| | Unit | Earned/ Redeemed/Adjusted point Depended on transaction type Group by Reference No,Post Date,Transaction date and Txn type | +| | Post Date | Post Date time | +| | Transaction Date | Transaction Date Time | + +#### Post – Condition + +N/A + +#### Exception flow + +N/A + +### Attribute + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according attribute: + 1. Customer profile screen dislays customer information and Customer attribute lisitng. + 2. Account Detail screen dislays Account information and Account attribute of customer. + 3. Card detail screen displays Card information and Card attribute of customer. + 1. In new OLS version Attribute will be displayed on separately tab under Customer profile module. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. User would like to review/ verify attribute detail of customer. + +#### Pre-condition + +1. User have to have access rights in both “Customer Profile” and “Attribute” modules under “Customer Mangement” Group to able to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Attribute Enquiry" tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Detail view + 1. Record detail + +![](data:image/png;base64...) + +* 1. Record status and history + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. Get data from ATTRIBUTE_VALUE table. The attribute values inserted/update form OLS batch process (Attribute maintenance batchs or OMR batch job) OR can be updated by the Attribute maintenance batch as well as by Campaign Rules. + 2. This screen just display atribute value only. There is no further action. + 3. The Attributes listing screen is accessed from the Attribute Tab in the Customer profile module. Clicking on the Attributes Tab will bring up a listing of Attributes, as illustrated in the [wireframe](#_Wireframe_7). + 4. In this screen will display all attribute of customer including Customer attribute/Account attribute/ Card attribute. + 5. Clicking on the Attribute value row in listing page will bring up the attribute value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Attribute value detail field + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/Vn)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity ID and Effect date. | | | | +| | Entity /Thực thể | Optional field Including: Client/Product_Account/ Card If Client entity is selected then listing all customer attribute of customer. If Product_Account entity is selected then listing all account attribute of customer. If Card entity is selected then listing all card attribute of customer. If Entity is not provided then get all attribute of customer which under Customer/ Account/Card entity level | Drop-down Allow multiple select. Default as empty | +| 2. | Effective Date From /Ngày bắt đầu có hiệu lực | Mandatory Listing attribute value during selected date frame. | Date time | +| 3. | Effective Date To/Ngày kết thúc hiệu lực | +| | Only effective records listed/Chỉ hiển thị các giá trị thực thể có hiệu lực | Use processing date to compare with attribute value effective date. If selected then only effective records listed If non-select then all attribute record including expired attribute value records listed | Check box Default as selected | +| **Attribute value detail field / Thông tin chi tiết thuộc tính** | | | | +| | Attribute Group/Nhóm thuộc tính | Attribute group of attribute | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Attribute ID/ID thuộc tính | Attribute ID | Display Lookup value from ATTRIBUTE_VALUE table | +| | Attribute Name / Tên thuộc tíng | Attribute Name | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity / Thực thể | Entity level of attribute Indicates the Entity to which this Attribute belongs Client: Customer Product_Account : Account Card: Card | Display Lookup value from ATTRIBUTE_MAINTENANCE table by Attribute ID | +| | Entity ID/ ID thực thể | The identifier for the Entity to which the Attribute value in this record belongs. If Entity is : • “Product_Account”, this field contains the PA Number • “Card”, this field contains the Card Number • “Client”, this field contains the CIF Number * “Store”, this field contains the Store ID * ……etc…. | Entity value will be : * + 1. CSN for customer attribute. 2. ASN for account attribute 3. PSN for Card attribute. Use Entity and Entity_ID of attribute for lookup according value: | +| | Account Type/ Loại tài khoản | Combinaiton of Product Account Level and Product Account Type of Account attribute. Present for Account attribute only | Display Lookup value from PRODUCT_ACCOUNT table | +| | Attribute value /Giá trị thuộc tính | Attribute value | Display Lookup value from ATTRIBUTE_VALUE table | +| | Effective Date From/ Ngày bắt đầu có hiệu lực | Start date of the effective period for the Attribute value | +| | Effective Date To/Ngày kết thúc hiệu lực | End date of the effective period for the Attribute value | +| **List of Campaign/Danh sách chiến dịch** **This appear when user click to view detail of any record** ![](data:image/png;base64...) | | | | +| | Campaign ID/ID chiến dịch | Campaign ID which reference to Campaign Rule | Display Lookup value from “Campaign Rule screen” | +| | Campaign Name | Name of Campaign | Display Refer to “Campaign “ API under Campaign Management Lookup value from “Campaign” table. | +| | Campaign Rule | Campaign Rules which reference to this attribute | Display Lookup value from “Campaign Rule” screen to list all campaign rules which includes this attribute on at least following items: * + 1. Attribute Criteria 2. Formula 8 3. Formula 7 4. Award limit | +| | Campaign Rule Name | Name of Campaign rule | Display Lookup value from “Campaign_Rule” tablle Refer “Campaign Rule” API under Campaign Management | +| | Effect date | The Effect date of Campaign Rule Dislay both Effective from date and effective to dat e | Display The date format must adhere to the configured format | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + +### Counter + +#### Requirement Definition + +* + - * 1. In nearest version of OLS, on each sub tab: Customer profile, Account and Card will display according Counter: + - Customer profile screen dislays customer information and customer -level counter listing + - Account Detail screen dislays Account information and account -level counter of customer. + - Card detail screen displays Card information and card -level counter of customer. + 1. In new OLS version Counter will be displayed on separately tab under Customer profile module. + +#### Process flow + +#### Trigger + +* + 1. Users would like to review and verify the counter detail of the customer. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Counter” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Counter " tab. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +Figure 1: Listing page + +![](data:image/png;base64...) + +Figure 2: Filter + +* + - 1. Record detail + 1. Record detail view + +![](data:image/png;base64...) + +* 1. Record status + +![](data:image/png;base64...) + +#### Business rules + +* + - * 1. Get data from the table that updates the counter value (Campaign_Counter table). The counter values are inserted/updated from the OLS batch process that triggers the Campaign Rules as well as the OA screen. + 2. This screen just displays counnter value only. There is no further action. + 3. The Counter Detail listing screen is accessed from the Counter Tab in the Customer profile module. Clicking on the Counter Tab will bring up a listing of the counter, as illustrated in the [wireframe](#_Wireframe_8). + 4. In this screen will display all counter bucket for the chosen customer, including Customer-level counter/Account -level counter/ Card- level counter. + 5. Clicking on the Counter value row in listing page will bring up the counter value detail of customer, as illustrated in the [wireframe](#_Wireframe_7). + 6. Description of Counter value detail field: + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field (EN/VN)** | **Description** | **Data type** | +| **Filter** Apply quick search functions as common function on OLS administrator screen without Entity level and Counter bucket period | | | | +| | Entity /Thực thể | Optional field Including: **Customer [CU]/ Account [PA] /Card [CA].** If “Customer[CU]“ is selected then listing all customer -level counter of customer. If “Account [PA]” is selected then listing all account- level counter of customer. If “Card [CA]”is selected then listing all card -level counter of customer. If Entity level is not provided then get all counter level of customer which under Customer/ Account/Card entity level. | Drop-down Allow multiple select. Default as empty | +| 2. | Bucket Start Date / Ngày bắt đầu | Mandatory Listing counter value during selected date frame. | Date | +| 3. | Bucket End Date/ | +| | Only effective records listed/Chỉ hiện thị counter hiện tại | Use processing date to compare with counter bucket period. If selected then only effective records listed. Use processing date to determine the effective of the counter bucket. If non-select then all counter value record including expired counter records listed | Check box Default as selected | +| **Counter value detail field** | | | | +| | Counter/Bộ đếm | Counter | Display | +| | Entity /Cấp bộ đếm | Entity counter level Cust- CU Account – PA Card – CA | Display | +| | Entity ID/ID thực thể | The identifier for the Entity to which the counter value in this record belongs. If Entity is : • “Account”, this field contains the Account Number • “Card”, this field contains the Card Number • “Customer”, this field contains the CIF Number | Display | +| | What to count/ Tiêu chí đếm | The data entity that is to be counted or tracked | Display | +| | Counter Value/Giá trị bộ đếm | Counter value | Display as number format | +| | Bucket start date | Start date of the bucket period for the Counter value | Display as date format | +| | Bucket end date | End date of the bucket period for the Counter value | Display as date format | +| | Counter state/Tình trạng bộ đếm | Counter state A: Awared C: New | Display Show state code only | +| **Counter Statistic / Tổng hợp bộ đếm** ![](data:image/png;base64...) **This part will list the details of the counter history statistics for the chosen counter bucket in the listing page** | | | | +| | Reference No/ Số tham chiếu giao dịch | OLS Transaction Reference Number | Display | +| | Post Date /Ngày đăng | The post date of the transaction | Dipslay as date time format The date format must adhere to the configured format | +| | Counter Value/Giá trị bộ đếm | Counter value which is updated on this transaction | Display as number format | +| | Bucket Number/Số bộ đếm | The bucket number of selected counter | Display as interger number format | +| | Update Date | The system date when counter value is updated | Dipslay as date time format The date format must adhere to the configured format | +| | Updated by | The batch/User who post the transaction that make counter value is changed. | Display | + +#### Post-condition + +N/A + +#### Exception flow + +N/A + +### Adjustment + +#### Requirement Definition + +1. Adjustment transactions can be manually posted through the Customer Management module in the administration screen function under. +2. This screen display all manually adjustment transaction of customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. User would like to review/ verify manually adjustment transaction of customer. + 2. There is some wrong in balance of customer then user have to manually adjust via OA screen. + +#### Pre-Condition + +1. User have to have access rights in both “Customer Profile” and “Adjustment Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Adjusment Entry" tab +3. Depending on the user’s access rights, they can view/edit/add or approve manually Adjustment transaction records. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. Active record + +Record detail + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +1. Create/Edit form + +Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - After selected/inputted card/Account/CIF click to quick view icon to see right panel information + +![](data:image/png;base64...) + +#### Business rules + +1. While under “Transaction Management” module in the administration screen function, manually adjustment transaction can be posted for any customer then in “Customer management”module manually adjustment transaction can be posted for selected customer only. +2. Click on the Adjustment Entry tab in the “Customer Profile “sreen to bring up the screen for accessing the Adjustment Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_9). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Adjustment Entry screen is illustrated in the [wireframe](#_Wireframe_9). +4. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +5. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen desscriptions + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | **Desscription** | **Data type** | | +| **Adjustment detail** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: CIF number/ Account / Card must be provided | Radio button Default posted by Card Look up value from master data | | +| | | | Under Customer management module | Under Transaction Management module | +| | Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Customer” API under Customer Management | +| | Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. Refer “==tbd== “ API | Drop-down Select one List all account level in the OLS system. Refer “Product Account Level” API under Code Maintenance service | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. Refer “==tbd== “ API | Drop-down Select one List all account type in the OLS system by selected Account level. Refer “Product Account Type” API under Code Maintenance service | +| | Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer Refer “Account “ API under Customer Management service | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. Refer “Product Account” API under Customer Management. | +| | CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. Refer “Customer Profile” API under Customer Management. | +| | Quick view/Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF is invalid.t With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink/Icon | | +| | Adjustment Quantity is +ve/-ve \*/ Điều chỉnh âm/dương | Indicates whether the adjustment is a positive adjustment or a negative adjustment | Drop-down Select one Lookup value from “Code_Management” table Refer “list-by-code-type” API with code type is “adj-type” | | +| | Store \*/Đơn vị/Cửa hàng | The store of transaciton | Drop-down Select one Lookup active Store record from “Store” screen Refer “Store” API under Merchant Managemant. | | +| | Pool Id \*/Mã pool | The pool to be adjusted Should respect pool entity level For example: Cant posted txn by Account if pool to be adjusted is card- entity level pool. | Drop-down Select one | | +| | Transaction Date\*/Ngày giao dịch | Transaction date | Time picker within time also DD-MM-YYYYY HH:MM:SSS Allow user input from keybroad | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been adjusted. Present for postive adjustment only Show the balance bucket based on transaciton Date and expire policy of adjusted pool. When update transaction date / Card number (Account /CIF) OR Pool then this value should be automation updated. Allow user modify this value | Time picker without time DD-MM-YYYY Allow user input from keybroad | | +| | Bucket Expiry Date/ … | This is the expiry date of the bucket will be deduct poitn. Present for negative adjustment only If not selected then follow by TP processing for Redemption/Negative adjustment approach. If selected then just adjust on the selected bucket. | Drop-down Select one Loopkup value from customer balance based on adjusted pool/selected card. | | +| | Adjustment Quantiy \* /Số lượng điều chỉnh | The pool units by which to adjust the pool balance. | 9(12,2) Should be greater than 0 if provided | | +| | Reason Code \*/Mã lí do điều chỉnh | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the adjustment. | Drop-down Lookup value from Reason Code screen | | +| | Transaction Code \*/Mã giao dịch | OLS transaciton code of transaction | Drop- down Lookup value from OLS Transaction Code screen | | +| | Remarks/Ghi chú | A description of the adjustment. | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** ![](data:image/png;base64...) The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | + +* + - 1. Edit Action just be applied for Pending/Rejected record. + 2. For Active Record just view only. + 3. After the transaction has been saved, it is put in the pending tab. + 4. An authorised user has to retrieve the transaction and approve it before it is processed and pool is updated: + +**Based on entity level/account selection alog** + +* 1. For postive adjustment transaction then: + + If have negative balance bucket then adjusted point used to offset negative balance bucket to 0 first. + + The remaining points will be added for selected bucket. + 2. For negative adjustment transaction then: + +![](data:image/png;base64...) + +* + - 1. Approved transaction is putted in the active tab. + +#### Post-condition + +* + - Pool balance buckets are updated. + - Transaciton is posted and viewable on the transaction history screen. + +#### Exception flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + +### Transfer balance + +#### Requirement Definition + +1. Transfer balance transactions can be manually posted through the Customer Management module in the administration screen function under. +2. Change in UI/UX and change to support both user can transfer balance from their account to other customer or transfer between its own self. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + 1. The user would like to review/verify the manually transferred points from a customer to another customer or between the customer's own accounts/cards. + +#### Pre-Condition + +1. User have to have the access rights in both “Customer Profile” and “Transfer Balance” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Transfer Balance" tab. +3. Depending on the user’s access rights, they can view/add/Edit or Approve manually transfer points transaction records. + +#### Wireframe + +* + - 1. Summary listing page + +![](data:image/png;base64...) + +* + - 1. View detail form + +![](data:image/png;base64...) + +* + - 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business Rules + +1. Click on the “Transfer Balances” tab in the “Customer Profile “screen to bring up the screen for accessing the Transfer Points listing page. The detail is illustrated in the [wireframe](#_Wireframe_10). +2. Click on the Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) and then clicking on the Edit icon (!) also brings up the same edit form. The edit form for the Transfer Balance screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that the Edit icon (!) and Delete icon just display for pending and rejected records only. +4. The point transfer function will transfer all pools linked directly from the “From” to the “To”. +5. Expiry Dates will be preserved unless a specific date is provided. +6. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. F**orm descriptions:** + +| | | | | +| --- | --- | --- | --- | +| **Seq** | **Field** | **Descriptions** | **Data type** | +| | Transfer mode \*/ Phương thức điều chuyển | Use transfer mode to determine the relationship between from transfer source and the transfer destination. Check on the “Internal” mode to transfer balances itself. Check on the “External” mode to transfer the balance from a customer to another customer in the OLS system. Use Application Parameter to allow/disallow transfer mode: Apply both or only Internal or only external | Radio button Default “Internal” transfer Lookup value from “Code_Management” table where code type is ‘transfer-mode’. Refer “list-by-code-type” API under Master Data. | +| | Transfer Type\*/Loại điều chuyển | Condition field Depend on Transfer Mode to disable/enable as follows: Note: “X” stands for enable | | | | | | --- | --- | --- | --- | | **Transfer mode** | **Transfer Type disable/enable** | | | | **Card** | **Account** | **Client** | | Internal | X | X | | | External | X | X | x | | Radio button Default “Card”. Lookup value from “Code_Management” table where code type is ‘entity-lvl’. Refer “list-by-code-type” API under Master Data. | +| | From \*/Từ | A card/Account/CIF number must be present which depends on the transfer mode. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account type of the selected source account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This field is only active and required if transferred by Account. This is the product account level of the selected source account | Drop-down Select one | +| | Quick view/Xem nhanh | Click on each quick view icon to retrieve the available balances of the customer after entering/selecting the card number. The details will be displayed in the right panel. See more in the Quick view part Show an error message if the Requesting Card is invalid. With Edit/Create mode the system will expand/collapse on the same screen to user can see and continue input needed information but with View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon See more in Quick view part | Hyperlink | +| | To \*/Đến | Card /Account/CIF number must be present which depened on transfer mode. If Transfer Type is “Account” then Account type is present. | Drop-down Select one | +| | Product Account Type /Hạng tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout type of selected destination Account | Drop-down Select one | +| | Product Account level /Cấp tài khoản | Condition filed This fild is only active and required if transfer by Account. This is product accout level of selected destination Account | Drop-down Select one | +| | Pool ID\*/Mã pool | The pool from which to transfer Just show the pool of “From” balance buckets as following: X: Display | | | | | | --- | --- | --- | --- | | **Transfer Type** | **Pool balance bucket of “From” Customer.** | | | | **Pool Level Card** | **Pool level Account** | **Pool Level cust** | | Card | X Display distinct Card- entity Pool of balance bucket of Inputed card only | X Display distinct account -entity Pool of balance bucket of Account of Inputed card | X Display distinct customer -entity pool of balance bucket of customer of inputed card | | Account | | X Display distinct account- entity Pool of balance bucket of inputed account only | X Display distinct customer- eintiy pool of balance bucket of customer of inputed account | | Client | | | X Display distinct customer-entity pool of balance bucket of inputed CIF Number | | Drop- down Based on Transfer Type and “From” to lookup pool from LAB and Pool Definition table. | +| | Store\*/Cửa hàng-Đơn vị | The store which transaciton is logged | Drop -down Lookup value from Store screen- Store table. Refer “Store” API under Merchant Management | +| | Amount to Transfer \*/Mức điều chuyển | The amount to transfer. Defaults to the whole pool balance. | 9(14,2) Should be greater than 0 if provided | +| | Expiry Date (after transfer)/Ngày hết hạn | The expiry date of the points after the transfer. By default the expiry date will be the source expiry date. | Date time | +| | Transaction Code\*/Mã giao dịch | OLS transaction code which transaction is logged | Drop -down Lookup value from OLS TC screen. Refer “OLS Transaction Code” API under Campaign Management | +| | Reason Code \*/Mã lí do điều chuyển | Select from a list of pre-defined codes to identify the reason for the transfer | Drop-down Lookup value from Reason Code screen (Reason_Code table). Refer “Reason Code” API under Code Maintenance | +| | Remarks/Ghi chú | Remarks to be appended to the transaction, for reference | Text box X(100) | +| **Bucket Balance Detail view of Source** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | +| **Bucket Balance Detail view of Destination** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. OLS will validate the status permission and block code permission for both “From” and “To”, the transfer transaction will be rejected if any permission disallowed to perform adjustment. +4. Transfer transaction will be rejected if Pool balance of “From” is insufficient. +5. The Approved transfer transaction is logged as Adjustment transactions and following by TP processing: + 1. Each bucket in the “From” is transferred as a negative adjustment to the “From” and logged as a positive Adjustment to the “To”. + 2. The Reason Code will be selected from a list of Adjustment Reason codes. + 3. The Adjustment Reason Code is important for determining the GL posting accounts. + +#### Post-conditions + +* + 1. Pool balance buckets are updated. + +#### Exception flow + +* + 1. Pool balance of “From” is insufficent. + 2. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 3. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Re-instatement + +#### Requirement Definition + +1. This screen is used to re-instatement for expired balance bucket which have not been forfeited. +2. If balance have been forfeited, then “re-instatement” does not apply and an adjustment transaction should be used to return points to the customer. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. User want to review/verify Re-Instatement transaction + 2. User want to re-instate expired bucket. + +#### Pre-Condition + +1. User have to have access righsts in s both “Customer Profile” and “Re-Instatement” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer on the customer profile listing page to access the "Re-Instatement" tab. +3. Customers have pool expired bucket which have not been forfeited. +4. Depending on the user's access rights, they can view, add, edit, or approve manually Re-Instatement Transaction records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +* 1. Create/Edit form + +![](data:image/png;base64...) + +#### Business rules + +1. Click on the “Re-Instatement” tab in the “Customer Profile “sreen to bring up the screen for accessing the Re-Instatement listing page. The detail as illustrated in the [wireframe](#_Wireframe_11). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_11). +3. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +2. Form description: + +| **Seq** | **Field** | **Description** | **Data type** | | +| --- | --- | --- | --- | --- | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | +| | | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (balance or Buket Balance Detail View) to retrieve the available/expired balances of the customer after entering the customer information. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card/Account/CIF are invalid. With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | +| | Store \*/Cửa hàng_Đơn vị | Store | Drop -down Select one | | +| | Pool Id \*/Mã pool | The pool to be adjusted. The pool of the bucket to Re-instate. Just list the pool have balance which has already expired, but are still within the grace period (haven’t forfeited), while respecting the pool entity-level based on transfer mode. E.g Use account to re-instate then cant select card pool entity-level | Drop-down Select one | | +| | Bucket to Re-instate \*/Số lô cần gia hạn | The drop-down displays the expired buckets of the selected pool which have not been forfeited The bucket to be re-instated must be selected individually and the new expiry date must be provided in the “Expiry Date” field. | Drop-down Select one Lookup value based on LAB table. | | +| | Expiry Date \*/Ngày hết hạn | This is the expiry date of the new bucket after the expired points have been re-instated. | Date The date format must adhere to the configured format | | +| | Reason Code \*/Mã lí do | The Reason Code is a drop-down providing a set of pre-defined reason codes to explain the reason for the re-instatement. | Drop-down Select one Lookup value from Reason Code screen with Reason type is Re-instatement Refer “Reason Code” API under Code Maintenance | | +| | Remarks/Ghi chú | Additional remarks on the re-instatement. | X(100) | | +| Quick View Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card. | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card is present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +1. After the transaction has been saved, it is put in the pending list. +2. An authorised user has to retrieve the transaction and approve it before it becomes effective. +3. The re-instatement will be posted as an Adjustment, with the Reason Code set to the selection. +4. The balance in the expired buckets will be set to 0. +5. If the bucket with the required expiry date exists, the adjustment amount will be added to the bucket. +6. Otherwise, a new bucket with the new expiry date as entered in the Re-instatement edit form is created with the balance from the expired bucket. + +#### Post-condition + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation … + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Item Redemption + +#### Requirement Definition + +1. Customers call the customer service (call center) and requests to redeem an item, giving identification and item code. +2. Item redemption requests are processed against the catalogue item set-up parameters. The details are described against the relevant parameter in the catalogue item set-up description in section 7. +3. All redemptions are in real-time. +4. Redemption through administration screens that requires approval is real-time only at time of approval. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +* + - 1. Users use this screen to assist customers in exchanging points for items. + 2. Users want to review and verify the redemption item transaction details of customers, which includes all online transactions via the OA screen or M as well. + +#### Pre-Condition + +1. Users have to have access rights in both “Customer Profile” and “Item Redemption Entry” modules under “Customer Mangement” Group in order to view this screen. +2. Users must select a customer to access the “Item Redemption Entry” tab. +3. Depending on the user's access rights, they can view, add, edit, or approve manually Item Redemption Transaction records. + +#### Wireframe + +* 1. Summary listing page + +![](data:image/png;base64...) + +* 1. Record detail view + +![](data:image/png;base64...) + +Click on each item to bring up item detail view + +![](data:image/png;base64...) + +* 1. **Create** + +**Step 1: Add General information** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Physical /Evoucher item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add Miles item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add cash rebate item** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Step 2: Add other items** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +#### Business rules + +1. Click on the “Item Redemption Entry” tab in the “Customer Profile “screen to bring up the screen for accessing the Item Redemption Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_12). +3. User can’t modify transaction after transaction is posted. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | | +| --- | --- | --- | --- | --- | +| **Seq** | **Field** | **Description** | **Data type** | | +| **General information** | | | | | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the followings: (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from master data | | +| | Condition fileds as following descriptions | | **Under customer management** | **Under Transaction Management** | +| Card Number/Số thẻ | Any card belonging to the customer can be used for making a redemption Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of the choosen customer. | Drop-down Select one List all account level in the OLS system. | +| Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the choosen customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Card number to find card. | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | +| | Quick view /Xem nhanh | Click on each quick view icon (Balance Detail or Buket Balance Detail View Or Expired Balance View) to retrieve the available balances of the customer after entering the card number. The details will be displayed in the right panel. See more in Quick view part Show error message if Requesting Card invalid. | Hyper link | | +| | Redemption Channel \*/Kênh đổi thưởng | Redemption Channel | Drop-down Select one Lookup value from master data | | +| | Redemption Date \*/Ngày đổi thưởng | The redemption transaction date | Date time Date time format must respect the date configuration format | | +| | Store\*/Đơn vị | The drop-down list to select any acitive Store in the OLS. Redemption Transaciton will be logged under this store. | Drop -down Select one | | +| | Appliable Fee/ Áp dụng phí | The fee will be applicable for this transaction if item has a fee See more about fee on Item price section. | Switch button Default OFF | | +| **Item details** | | | | | +| | Catalogue Code\*/Nhóm vật phẩm | The drop-down to select the effected catalog | Drop – down Select one Use Redemption Date to determine effected catalogue. | | +| | Item\*/Vật phẩm | The drop-down to select the item code to be redeemed. The item must belong to the selected catalogue. Display an error message if item has no matched price. | Drop-down Select one Use Redemption Date and selected catalogue to determine effected item. From selected item and inputed data to determine price of the item. Please refer Item price to get more detail | | +| | Redemption Mode\*/Loại đổi thưởng | A drop-down list with the following choices: * Fixed Partial (Cash + Points) * Fixed Points If Price configuration did not allow Partial Redeem then just Fixed Partial is disable. If Price configuration allow “Partial Redemption” mode then both mode are enable. | Radio button Defaut fixed points Look up value from master data | | +| | Unit Price \*/Giá mỗi đơn vị | Point required **For Fixed points Mode then this is Price in point in item price configuration and user can’t change.** **For Fixed Partial Mode, the sytem must automation populate than “Minimum Partial Redeem Points” in item price configuration and user can modify this value but Unit Price must be equal to or greater than “Minimum Partial Redeem Points”.** | 9(12,2) | | +| | Unit Cash Amount required./Tiền phải trả mỗi đơn vị | Condition field This field is only active and required Fixed Partial mode only. The system must automation populate as: ( **Full Price in Point – Unit Price** ) \* **Price in Cash (per point) ( from item Price Configuration)** | Display | | +| | Unit Face value/Giá trị mỗi đơn vị | Condition field Active only when this item required face value on the configruration **Get face value from Item price cofiguration with higher priority. Otherwise this is base face value from item master.** | Display as 9(14,2) format | | +| | Quantity on hand/Số lượng còn lại | Available item can be redeemed. Just display if the item is tracked by quantity. | Display as 9(9) format | | +| | Redemption Quantity\*/Số lượng đổi thưởng | Redemption quantity If the item is tracked by quantity, then the redemption quantity must not be greater than the quantity on hand. Don’t allow to redeem if redemption quantity is greater than quantity on hand | 9(5) Should be greater than 0 if provided | | +| | Total price\*/Tổng cộng | **The system must automation populate as Unit Price \* redemption quantity** | Display | | +| | Total Cash amount required/Tổng tiền phải trả | Condition field This field is only active and required Fixed Partial mode only. **The system must automation populate as** **Unit Cash Amount required\* Quantity.** | Display | | +| | Total face value/ Tổng giá trị | Condition field. Active only when this item required face value on the configruration **The system must automation populate as** **Unit Face value \* redemption quantity** | Display as 9(14,2) format | | +| | FFP Ship number/ Mã số thẻ | FFP ship number | X(50) Condition fields Display and required for Miles items and should be configurable. Automation populate value from Attribute value based on configuration attribute ID and allow user modify this one. These fields to be used to send to partner. | | +| | FFP First Name/Tên | FFP First Name | +| | FFP last name /Họ | FFP last name | +| | Delivery Address/Địa chỉ | Delivery Address 1 Condition field Only active for Evoucher item and Physical item Auto populate from customer’s address 1 and allow user modify. | X(100) | | +| | Zip code/Mã bưu điện | Zip code Condition field Only active for Evoucher item and Physical item. Auto populate from customer’s Zip code and allow user modify. | Drop-down Select one | | +| | Recipient Name/Người nhận | Recipient Name Condition field Only active and required for Evoucher item and Physical item. Auto populate from customer’s Full Name and allow user modify. | X(50) | | +| | Email adress /Địa chỉ email | Email address Auto populate from customer’s email and allow user modify. | X(50) | | +| | Mobile Phone/Số điện thoại | Mobile Auto populate from customer’s email and allow user modify. | X(50) | | +| | Remark/ Ghi chú | Additional remarks on the item redemption transaction | X(100) | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buckets. Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | +| **Bucket Balance Detail View** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool of the customer, regardless of Entity Level | | | | | +| | Account number | Product Account No | Display Present for all pool entity-level | | +| | Product Account Type | Combination of Product Account Type and Product Account level of Account | +| | Product Account level | +| | Card Number | Card number | Display Present for Card pool entity level only If there are more than Card under the same Plastic Serial Number then the newest cards is present. | | +| | Pool ID | Pool ID | Display Loopkup value from LAB table. | | +| | Balance | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date | Expring date | Display Loopkup value from LAB table | | +| Expired Balance Detail This part display Expired bucket which haven’t been forfeited of selected/inputted acccout/Card/CIF. The expired pool bucket balances should take into account the entity level in the display. **If use Card to post re-instatement txn then:** * + 1. Get all expired balance buckets of customer regardless selected/inputed card for Customer entity level pool 2. Get all balance expired buckets of Account of selected/inputed card for Account entity level pool 3. Get all blance expired buckets of selected/inputed card only for Card entity level pool If **use Account to post re-instatemeen txn then:** * + 1. Get all balance expired buckets of customer regardless selected/inputed account for Customer entity- level pool 2. Get all balance expired buckets of selected/inputed account for Account entity -level pool. 3. Card pool entity-level should not be present. If **use CIF numebr to post re-instatemeen txn then** get all customer – entity level pool expired balance bucket of chosen customer. Card and account pool entity-level should not be present. Take note that: Use Processing Date to compare with expiry date to located eligible pool balance bucket. **Each row represent each pool which take into account the entity level in the display** | | | | | +| | Pool ID/Mã pool | Pool ID | Display Lookup value from LAB table via selected Card/Account/Customer | | +| | Balance /số dư | Total Expired balance | +| | Expiry Date/Ngày hết hạn | Expiry date | +| **Bucket Balance Detail view** The same as [Balance enquiry](#_Balance_Detail_Enquiry) Display all buckets of the Pool, regardless of Entity Level | | | | | +| | Account number/Số tài khoản | Product Account No | Display Present for all pool entity level | | +| | Product Account Type/Hạng tài khoản | Combination of Product Account Type and Product Account level of Account. | Display Present for all pool entity level | | +| | Product Account level/Cấp tài khoản | +| | Card Number/Số thẻ | Card number | Display Present for Card pool entity level only If found more than one Card under the same Plastic Serial Number then the newest card os present. | | +| | Pool ID/Mã pool | Pool ID | Display Loopkup value from LAB table. | | +| | Balance /Số dư | Non zero balance | Display Loopkup value from LAB table. | | +| | Expiry Date/Ngày hết hạn | Expring date | Display Loopkup value from LAB table | | + +#### Post-condition + +* + 1. Transactions are logged into the related table in the database. The transaction listing includes not only transaction which to be posted under the OA but also transaction to be posted from the member site. + 2. Balance are updated. Quantity on hand are updated if transaction is posted successfully in the system. + 3. The net transaction of the redemption transaction is the sum of the tax amount, total fee, and total cash required. + 4. At the end of day (EOD), all approved items include are output in a OLS output file to be sent to parnter to be tracking or created back to the account/customer used in the item redemption, etc. + 5. TP process to approve Transaction + +![](data:image/x-emf;base64...) + +#### Exception flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation… + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Award Transaction + +#### Requirement Definition + +#### Process flow + +Process follow for award transaction (Award service on TP side: ) + +![](data:image/png;base64...) + +#### Trigger + +#### Pre-condition + +#### Wireframe + +* + - 1. Create /Edit + +![](data:image/png;base64...) + +#### Business Rules + +1. Click on the “Award Transaction” tab in the “Customer Profile” screen to bring up the screen for accessing the Award Transaction Entry listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +2. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Re-Instatement screen is illustrated in the [wireframe](#_Wireframe_10). +3. Noted that Edit icon (!) and Delete icon just display for pending and rejected record only. +4. User stories and acceptance criteria + +![](data:image/x-emf;base64...) + +1. Screen descriptions: + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Descriptions** | **Data type and data source** | +| | Posted transaction by\*/ Tạo giao dịch bởi | Transacting Account/Customer identifier. Only one of the following 3 (CIF Number, Account , Card Number) must be provided | Radio button Default posted by Card Lookup value from “Posted txn by” type code in master data | | | +| | Condition fileds as following descriptions | | Under Customer profile | | Under Transaction Management | +| Card Number/Số thẻ | Any of the customer's card numbers. Condition filed This field is only active and required if txn is posted by Card. | Drop -down Select one List all card of selected customer | Drop-down Select one Put any Card number in OLS system. Default emptu to avoid performance issue then user must enter at least 4 digits of Card number to find card. | | +| Product Account Level/Loại tài khoản | Product Account Level Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account level for all accounts of selected customer. | Drop-down Select one List all account level in the OLS system. | | +| | Product Account Type/Hạng tài khoản | Product Account Type Condition Filed This field is only active and required if txn is posted by Account. | Drop-down Select one List distinct account types for the selected account level of the selected customer. | Drop-down Select one List all account type in the OLS system by selected Account level. | | +| Account Number /Số tài khoản | Product Account Number Condition filed This field is only active and required if txn is posted by Account. | Drop-down Select one List all account number for selected account type of selected customer | Drop-down Select one List all account number for selected account type in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of Account number to find card. | | +| CIF number /Số CIF | CIF number Condition filed This field is only active and required if txn is posted by Customer. | Read only This is selected CIF Number | Drop-down Select one List all CIF number in the OLS system. Default empty to avoid performance issue then user must enter at least 4 digits of CIF number to find CIF. | | +| | Quick view | Click on each quick view icon “Balance” to retrieve the available balances of the customer after entering the card/account/CIF number. The details will be displayed in the right panel. See more in Quick view part With Edit/Create mode the system will expand / collapse on the same screen to user can see and continue input needed information as illustrated following: ![](data:image/png;base64...) With View/Approve/Reject mode the system will show detail as pop-up when click on each quick view icon as illustrated following: ![](data:image/png;base64...) | Hyperlink | | | +| | Transaction Code\* /Mã giao dịch | OLS Transaction Code This TC is used to locate the Campaign Rule to use for processing. | Drop-down Select one Lookup value from “Transaction_Code” table. Refer “OLS Transaction Code” API under Campagin Management | | | +| | Transaction Date \*/Ngày giao dịch | Must be valid date. Transaction rejected if not valid. Transaction rejected if this date is older than sysdatetime by N days, where N is a system setting. | Date time | | | +| | Source Reference Number/Số giao dịch gốc | Source Transaction Reference Number Unique transaction identifier from source system | X(20) | | | +| | Store\*/Đơn vị/Cửa hàng | Transaction Store Id | Drop-down Select one Lookup value from “Store” table Refer “Store” API under merchant management | | | +| | Terminal /Thiết bị đầu cuối | Transaction Terminal Id | Drop-down Select one Lookup value from “Terminal” table Refer “Terminal” API under merchant management | | | +| | Transaction Amount\*/ Giá trị giao dịch | Transaction Gross amount Note: It is dependent on each project, Lets it be gross transaction amount first. | 9(14,2) Should be greater than 0 if provided | | | +| | Transaction Description/ Mô tả giao dịch | Shopname from Source system or OLS transaction description | X(100) | | | +| | Transaction Currency Code/ Mã tiền tệ giao dịch | It can be anpha code or number code. Let’s it be anpha code first | Drop-down Select one Lookup data from “Currency_code” table Refer “Currency Code” API under Code Maintenance | | | +| | Transaction Mode/Phương thức giao dịch | Mode of transaction at point of payment | Radio button Lookup value from “Code_Management” table where code type is “txn-mode’. Refer “get-by-code-type” API under master data | | | +| | POS Entry Mode/Phương thức thiết bị bán hàng | POS Entry Mode | X(04) This field is subdivided as follows: 0 – Unknow , 1- Manual (key entered) 3- Bar code ---Etc | | | +| | MCC code/Mã MCC | Merchant category code | Drop-down Select one Lookup value from “MCC” table Refer “MCC” API under merchant management | | | +| | Country Code/Mã quốc gia | Country code | Drop-down Select one Lookup value from “Country_Code” table Refer “country code”API under Code Maintenance | | | +| | Salary Crediting Indicator/ Tài khoản nhận lương | Indicates bundled deposit account is receiving regular salary credits | Switch button Default OFF | | | +| | Transaction Channel/Kênh giao dịch | Transaction channel | Drop-down Select one Lookup value “Code_Management” table where type code is “txn-channel” Refer “get-by-code-type” API under master data | | | +| **Quick view** **Balance Detail View** ![](data:image/png;base64...) Show pool bucket balances take into account the entity level in the display. If posted txn by Card then : Show pool bucket balances take into Card considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected card for customer entity- level pool. 2. Get all balance buckert of Account of the selected card for account entity-level pool 3. Get the balance bucket of the selected card only for the card entity-level pool. If posted txn by Account then : Show pool bucket balances take into Account considering entity level in the display: * + 1. Get all balance bucket of customer regardless selected Account for customer entity -level pool. 2. Get all balance of Account of selected card for account entity- level pool 3. Card pool –entity level should not be present. If posted txn by CIF number then: Get all customer – entity level pool balance bucket of chosen customer. Card and account pool entity-level should not be present. **Noted that: Each row represent each pool which take into account the entity level in the display** **Use processing date to determine available balance which ready to be redeemed.** | | | | | | +| | Pool ID | Pool ID | Lookup value from LAB table | | | +| | Balance | Total balance buckets of a reward pool of customer. Show up to the pool entity level | Display as number format Lookup value from LAB table | | | +| | Redeemable Balance | The sum all non-balance buckets of a pool of customer. Show up to the pool entity level The balance bucket must be non-expired and available to use. | Display as number format Lookup value from LAB table | | | +| | Earliest Exp Bal and Date | The earliest expiring bucket date for a pool, for non-0 balance buck Show up to the pool entity level And Balance that is expiring on The earliest expiring bucket date. The balanace should not be zero balance. | Display as number format Lookup value from LAB table | | | + +#### Post-Codition + +Refer Process flow to get more detail for post-conditon when transaction is approved. + +#### Exception -flow + +* + 1. Transaciton is rejected by TP validation such as block code validation, ATG validation. + 2. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + diff --git a/docs/specs/archive/onemarketing.md b/docs/staging/structured/marketing/marketing.md similarity index 68% rename from docs/specs/archive/onemarketing.md rename to docs/staging/structured/marketing/marketing.md index 4435d02..8d5f6f9 100644 --- a/docs/specs/archive/onemarketing.md +++ b/docs/staging/structured/marketing/marketing.md @@ -1,751 +1,746 @@ ---- -title: "OneMarketing" -type: OpenSpec -status: Draft ---- -# OneMarketing - -## Overview - -OneMarketing Module includes 2 function modules: - -* **Marketing Message:** Manage (CRUD features) all message templates that are used in the system. -* **OneMarketing Request (OMR):** Filter the target customers who satisfy the set-up-criteria to send messages or get reward transactions. -* **A/Bn Testing:** to compare at least two versions of a SMS, email, or other marketing elements to determine which one performs better. -* **Frequency Capping:** The function to practice of controlling the frequency and volume of notifications or channel delivered to customers to avoid overwhelming them -* **Blacklist:** A list of customer who will be blocked for reward/promotion notification from a business. -* **Whitelist:** A list of customer who has given their consent to receive specifc types of marketing message from business. - -## Marketing message - -### Requirement Definition - -1. The marketing message module is used to define a communication message that will be sent to the target list. -2. A Message Template can be built based on a message with pre-defined parameters or HTML file. -3. User can build different messages for different marketing channels (e.g: SMS / Notification Push/ Email/ OTT …). - -### Process Flow - -[Image Removed] - -### Trigger - -N/A - -### Pre-Conditions - -1. Users have to have access rights in “Marketing Message” module to able to access this screen. -2. Depending on the user's access rights, they can view, add, edit, or approve manually message template. -3. Assume that all OMR criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. - -### Wireframe - -* + - 1. Message summary listing page - -[Image Removed] - -* + - 1. Filter - -[Image Removed] - -* + - 1. SMS - -1. Create SMS - -**Step1 : Choose message chanel : SMS and choose create new or re-use existing message template** - -[Image Removed] - -**Step 2: Step up “General information”** - -[Image Removed] - -**Step 3: Set up message content** - -[Image Removed] - -[Image Removed] - -**Finish by save.** - -1. SMS detail view - -[Image Removed] - -* + - 1. **Email** - -1. Create Email message - -**Step 1: Choose message chanel : Email and choose create new or re-use existing Email template** - -[Image Removed] - -**Step 2: Set up “General information”** - -[Image Removed] - -**Step 3: Set up “Sender information”** - -[Image Removed] - -**Step 4: Setup Email content** - -[Image Removed] - -**Upload email template** - -[Image Removed] - -[Image Removed] - -* + - 1. **Push notification** - -Create Push notification message - -**Step 1: Choose message chanel : Push and choose create new or re-use existing Push template** - -[Image Removed] - -**Step 2: Update “Generate information”** - -[Image Removed] - -**Step 3.1: Message content configuration for “Richer push”** - -[Image Removed] - -**Step 3.2: Message content for “Carousel push”** - -[Image Removed] - -**View mode** - -[Image Removed] - -### Business Rules - -1. OLS system can send a message to target customer through a notification on the app, an email, an SMS, and so on. These varied media used for message delivery are known as “channels”. -2. In this version, OLS support to user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. Just enter the email adress or phone number user wish to check the message preview. -3. Besides, OLS support to user can setup message template to re-use in the furture. -4. Click on the “Marketing Message” in Main icon to bring up the screen for accessing the Markting Message listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). -5. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for marketing message screen is illustrated in the [wireframe](#_Wireframe_10). -6. **Screen description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Create /Edit mode** | | | | -| **SMS message** | | | | -| | **Step 1: General Information** | | | -| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | -| | Message Description \* | Description of message | X(100) | -| | SMS Type | Drop-down to select SMS type: Promotion/Marketing Transaction | Check box type Select one value only Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. | -| | Effective Date From \* | The start date of the effective period of the message | Date Date time format must respect the date configuration format | -| | Effective End Date \* | The end date of the effective period of the message | Date Date time format must respect the date configuration format | -| | **Step 2: SMS Content Configuration** | | | -| | SMS Brand Name \* | Drop -down to select SMS Sender | Drop-down Lookup value from master data | -| | Message \* | The message content of the SMS. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. SMS message don’t support : 1. Images 1. A subject line 2. Attachments **SMS messages are written in Unicode (non –GSM standard). Standard single message or multi-part message are credited based on the message content.** | X(5000) | -| | Message parameters | The message parameter list. [Image Removed] | Tree list | -| | Preview | The message will be automation displayed in the preview part. | Displaya | -| | The number of characters in the message\* | This value will be automatically upadated when the user update the message content. | Display as number format | -| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a phone number is dispalyed 2. When user click on “Send sample” a confirm message is display. It use to user confirm that the system will send a testing message into inputed phone number. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a sms message into inputed phone number. 3. Mobile phone number should be required when user click on” Send sample”. If not found should reject with error message | Button | -| **Email message** | | | | -| | **Step 1 : General Information** | | | -| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | -| | Message Description \* | Description of message | X(100) | -| | Email Type | Drop-down to select Email type: **Promotion/Marketing** **Transaction** | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. Lookup value from master data | -| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | -| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format | -| | Use type \* | 2 options to config email message : * + 1. Use messge. 2. Upload template. | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | -| | **Step 2: Sender information** | | | -| | Sender Name\* | The name of sender | X(100) | -| | From email\* | The email addess used to send email to target customer | Display This email is configured. | -| | Subject\* | Subject of email | X(100) | -| | Preview Text | Preheader of Email Preheader can help user connect with customer and increase customer’s open rate. If Prejeader is not provided then the first line of email content will be display instead | X(100) | -| **3.** | **Step 3: Email content figuration** | | | -| | Message | Conditon field The message content of the Email. If “Use message” is selected then this field is actived. System must allow to edit HTML format. The system should support to generate into text format. System must allow to put image/url… as message content. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. | Character | -| | Message parameters | The message parameter list. [Image Removed] | Tree list | -| | Upload file | This filed is actived when “Use template” is selected. [Image Removed] Allow users to drag and drop an HTML template file, or they can choose a file from their computer to upload it into the system. After uploading, the system displays message content based on the uploaded file and allows the user to review and make modifications. | Button | -| | Re-Upload | Use this button to re-upload the email template. | Button | -| | Preview the email | The message will be automation displayed in the preview part. Sender / Subject and Preheader will be displayed here. If Preheader is not provided then the first line of message will be display instead. | Display | -| | Send sample | This functions to support the user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter an email address. This entry should adhere to the email format field. 2. When click on “Send sample” a confirm button to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test email into inputed email address. 3. The email address should be required when user click on” Send sample”. If not found should reject with error message. | Button | -| **Notification Push** | | | | -| | **Step 1: General information** | | | -| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | -| | Message Description \* | Description of message | X(100) | -| | Notification Type | Drop-down to select Notification type: Promotion/Marketing Transaction | Check box Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | -| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | -| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format. | -| | **Step 2: Notification Content configuration** | | | -| | Message Title \* | The primary text that appears at the top of the notification | X(50) | -| | Message \* | The main content of the notification, providing additional information, context, or details related to the notification's purpose. The list of message parameters are included to be used. User can drop/drag message paramters into message. System must allow to put image/url as message content. | Text Area | -| | Message parameters | The message parameter list. [Image Removed] | Tree list | -| | Image type\* | Drop- down to selcte image type: SingerEicheer push (No image ) Richer Push (one image) Carousel Push (One or more than one image) | Drop- down Select one only Lookup value “Code Management” table where type code is “image-type”. Refer to ‘list-by-code-type’ API under Master Data. | -| | Upload Image | Condition field * + - 1. This field is not actived for Single Push 2. Image URL : Click on the Image URL field and type or paste the URL of the image 3. Upload: Drag/Drop image or click the uploaded from computer. If the Image type is 'Carousel Push,' then users can upload more than one image. The sequence sorting will be the same as the sequence displayed in the mobile app. Users can rearrange the images to adjust the sortinng. Image is required for “Richer push” and “Carousel Push”. | | -| | Preview the notification | The message will be automation displayed in the preview part: content/ image. Preview on IOS or Android | Display | -| | Link URL \* | Enter or paste the URL to which the user needs to navigate to. | X(100) | -| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a CIF Number. From CIF Number the system will locate device's registration token, a device group's notification key, or a single topic. 2. A confirm message to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test notification. 3. The token or key or something else which one the system used determine destination of the push message should be required when user click on” Send sample”. If not found should reject with error message. | Button | - -### Post -codition - -* + 1. All message which will be sent to target customer are availble to config on following modules : - -+ Marketing Request - -+ Campaign Rule - -+ Item master …. - -### Exception Flow - -* + 1. Input data are not passed all validations and then the user choose cancel the action then use case ends in failure. - -## Marketing Campaign - -### Requirement Definition - -* + - 1. Marketing Campagin Module is used to filter out a list of target customers that satisfy the marketing criterions. - -### Process Flow - -[Image Removed] - -### Trigger - -N/A - -### Pre- Conditon - -1. Users have to have access rights in “Marketing Request” module to able to access this screen. -2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. -3. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. -4. To send marketing messange when an envent is triggered (real time events or batch events - ) then : - 1. Pre-Defined Event: Define the action to indentify when event triggers: such as login/ Get balance detail view/ leave feedback on portal app. - 2. FE Events: APIs or services can be used to initiate the action and make a call to the backend (BE) to determine whether the event has been triggered; if so, the assigned message for this event should be sent. - 3. Batch job: marketing message can be automatically sent by the system via batch jobs. - -### Wireframe - -* + - * 1. Marketing request summary listing page - -[Image Removed] - -1. Filter - -[Image Removed] - -1. Create/Edit mode - 1. Step 1: General information - -[Image Removed] - -* 1. Step 2: Run schedule - -[Image Removed] - -[Image Removed] - -* 1. Step 3: Targeting - -[Image Removed] - -4. Detail view - -### Business Rules - -1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_12). -2. OLS system will use Query Builder to build query for marketing criteria. -3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. -4. OLS system support AND or OR condition between difference criteria groups on the same request. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. - -*For example:* - -*Rule 1:* - -*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* - -*Rule 2:* - -*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* - -1. Introduce NOT toggle switch to support exclusion criteria. -2. Click on the “Marketing Request” in Main icon to bring up the screen for accessing the Marketing Request listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). -3. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Marketing Request screen is illustrated in the [wireframe](#_Wireframe_12). -4. **Screen description** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| **Step 1: General Information** | | | | -| | Request ID \* | Unique identifier of the OneMarketing Request Not allow special characters | X(20) | -| | Description \* | Description of the OneMarketing Request | X(100) | -| | Effective Date From\* | The start date of Effective period of the marketing request | Date The date format must adhere to the configured format | -| | Effective Date To \* | The end date of Effective period of the marketing request | Date The date format must adhere to the configured format | -| | Marketing Function \* | * Including 2 main functions of OneMarketing Request: + Notification [N] - The message template set up at section [Marketing Message](#_Marketing_message) is sent to target customers + Triger Campain Rule [TCR] - A campaign is applied to add/redeem/adjust points to target customers based on Transaction Code. | Check box Allow to select only one value Lookup value from “Code\_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | -| **Step 2: Run schedule and message content** | | | | -| | Trigger method \* | Two methods to select when message will be sent to target customer: Schedule Event trigger | Radio button Lookup value from “Code\_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | -| | Run Schedule \* | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Radio button Lookup value from “Code\_Management” table where type code is ‘run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master. | -| | One time | [Image Removed] * 1. This option includes following fields: 1. Fixed date\*: This field is only active and required when “One time” schedule is selected. This field is date format (Date time format must respect the date format configuration). This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 2. Request will occur only one time when process date is equal to the fixed date at the selected time. | | -| | Daily | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n day at the selected time. | | -| | Weekly | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n weeks on selected day of the week and at the selected time | | -| | Monthly | * 1. Option 1 [Image Removed] This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is selected on “Repeat on the” filed. This is multiple select field. - Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected day of the month and at the selected time. * 1. Option 2 [Image Removed] This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. - In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. - Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected period of day of the weeek and at the selected time. | | -| | Annually | [Image Removed] This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occurred every n year on the selected day and selected month. | Drop-down Select one | -| | Business Event | This filed is actived and requied when “Event trigger” method is selected. A drop-down list is used to select the event. When the event occurs, a request is triggered to send a message to the target customer. | Drop-down Multiple select. | -| | Message template\* | This filed is actived and required only when “Notification” marketing function is selected. | Drop-down Lookup value from martketing message screen. | -| | OLS Transaction Code | This filed is actived and required only when “Trigger Campaign Rule” marketing function is selected. | Drop-down Lookup value from OLS Transaction Code screen. Refer “OLS Transaction Code” API under Campaign Management | -| **Step 3: Targeting** **This step is used to config the conditions to get target customer.** | | | | -| | Trigger method \* | There are two options to setup targeting. * + - OMR Criteiria - Upload file | Radio button Lookup value from master data. | -| | **OMR Criteira is selected** | | | -| | [Image Removed] | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “[Image Removed]” button to create new group. | Button | -| | [Image Removed] | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | -| | Right panel | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. [Image Removed] | View only | -| | Drag/Drop criteria | Each criteria can be drag one more time on each request. The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. [Image Removed] | Action | -| | **“Upload file” is selected** [Image Removed] | | | -| | Browse File | Allow users to drag and drop an upload file, or the user can choose a file from their computer to upload it into the system. Use the 'Upload file' option when users have a specific targeting list that they want to use for the campaign. | Button | - -* 1. “Save as draft” and “Save as template” feature are applied on this screen. - 2. **OMR batch job will trigger marketing request as following processing:** - -OMR job (OMR) just trigger effectived marketing requests based on Effective period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. - -OMR creates notification messages to be sent to customers selected based on criteria configured by users in the step 3 -OMR criteria – e.g., to send an SMS message to customers whose birthday is due in the next N days. - -OMR can also be configured to trigger awarding batches generated by extracting transactions from Transaction log table. - -OMR can be configrured to trigger CP rule for the customer selected based on based on criteria configured by users in the step 3 -OMR criteria – e.g., to award 100 cash back to customers whose birthday in Tet holiday. - -OMR will stop send message when limit is reached. The limit based on frequency capping configurued by user in step 4- Frequency capping. - -| | | -| --- | --- | -| Batch id | OMR job ==tbd== | -| Description | Processes OneMarketing Requests (OMR) on the configured schedule | -| File Id | Nil | -| Input file | Nil | -| input staging table | ==TBD== | -| Tables read | Its depending in OMR criteria list which should be defined as an attribute for each criteira. == TBD==== | -| Tables updated | =TBD=== | -| Output staging table | Nil | -| Output file | Nil | -| Unwind job | ==TBD== | - -### Post – Condition - -* + - 1. Marketing content is sent to target customer or Target customer trigger CP rule. - -### Exception Flow - -* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. - -## Marketing Frequency Cap - -### Requirement Defintion - -* + - 1. By controlling frequency capping, business can provide a more personalized customer expirence. Beside, frequency capping can provide a high level overview of the need for a notification capping system and the expected benefits for the business and its customers. - 2. Business able to setup the daily, weekly, monthly capping per customer. - 3. The system should automaticly enforcement of notification caps across different communication channels. - -### Process Flow - -### Trigger - -### Pre-Conditions - -1. Users have to have access rights in “Frequency Capping” module to able to access this screen. -2. Depending on user’s access right to user can modify the frequency capping of the marketing campaign. - -### Wireframe - -* + - * 1. Listing page - -[Image Removed] - -* + - * 1. Edit mode - -[Image Removed] - -* + - * 1. View mode - -[Image Removed] - -### Business Rules - -1. This step is used to set up a limit to the number of times a message has been sent to per uniquie customer on specific period. -2. This step is also used to setup a limit the number of message that a business allow to send to customer through specific message channel. -3. Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Listing page** | | | | -| | Notification Channel/Kênh thông báo | The name of the notification channel | Display | -| | Effective Date From /Hiệu lực từ ngày | The start date of the cap | Display as date format. The display format should respect the configured format. | -| | Effective Date To/Hiệu lực tới ngày | The last effective date of the cap | -| | Frequency Cap/Giới hạn tần suất | The frequency cap on each channel. Each period unit is displayed as a separate record with the cap | Display | -| | Include White List/Bao gồm danh sách trắng | Whitelist who are excluded from the cap or not | Display | -| **Edit mode** | | | | -| | Frequency Cap Id\*/ Id giới hạn tần suất | The Record inditifier | X(10) | -| | Notification Channel\*/Kênh thông báo | Marketing Frequecny Capping identifier A drop-down to select one channel to apply the capping rules. A list incluse following channel: * + - SMS - Email - Push Notifications | Drop-down Select one | -| | Effective Date From \*/ Hiệu lực từ ngày | The start date of the effective period of the cap | Date The system should only have one effective cap applied on each channel at any given time | -| | Effective Date To\*/Hiệu lực tới ngày | The end date of the effective period of the cap | -| | **Frequency Cap/ Giới hạn tần suất** **Require at least one period unit** | | | -| | + Add Period Unit/ Thêm chu kì | Click to add new period unit to limit for chosen channel. | Button | -| | Capping Period \*/Chu kì | A drop-down to select the following period: * + 1. Daily: Maximum number of notifications per day. 2. Weekly: Maximum number of notifications per week 3. Monthly: Maximun number of notifications per month. | Drop-down Select one Each period should only be configured with one cap value at the same time. | -| | Maximum number \*/Số lần gửi thông báo tối đa | The maximum the number of times a message has been sent to per uniquie customer. | 9(12) | -| | Include Whitelist/Không bao gồm danh sách trắng | This option disallows/allows the white customer list allow to receive a higher notification than normal customer for spefic scenario. | Swith button Defaut OFF | -| | Customer list /Danh sách khách hàng | A drop-down to select the white customer list. This allows the system to recognize the white list customers and ignore the frequency capping rules. This is a condition filed and only active and required if the capping rules include the white customer list. | Drop – down Multiple select | -| | Description /Mô tả | The description of the capping. For refer only | X(100) | - -* 1. Frequency Capping are applied to all marketing campaigns in the system for customer level. - 2. The system should automaticallytrack the number of notifications a customer has received across all notification channels as well as the period unit. - 3. If the customer has reached the notification cap then the notification is not delivered to customer. - 4. The white list who are excluded from the frequency cap rules should be tracked also. - -### Post –condition - -### Exception Flow - -## A/Bn Testing - -### Requirement Definition - -* + - 1. This function is used to evaluate and optimize various elements of the marketing program to improve customer engagement, retention, and overall performance. - 2. OLS support both A/Bn content testing and A/Bn target customer testing. - 3. For A/Bn content testing, one variation (content A) of the marketing request is sent to a subset of target customers, and one or more different variations (content sample B/ content sample n) are sent to the same subset of target customers. The goal is to identify which content in the marketing request yields the best results. - 4. Unlike A/B content testing, A/Bn target customer testing focuses solely on the target customers. In the same testing request, one variation is designated for 'target customer A,' while one or more variations are designated for 'target customer B' or 'target customer n.' The goal is to identify which OMR criteria in the marketing request will reach more customers. - -### Process Flow - -[Image Removed] - -### Trigger - -N/A - -### Pre-Conditions - -* + - * 1. For A/Bn messsage content testing, result testing must be provied from third-party to OLS can collect data and analyze result to introduce report which user can use to make decision which on is better. - 2. Users have to have access rights in “A/Bn Testing” module to able to access this screen. - 3. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. - 4. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. - -### Wireframe - -Summary listing page - -[Image Removed] - -* 1. Filter - -[Image Removed] - -* 1. Content marketing testing configuration - -**Step1: Choose testing type is “Content message testing”** - -[Image Removed] - -Step 2: Setup general information - -[Image Removed] - -Step 3: Choose target customer - -[Image Removed] - -Step 4: Setup variant content message - -[Image Removed] - -Step 5: Set up run schedule - -[Image Removed] - -* 1. Target customer testing configuration - -Step 1: Choose “Target customer testing” - -[Image Removed] - -Step 2: Set up general information - -[Image Removed] - -Step 3: Setup variant target customer - -[Image Removed] - -Step 4: Setup run schedule - -[Image Removed] - -### Business Rules - -1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wireframe. -2. OLS system will use Query Builder to build query for OMR criteria when user setup target customer. -3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. -4. Click on the “A/Bn Testing” in Main icon to bring up the screen for accessing the A/Bn Testing listing page. The detail as illustrated in the [wireframe](#_Wireframe_16). -5. Click on Add button ([Image Removed]) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for A/B testing screen is illustrated in the [wireframe](#_Wireframe_16)s. -6. **Screen description:** - -**Create/Edit mode** - -| | | | | | -| --- | --- | --- | --- | --- | -| **Index** | **Field** | | **Descriptions** | **Data type** | -| * + - * 1. **A/B message content testing** | | | | | -| **Step 1: Campaign information** | | | | | -| | | Campaign ID \* | Marketing Campaign ID Unique and Not allow specical characters | X(20) | -| | | Campaign Description | Description of Marketing Campaign ID | X(100) | -| | | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | | Message channel \* | SMS Email Push | Checkbox Allow to select only one value Lookup from master data. | -| **Step 2: Choose target customer** The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). | | | | | -| | [Image Removed] | | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “[Image Removed]” button to create new group. | Button | -| | [Image Removed] | | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | -| | Right panel | | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. [Image Removed] | View only | -| | Drag/Drop criteria | | Each criteria can be drag one more time on each request . The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. [Image Removed] | Action | -| **Step 3: Set up varial content** [Image Removed] | | | | | -| | Variant A Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial A will be added here. | Tab | -| | Varial B Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial B will be added here. | | -| | Add | | Click to add to introduce new tab to create new content varial. System will automation populate varinant name as default and users can rename and should be unique value on one each campaign. | Button | -| **Step 4: Running schedule** | | | | | -| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | -| | One time | | [Image Removed] * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format . This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will run only one time when process date is equal to the fixed date at the selected time. | | -| | Daily | | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | -| | Weekly | | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | -| | Monthly | | * 1. Option 1 [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | -| | Annually | | [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | -| **II: A/B target customer testing** | | | | | -| **Step 1: General information** | | | | | -| | Campaign ID \* | | Marketing Campaign ID Unique and Not allow specical characters | X(20) | -| | Campaign Description | | Description of Marketing Campaign ID | X(100) | -| | Effective Date From | | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | Effective End date\* | | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| **Step 2: Set up variant target customer** | | | | | -| | Variant A User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial A will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | -| | Varial B User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial B will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | -| | Add | | Click to add to introduce new tab to create new target customer varial. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). System will automation populate variant name as default and User can rename and should be unique value on one each campaign. | Button | -| **Step 3: Running schedule** | | | | | -| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | -| | One time | | [Image Removed] * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format. This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. * Campaign will run only one time when process date is equal to the fixed date at the selected time. | | -| | Daily | | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | -| | Weekly | | [Image Removed] * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | -| | Monthly | | * 1. Option 1 [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | -| | Annually | | [Image Removed] This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | - -**Content marketing testing view mode** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| | Campaign ID | Campaign ID | X(20) | -| | Campaign Description | Description of Marketing Campaign ID | X(100) | -| | Message chanel\* | Push or Email or SMS | Display | -| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | OMR criteria | View as Rule criteria view mode for this part | Display | -| | Variant A | View as Message Template view mode for message content part | Tab | -| | Variant B | View as Message Template view mode for message content part | Tab | -| | Variant N | View as Message Template view mode for message content part | Tab | -| | Result | =TBD== It is depened on the third-party partner and the goal. We can want to see the total result on each content variation or detail result for each target customer on each content variation. | ==tbd== | - -**Targeting marketing testing view mode** - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field** | **Description** | **Data type** | -| | Campaign ID | Campaign ID | X(20) | -| | Campaign Description | Description of Marketing Campaign ID | X(100) | -| | Message chanel\* | Push or Email or SMS | Display | -| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | -| | Variant A | View as Marketing request view mode for OMR criteria part. | Tab | -| | Variant B | View as Marketing request view mode for OMR criteria part. | Tab | -| | Variant N | View as Marketing request view mode for OMR criteria part. | Tab | -| | Result | One gird to view the customer list on each variation | | | | | | | --- | --- | --- | --- | --- | | **Variation** | **Total number of customers** | **Total Female customer** | **Total male customer** | **….** | | Variation A | 100 | 10 | 90 | | | Variation B | 150 | 100 | 50 | | | Variation n | 140 | 50 | 90 | | | ==tbd== **Which criteria should be summarized??** | - -* 1. **A/Bn batch job will trigger marketing request as following processing:** - 1. A/Bn testing job (ABn) just trigger effectived A/Bn testing requests based on effectived period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. - 2. For content testing, ABn creates A/Bn message content selected based on the variation content configured by user. These message to be sent to the same customers selected based on criteria configured by users. E.g to send 3 promotion messages to customers whose birthday is due in the next N days. The result testing should be provied by parter so that OLS can provide the report to user can decide which content messge is better. - 3. Regarding to target customer testing, A/Bn locates the target customer based on criteria configured by users. User can verify the result testing after batch job is completed. - 4. For A/Bn SMS content testing, we can track click-through rates if SMS includes links or calls to action. By including unique links for different messages or recipients, we can measure how many people clicked on those links to interact with each content. From this result we can have the temporary open rate to user can decide which one is better. - 5. For A/Bn Email content testing, open rate = (Number of opens / Number of delivered emails)/100. Number of opens is provided by third-party or we have to send email is in HTML format, as tracking pixels work with HTML emails. The number of opens willl be is the number of times the tracking pixel was downloaded when recipients opened the email. - 6. ==tbd== - -### Post-Conditions - -### Exception Flow - -## BlackList - -### Requirement Definition - -* + - 1. The business need to exclude specific customer or groups from marketing campaigns for strategic reasons, such as fraud customers. - 2. Ensuring marketing efforts are focused on the most relevant and engaged audience to improve efficiency and return on investment. - 3. A set of customer who will be blocked for reward/promotion notification from a business wil be pre-definiton in this module. - -### Process Flow - -### Trigger - -* + - * 1. The customer who has fraud behaviors will need to be added into black list. - -### Pre-Conditions - -* + - * 1. Users have to have access rights in “Black List” module to able to access this screen. - 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. - -### Wireframe - -Listing page - -[Image Removed] - -Edit mode - -Step 1: Generral Information - -[Image Removed] - -Step 2: Customer List - -[Image Removed] - -[Image Removed] - -[Image Removed] - -Detail Mode - -[Image Removed] - -### Business Rules - -Users are able to upload a list of customers who will be blocked from the marketing campaign by uploading a file into the system. - -Additionally, users are able to assign customers to the blacklist by selecting a list of cif number belong to OLS system. - -Users are able to review the customer list or download the customer list that they have already uploaded to the system. - -Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Listing page** | | | | -| | ID / ID | Blacklist indentifier | Display | -| | Name List/ Tên danh sách | The name of the black list. | Display | -| | Description/Mô tả | More description for this blacklist. | Display | -| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | -| | [Image Removed] | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | -| **Edit mode** | | | | -| | **General Information** | | | -| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | -| | Name List\*/ Tên danh sách | The name of the black list. For refere only | X(50) | -| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | -| | **Customer List** | | | -| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | -| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be blocked from the marketing campaign if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | -| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | -| | Customer List | If file upload successful then the customer list will be display here | Display | - -Users review and approve the record in the same manner as on other screens - -### Post-Conditions - -The blacklist is stored and accessible to another module. - -### Exception Flow - -If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. - -The system should clearly display the upload processing status to the user. - -## Whitelist - -### Requirement Definition - -* + - 1. The business need to exclude a list of customers that are excluded from the standard frequency cap rules. - 2. The whitelist ensures your top customers continue receiving your marketing messages without limit. We can use the whitelist for testing and optimizing campaign purposes. We can aslo use the whitelist for user who have shown strong interest in your marketing campaigns. - -### Process Flow - -### Trigger - -* + - * 1. A set of customers needs to be added to the whitelist to exlcuse them from the frequency cap rules. - -### Pre-Conditions - -* + - * 1. Users have to have access rights in “Whitelist” module to able to access this screen. - 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. - -### Wireframe - -Listing page - -[Image Removed] - -Edit mode - -Step 1: Generral Information - -[Image Removed] - -Step 2: Customer List - -[Image Removed] - -[Image Removed] - -[Image Removed] - -Detail Mode - -[Image Removed] - -### Business Rules - -Users are able to upload a list of customers who will be excluded from the frequency cap rules by uploading a file into the system. - -Additionally, users are able to assign customers to the whitelist by selecting a list of cif number belong to OLS system. - -Users are able to review the customer list or download the customer list that they have already uploaded to the system. - -Screen description - -| | | | | -| --- | --- | --- | --- | -| **Index** | **Field (EN/VN)** | **Description** | **Data type** | -| **Listing page** | | | | -| | ID / ID | Blacklist indentifier | Display | -| | Name List/ Tên danh sách | The name of the black list. | Display | -| | Description/Mô tả | More description for this whitelist. | Display | -| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | -| | [Image Removed] | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | -| **Edit mode** | | | | -| | **General Information** | | | -| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | -| | Name List\*/ Tên danh sách | The name of the whitelist. For refere only | X(50) | -| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | -| | **Customer List** | | | -| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | -| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be excluded from the frequency cap rules if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | -| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | -| | Customer List | If file upload successful then the customer list will be display here | Display | - -Users review and approve the record in the same manner as on other screens - -### Post-Conditions - -The whitelist is stored and accessible to another module. - -The whitelist is excludes from the frequency cap rules as default. If there is any cap rules should need to include the whitelist then the user should indicate those whitelist. - -### Exception Flow - -If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. - -The system should clearly display the upload processing status to the user. - +## OneMarketing + +### Overview + +OneMarketing Module includes 2 function modules: + +* **Marketing Message:** Manage (CRUD features) all message templates that are used in the system. +* **OneMarketing Request (OMR):** Filter the target customers who satisfy the set-up-criteria to send messages or get reward transactions. +* **A/Bn Testing:** to compare at least two versions of a SMS, email, or other marketing elements to determine which one performs better. +* **Frequency Capping:** The function to practice of controlling the frequency and volume of notifications or channel delivered to customers to avoid overwhelming them +* **Blacklist:** A list of customer who will be blocked for reward/promotion notification from a business. +* **Whitelist:** A list of customer who has given their consent to receive specifc types of marketing message from business. + +### Marketing message + +#### Requirement definition + +1. The marketing message module is used to define a communication message that will be sent to the target list. +2. A Message Template can be built based on a message with pre-defined parameters or HTML file. +3. User can build different messages for different marketing channels (e.g: SMS / Notification Push/ Email/ OTT …). + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-conditions + +1. Users have to have access rights in “Marketing Message” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually message template. +3. Assume that all OMR criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +#### Wireframe + +* + - 1. Message summary listing page + +![](data:image/png;base64...) + +* + - 1. Filter + +![](data:image/png;base64...) + +* + - 1. SMS + +1. Create SMS + +**Step1 : Choose message chanel : SMS and choose create new or re-use existing message template** + +![](data:image/png;base64...) + +**Step 2: Step up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up message content** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +**Finish by save.** + +1. SMS detail view + +![](data:image/png;base64...) + +* + - 1. **Email** + +1. Create Email message + +**Step 1: Choose message chanel : Email and choose create new or re-use existing Email template** + +![](data:image/png;base64...) + +**Step 2: Set up “General information”** + +![](data:image/png;base64...) + +**Step 3: Set up “Sender information”** + +![](data:image/png;base64...) + +**Step 4: Setup Email content** + +![](data:image/png;base64...) + +**Upload email template** + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. **Push notification** + +Create Push notification message + +**Step 1: Choose message chanel : Push and choose create new or re-use existing Push template** + +![](data:image/png;base64...) + +**Step 2: Update “Generate information”** + +![](data:image/png;base64...) + +**Step 3.1: Message content configuration for “Richer push”** + +![](data:image/png;base64...) + +**Step 3.2: Message content for “Carousel push”** + +![](data:image/png;base64...) + +**View mode** + +![](data:image/png;base64...) + +#### Business Rules + +1. OLS system can send a message to target customer through a notification on the app, an email, an SMS, and so on. These varied media used for message delivery are known as “channels”. +2. In this version, OLS support to user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. Just enter the email adress or phone number user wish to check the message preview. +3. Besides, OLS support to user can setup message template to re-use in the furture. +4. Click on the “Marketing Message” in Main icon to bring up the screen for accessing the Markting Message listing page. The detail as illustrated in the [wireframe](#_Wireframe_10). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for marketing message screen is illustrated in the [wireframe](#_Wireframe_10). +6. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Create /Edit mode** | | | | +| **SMS message** | | | | +| | **Step 1: General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | SMS Type | Drop-down to select SMS type: Promotion/Marketing Transaction | Check box type Select one value only Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date Date time format must respect the date configuration format | +| | Effective End Date \* | The end date of the effective period of the message | Date Date time format must respect the date configuration format | +| | **Step 2: SMS Content Configuration** | | | +| | SMS Brand Name \* | Drop -down to select SMS Sender | Drop-down Lookup value from master data | +| | Message \* | The message content of the SMS. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. SMS message don’t support : 1. Images 1. A subject line 2. Attachments **SMS messages are written in Unicode (non –GSM standard). Standard single message or multi-part message are credited based on the message content.** | X(5000) | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Preview | The message will be automation displayed in the preview part. | Displaya | +| | The number of characters in the message\* | This value will be automatically upadated when the user update the message content. | Display as number format | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a phone number is dispalyed 2. When user click on “Send sample” a confirm message is display. It use to user confirm that the system will send a testing message into inputed phone number. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a sms message into inputed phone number. 3. Mobile phone number should be required when user click on” Send sample”. If not found should reject with error message | Button | +| **Email message** | | | | +| | **Step 1 : General Information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Email Type | Drop-down to select Email type: **Promotion/Marketing** **Transaction** | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “OMR-type”. Refer to ‘list-by-code-type’ API under Master Data. Lookup value from master data | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format | +| | Use type \* | 2 options to config email message : * + 1. Use messge. 2. Upload template. | Checkbox Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | **Step 2: Sender information** | | | +| | Sender Name\* | The name of sender | X(100) | +| | From email\* | The email addess used to send email to target customer | Display This email is configured. | +| | Subject\* | Subject of email | X(100) | +| | Preview Text | Preheader of Email Preheader can help user connect with customer and increase customer’s open rate. If Prejeader is not provided then the first line of email content will be display instead | X(100) | +| **3.** | **Step 3: Email content figuration** | | | +| | Message | Conditon field The message content of the Email. If “Use message” is selected then this field is actived. System must allow to edit HTML format. The system should support to generate into text format. System must allow to put image/url… as message content. The list of message parameters are included to be used. User can drop/drag message paramters into message. Assumation that the list of message parameters are defined as attribute (the same approach as Rule criteria) to able to drop/drag into message. | Character | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Upload file | This filed is actived when “Use template” is selected. ![](data:image/png;base64...) Allow users to drag and drop an HTML template file, or they can choose a file from their computer to upload it into the system. After uploading, the system displays message content based on the uploaded file and allows the user to review and make modifications. | Button | +| | Re-Upload | Use this button to re-upload the email template. | Button | +| | Preview the email | The message will be automation displayed in the preview part. Sender / Subject and Preheader will be displayed here. If Preheader is not provided then the first line of message will be display instead. | Display | +| | Send sample | This functions to support the user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter an email address. This entry should adhere to the email format field. 2. When click on “Send sample” a confirm button to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test email into inputed email address. 3. The email address should be required when user click on” Send sample”. If not found should reject with error message. | Button | +| **Notification Push** | | | | +| | **Step 1: General information** | | | +| | Message ID \* | Unique identifier of the Message. Not allow special characters | X(10) | +| | Message Description \* | Description of message | X(100) | +| | Notification Type | Drop-down to select Notification type: Promotion/Marketing Transaction | Check box Allow to select only one value. Lookup value “Code Management” table where type code is “email-use-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Effective Date From \* | The start date of the effective period of the message | Date The date format must adhere to the configured format | +| | Effective End Date \* | The end date of the effective period of the message | Date The date format must adhere to the configured format. | +| | **Step 2: Notification Content configuration** | | | +| | Message Title \* | The primary text that appears at the top of the notification | X(50) | +| | Message \* | The main content of the notification, providing additional information, context, or details related to the notification's purpose. The list of message parameters are included to be used. User can drop/drag message paramters into message. System must allow to put image/url as message content. | Text Area | +| | Message parameters | The message parameter list. ![](data:image/png;base64...) | Tree list | +| | Image type\* | Drop- down to selcte image type: SingerEicheer push (No image ) Richer Push (one image) Carousel Push (One or more than one image) | Drop- down Select one only Lookup value “Code Management” table where type code is “image-type”. Refer to ‘list-by-code-type’ API under Master Data. | +| | Upload Image | Condition field * + - 1. This field is not actived for Single Push 2. Image URL : Click on the Image URL field and type or paste the URL of the image 3. Upload: Drag/Drop image or click the uploaded from computer. If the Image type is 'Carousel Push,' then users can upload more than one image. The sequence sorting will be the same as the sequence displayed in the mobile app. Users can rearrange the images to adjust the sortinng. Image is required for “Richer push” and “Carousel Push”. | | +| | Preview the notification | The message will be automation displayed in the preview part: content/ image. Preview on IOS or Android | Display | +| | Link URL \* | Enter or paste the URL to which the user needs to navigate to. | X(100) | +| | Send sample | This functions to support user can test message enable previewing the message to make sure the message appear exactly the way it was meant to. * + - 1. A textbox to user can enter a CIF Number. From CIF Number the system will locate device's registration token, a device group's notification key, or a single topic. 2. A confirm message to user confirm that the system will send a testing message into inputed email address. User can choose “OK” or “Cancel”. If user click on “OK” button the system will send a test notification. 3. The token or key or something else which one the system used determine destination of the push message should be required when user click on” Send sample”. If not found should reject with error message. | Button | + +#### Post -codition + +* + 1. All message which will be sent to target customer are availble to config on following modules : + ++ Marketing Request + ++ Campaign Rule + ++ Item master …. + +#### Exception flow + +* + 1. Input data are not passed all validations and then the user choose cancel the action then use case ends in failure. + +### Marketing Campaign + +#### Requirement Definition + +* + - 1. Marketing Campagin Module is used to filter out a list of target customers that satisfy the marketing criterions. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre- Conditon + +1. Users have to have access rights in “Marketing Request” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. +3. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. +4. To send marketing messange when an envent is triggered (real time events or batch events + ) then : + 1. Pre-Defined Event: Define the action to indentify when event triggers: such as login/ Get balance detail view/ leave feedback on portal app. + 2. FE Events: APIs or services can be used to initiate the action and make a call to the backend (BE) to determine whether the event has been triggered; if so, the assigned message for this event should be sent. + 3. Batch job: marketing message can be automatically sent by the system via batch jobs. + +#### Wireframe + +* + - * 1. Marketing request summary listing page + +![](data:image/png;base64...) + +1. Filter + +![](data:image/png;base64...) + +1. Create/Edit mode + 1. Step 1: General information + +![](data:image/png;base64...) + +* 1. Step 2: Run schedule + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* 1. Step 3: Targeting + +![](data:image/png;base64...) + +4. Detail view + +#### Business Rule + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the [wireframe](#_Wireframe_12). +2. OLS system will use Query Builder to build query for marketing criteria. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. OLS system support AND or OR condition between difference criteria groups on the same request. The relationship operator on each group will be applied for all criteritions on the group. User can setup only one or many group on the same rule but OLS system just support the same operator condition bettwen groups such as all are OR conditons or all are AND conditions. + +*For example:* + +*Rule 1:* + +*Group 1* ***OR*** *Group 2* ***OR*** *Group 3* + +*Rule 2:* + +*Group 1* ***AND*** *Group 2* ***AND*** *Group 3.* + +1. Introduce NOT toggle switch to support exclusion criteria. +2. Click on the “Marketing Request” in Main icon to bring up the screen for accessing the Marketing Request listing page. The detail as illustrated in the [wireframe](#_Wireframe_12). +3. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for Marketing Request screen is illustrated in the [wireframe](#_Wireframe_12). +4. **Screen description** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| **Step 1: General Information** | | | | +| | Request ID \* | Unique identifier of the OneMarketing Request Not allow special characters | X(20) | +| | Description \* | Description of the OneMarketing Request | X(100) | +| | Effective Date From\* | The start date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Effective Date To \* | The end date of Effective period of the marketing request | Date The date format must adhere to the configured format | +| | Marketing Function \* | * Including 2 main functions of OneMarketing Request: + Notification [N] - The message template set up at section [Marketing Message](#_Marketing_message) is sent to target customers + Triger Campain Rule [TCR] - A campaign is applied to add/redeem/adjust points to target customers based on Transaction Code. | Check box Allow to select only one value Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| **Step 2: Run schedule and message content** | | | | +| | Trigger method \* | Two methods to select when message will be sent to target customer: Schedule Event trigger | Radio button Lookup value from “Code_Management” table where type code is ‘OMR-function’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | Run Schedule \* | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Radio button Lookup value from “Code_Management” table where type code is ‘run-schedule’. Refer to ‘list-by-code-type’ API under Master Data Master. | +| | One time | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\*: This field is only active and required when “One time” schedule is selected. This field is date format (Date time format must respect the date format configuration). This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 2. Request will occur only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n day at the selected time. | | +| | Weekly | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\*: The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. 1. Request will occur on every n weeks on selected day of the week and at the selected time | | +| | Monthly | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is selected on “Repeat on the” filed. This is multiple select field. - Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. - Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. - In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. - Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occur on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | ![](data:image/png;base64...) This option includes following fields: * + - Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. - Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. - Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. - Time of day to excute request\*: The time to OMR batch job running to trigger this request. This field is time format field. Request will occurred every n year on the selected day and selected month. | Drop-down Select one | +| | Business Event | This filed is actived and requied when “Event trigger” method is selected. A drop-down list is used to select the event. When the event occurs, a request is triggered to send a message to the target customer. | Drop-down Multiple select. | +| | Message template\* | This filed is actived and required only when “Notification” marketing function is selected. | Drop-down Lookup value from martketing message screen. | +| | OLS Transaction Code | This filed is actived and required only when “Trigger Campaign Rule” marketing function is selected. | Drop-down Lookup value from OLS Transaction Code screen. Refer “OLS Transaction Code” API under Campaign Management | +| **Step 3: Targeting** **This step is used to config the conditions to get target customer.** | | | | +| | Trigger method \* | There are two options to setup targeting. * + - OMR Criteiria - Upload file | Radio button Lookup value from master data. | +| | **OMR Criteira is selected** | | | +| | ![](data:image/png;base64...) | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | Each criteria can be drag one more time on each request. The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| | **“Upload file” is selected** ![](data:image/png;base64...) | | | +| | Browse File | Allow users to drag and drop an upload file, or the user can choose a file from their computer to upload it into the system. Use the 'Upload file' option when users have a specific targeting list that they want to use for the campaign. | Button | + +* 1. “Save as draft” and “Save as template” feature are applied on this screen. + 2. **OMR batch job will trigger marketing request as following processing:** + +OMR job (OMR) just trigger effectived marketing requests based on Effective period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + +OMR creates notification messages to be sent to customers selected based on criteria configured by users in the step 3 -OMR criteria – e.g., to send an SMS message to customers whose birthday is due in the next N days. + +OMR can also be configured to trigger awarding batches generated by extracting transactions from Transaction log table. + +OMR can be configrured to trigger CP rule for the customer selected based on based on criteria configured by users in the step 3 -OMR criteria – e.g., to award 100 cash back to customers whose birthday in Tet holiday. + +OMR will stop send message when limit is reached. The limit based on frequency capping configurued by user in step 4- Frequency capping. + +| | | +| --- | --- | +| Batch id | OMR job ==tbd== | +| Description | Processes OneMarketing Requests (OMR) on the configured schedule | +| File Id | Nil | +| Input file | Nil | +| input staging table | ==TBD== | +| Tables read | Its depending in OMR criteria list which should be defined as an attribute for each criteira. == TBD==== | +| Tables updated | =TBD=== | +| Output staging table | Nil | +| Output file | Nil | +| Unwind job | ==TBD== | + +#### Post – Condition + +* + - 1. Marketing content is sent to target customer or Target customer trigger CP rule. + +#### Exception Flow + +* + 1. Input data are not passed all validations and then user choose cancel the action then use case ends in failure. + +### Marketing Frequency Cap + +#### Requirement Defintion + +* + - 1. By controlling frequency capping, business can provide a more personalized customer expirence. Beside, frequency capping can provide a high level overview of the need for a notification capping system and the expected benefits for the business and its customers. + 2. Business able to setup the daily, weekly, monthly capping per customer. + 3. The system should automaticly enforcement of notification caps across different communication channels. + +#### Process flow + +#### Trigger + +#### Pre-condition + +1. Users have to have access rights in “Frequency Capping” module to able to access this screen. +2. Depending on user’s access right to user can modify the frequency capping of the marketing campaign. + +#### Sktech + +* + - * 1. Listing page + +![](data:image/png;base64...) + +* + - * 1. Edit mode + +![](data:image/png;base64...) + +* + - * 1. View mode + +![](data:image/png;base64...) + +#### Business Rule + +1. This step is used to set up a limit to the number of times a message has been sent to per uniquie customer on specific period. +2. This step is also used to setup a limit the number of message that a business allow to send to customer through specific message channel. +3. Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | Notification Channel/Kênh thông báo | The name of the notification channel | Display | +| | Effective Date From /Hiệu lực từ ngày | The start date of the cap | Display as date format. The display format should respect the configured format. | +| | Effective Date To/Hiệu lực tới ngày | The last effective date of the cap | +| | Frequency Cap/Giới hạn tần suất | The frequency cap on each channel. Each period unit is displayed as a separate record with the cap | Display | +| | Include White List/Bao gồm danh sách trắng | Whitelist who are excluded from the cap or not | Display | +| **Edit mode** | | | | +| | Frequency Cap Id\*/ Id giới hạn tần suất | The Record inditifier | X(10) | +| | Notification Channel\*/Kênh thông báo | Marketing Frequecny Capping identifier A drop-down to select one channel to apply the capping rules. A list incluse following channel: * + - SMS - Email - Push Notifications | Drop-down Select one | +| | Effective Date From \*/ Hiệu lực từ ngày | The start date of the effective period of the cap | Date The system should only have one effective cap applied on each channel at any given time | +| | Effective Date To\*/Hiệu lực tới ngày | The end date of the effective period of the cap | +| | **Frequency Cap/ Giới hạn tần suất** **Require at least one period unit** | | | +| | + Add Period Unit/ Thêm chu kì | Click to add new period unit to limit for chosen channel. | Button | +| | Capping Period \*/Chu kì | A drop-down to select the following period: * + 1. Daily: Maximum number of notifications per day. 2. Weekly: Maximum number of notifications per week 3. Monthly: Maximun number of notifications per month. | Drop-down Select one Each period should only be configured with one cap value at the same time. | +| | Maximum number \*/Số lần gửi thông báo tối đa | The maximum the number of times a message has been sent to per uniquie customer. | 9(12) | +| | Include Whitelist/Không bao gồm danh sách trắng | This option disallows/allows the white customer list allow to receive a higher notification than normal customer for spefic scenario. | Swith button Defaut OFF | +| | Customer list /Danh sách khách hàng | A drop-down to select the white customer list. This allows the system to recognize the white list customers and ignore the frequency capping rules. This is a condition filed and only active and required if the capping rules include the white customer list. | Drop – down Multiple select | +| | Description /Mô tả | The description of the capping. For refer only | X(100) | + +* 1. Frequency Capping are applied to all marketing campaigns in the system for customer level. + 2. The system should automaticallytrack the number of notifications a customer has received across all notification channels as well as the period unit. + 3. If the customer has reached the notification cap then the notification is not delivered to customer. + 4. The white list who are excluded from the frequency cap rules should be tracked also. + +#### Post –condition + +#### Exception flow + +### A/Bn Testing + +#### Requirement Definition + +* + - 1. This function is used to evaluate and optimize various elements of the marketing program to improve customer engagement, retention, and overall performance. + 2. OLS support both A/Bn content testing and A/Bn target customer testing. + 3. For A/Bn content testing, one variation (content A) of the marketing request is sent to a subset of target customers, and one or more different variations (content sample B/ content sample n) are sent to the same subset of target customers. The goal is to identify which content in the marketing request yields the best results. + 4. Unlike A/B content testing, A/Bn target customer testing focuses solely on the target customers. In the same testing request, one variation is designated for 'target customer A,' while one or more variations are designated for 'target customer B' or 'target customer n.' The goal is to identify which OMR criteria in the marketing request will reach more customers. + +#### Process flow + +![](data:image/x-emf;base64...) + +#### Trigger + +N/A + +#### Pre-Condition + +* + - * 1. For A/Bn messsage content testing, result testing must be provied from third-party to OLS can collect data and analyze result to introduce report which user can use to make decision which on is better. + 2. Users have to have access rights in “A/Bn Testing” module to able to access this screen. + 3. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + 4. All OMR citerions must to be defined as an attribute for each criterion to user can drop/drag to determine target audience. + +#### Wireframe + +Summary listing page + +![](data:image/png;base64...) + +* 1. Filter + +![](data:image/png;base64...) + +* 1. Content marketing testing configuration + +**Step1: Choose testing type is “Content message testing”** + +![](data:image/png;base64...) + +Step 2: Setup general information + +![](data:image/png;base64...) + +Step 3: Choose target customer + +![](data:image/png;base64...) + +Step 4: Setup variant content message + +![](data:image/png;base64...) + +Step 5: Set up run schedule + +![](data:image/png;base64...) + +* 1. Target customer testing configuration + +Step 1: Choose “Target customer testing” + +![](data:image/png;base64...) + +Step 2: Set up general information + +![](data:image/png;base64...) + +Step 3: Setup variant target customer + +![](data:image/png;base64...) + +Step 4: Setup run schedule + +![](data:image/png;base64...) + +#### Business rules + +1. The same approach as Campaign Rule Criteria, each of marketing criterions are accessed directly by drag/drop on the right **Criteria** panel as illustrated in the wireframe. +2. OLS system will use Query Builder to build query for OMR criteria when user setup target customer. +3. All criterions will be listed on selection criteria panel (right panel). User can drag/drop criteria from right panel to set up rule. Criterion list will be defined as attribute so that user can define needed criteritions. +4. Click on the “A/Bn Testing” in Main icon to bring up the screen for accessing the A/Bn Testing listing page. The detail as illustrated in the [wireframe](#_Wireframe_16). +5. Click on Add button (![](data:image/png;base64...)) in the screen to bring up the edit form; clicking on the MoreOutLined icon (⋮) then click on Edit icon (!) also brings up the same edit form. The edit form for A/B testing screen is illustrated in the [wireframe](#_Wireframe_16)s. +6. **Screen description:** + +**Create/Edit mode** + +| | | | | | +| --- | --- | --- | --- | --- | +| **Index** | **Field** | | **Descriptions** | **Data type** | +| * + - * 1. **A/B message content testing** | | | | | +| **Step 1: Campaign information** | | | | | +| | | Campaign ID \* | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | | Message channel \* | SMS Email Push | Checkbox Allow to select only one value Lookup from master data. | +| **Step 2: Choose target customer** The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). | | | | | +| | ![](data:image/png;base64...) | | Depended on the purpose of each OMR request and the criterions list need to be setup to allocate and arrange all criterions into only one or many group. Click on “![](data:image/png;base64...)” button to create new group. | Button | +| | ![](data:image/png;base64...) | | This button is used to exclude all the coming transaction meet the rule criteria. Switch NOT button are applied on combinaiton of all group OR on all criteria on each group. | Switch button | +| | Right panel | | List all active criteria on the system. Assumed that Each criteria per category will be defined as an attribute. ![](data:image/png;base64...) | View only | +| | Drag/Drop criteria | | Each criteria can be drag one more time on each request . The condition and filler value for each criteria will be display base on data type of criteria. See more detail on [Campaign Rule](#_Campaign_Rule_Criteria) Criteria. ![](data:image/png;base64...) | Action | +| **Step 3: Set up varial content** ![](data:image/png;base64...) | | | | | +| | Variant A Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial A will be added here. | Tab | +| | Varial B Users can rename and should be unique value on one each campaign | | Depending in Message channel : SMS/ Email/ Push notification, this tab is display as step 2 of Marketing message screen according to each message channel. See more on [Marketing message](#_Business_Rules). Content varial B will be added here. | | +| | Add | | Click to add to introduce new tab to create new content varial. System will automation populate varinant name as default and users can rename and should be unique value on one each campaign. | Button | +| **Step 4: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format . This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | +| **II: A/B target customer testing** | | | | | +| **Step 1: General information** | | | | | +| | Campaign ID \* | | Marketing Campaign ID Unique and Not allow specical characters | X(20) | +| | Campaign Description | | Description of Marketing Campaign ID | X(100) | +| | Effective Date From | | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| **Step 2: Set up variant target customer** | | | | | +| | Variant A User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial A will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Varial B User can rename and should be unique value on one each campaign | | This tab display the all OMR criteria to user can drag/drop to config the criterios to get the target customer. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). Target customer varial B will be added here. The system will use all OMR criteria configuration on this tab to conduct and get target customer A. | Tab | +| | Add | | Click to add to introduce new tab to create new target customer varial. The OMR criteria list must be the same as the OMR criteria list on “[Marketing request”](#_Marketing_Request). System will automation populate variant name as default and User can rename and should be unique value on one each campaign. | Button | +| **Step 3: Running schedule** | | | | | +| | Run Schedule \* | | * This field is activated and required when “Schedule” method is selected only. * Schedule to run OneMarketing Request Batch, include: *[O] – Once Time [D] - Daily* *[W] - Weekly [M] - Monthly* *[A] - Annually* | Drop-down Select one Lookup value from master data | +| | One time | | ![](data:image/png;base64...) * 1. This option includes following fields: 1. Fixed date\* : This field is activated and required when “One time” schedule is selected. This field is Date format. This field is actived and required when “Schedule” method is selected only. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. * Campaign will run only one time when process date is equal to the fixed date at the selected time. | | +| | Daily | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n day where n from 1 to 100. This is select one field. 2. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n day at the selected time. | | +| | Weekly | | ![](data:image/png;base64...) * + - 1. This option includes following fields: 1. Repeat every\* : The drop-down list to select the frequency on every n week where n from 1 to 52. This is select one field. 2. Day of the week: The drop -down list to select the day of week the request will be occurred. The list includes list of day of week (from Monday to Sunday). This is multiple select field. 3. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campign will run and repeat on every n weeks on selected day of the week and at the selected time | | +| | Monthly | | * 1. Option 1 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the.”Each” is selected. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is multiple select field. 4. Last day of month: This field is activied and required only when “Each” is slected on “Repeat on the” filed. This is checkbox field with default as uncheck. If this field is checked then in case the last day of month is less than the “Day of month” then request will be occurred on last day of month instead. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected day of the month and at the selected time. * 1. Option 2 ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n month where n from 1 to 12. This is select one filed. 2. Repeat on the: The drop-down list to select the repeat type. The list includes : Each /On the. “On the” is selected. 3. In : The drop-dow to select the specific day of the week. The list includes : First/ Second/ Third/ Fouth/ Last. This filed is actived and required only when “On the” is selected. This is select one field. 4. Day of the week: The drop-down list to select day of the week. The list includes: Monday … Sunday. This is multiple field. 5. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat on every n month on each selected period of day of the weeek and at the selected time. | | +| | Annually | | ![](data:image/png;base64...) This option includes following fields: * + 1. Repeat every: The drop-down list to select the frequency on every n year where n from 1 to 5. This is select one filed. 2. Month of year: Drop-down to select month of year. The list includes 12 months of year from 1 to 12. 3. Day of month: The drop-down list to select day of month the request will be occurred. The list includes 31 day from 1 to 31. 4. Time of day to excute request\* : The time to OMR batch job running to trigger this request. This field is time format field. Campaign will trigger and repeat every n year on the selected day and selected month. | Drop-down Select one | + +**Content marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | OMR criteria | View as Rule criteria view mode for this part | Display | +| | Variant A | View as Message Template view mode for message content part | Tab | +| | Variant B | View as Message Template view mode for message content part | Tab | +| | Variant N | View as Message Template view mode for message content part | Tab | +| | Result | =TBD== It is depened on the third-party partner and the goal. We can want to see the total result on each content variation or detail result for each target customer on each content variation. | ==tbd== | + +**Targeting marketing testing view mode** + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field** | **Description** | **Data type** | +| | Campaign ID | Campaign ID | X(20) | +| | Campaign Description | Description of Marketing Campaign ID | X(100) | +| | Message chanel\* | Push or Email or SMS | Display | +| | Effective Date From | The start date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Effective End date\* | The end date of the effective period of the A/Bn testing request | Date The date format must adhere to the configured format | +| | Variant A | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant B | View as Marketing request view mode for OMR criteria part. | Tab | +| | Variant N | View as Marketing request view mode for OMR criteria part. | Tab | +| | Result | One gird to view the customer list on each variation | | | | | | | --- | --- | --- | --- | --- | | **Variation** | **Total number of customers** | **Total Female customer** | **Total male customer** | **….** | | Variation A | 100 | 10 | 90 | | | Variation B | 150 | 100 | 50 | | | Variation n | 140 | 50 | 90 | | | ==tbd== **Which criteria should be summarized??** | + +* 1. **A/Bn batch job will trigger marketing request as following processing:** + 1. A/Bn testing job (ABn) just trigger effectived A/Bn testing requests based on effectived period of each request compare with processing date (batch date/ sysdate). From effectived request list the batch job find the valid job which have run schedule on the day batch job is running. + 2. For content testing, ABn creates A/Bn message content selected based on the variation content configured by user. These message to be sent to the same customers selected based on criteria configured by users. E.g to send 3 promotion messages to customers whose birthday is due in the next N days. The result testing should be provied by parter so that OLS can provide the report to user can decide which content messge is better. + 3. Regarding to target customer testing, A/Bn locates the target customer based on criteria configured by users. User can verify the result testing after batch job is completed. + 4. For A/Bn SMS content testing, we can track click-through rates if SMS includes links or calls to action. By including unique links for different messages or recipients, we can measure how many people clicked on those links to interact with each content. From this result we can have the temporary open rate to user can decide which one is better. + 5. For A/Bn Email content testing, open rate = (Number of opens / Number of delivered emails)/100. Number of opens is provided by third-party or we have to send email is in HTML format, as tracking pixels work with HTML emails. The number of opens willl be is the number of times the tracking pixel was downloaded when recipients opened the email. + 6. ==tbd== + +#### Post-condition + +#### Exception flow + +### BlackList + +#### Requirement Definition + +* + - 1. The business need to exclude specific customer or groups from marketing campaigns for strategic reasons, such as fraud customers. + 2. Ensuring marketing efforts are focused on the most relevant and engaged audience to improve efficiency and return on investment. + 3. A set of customer who will be blocked for reward/promotion notification from a business wil be pre-definiton in this module. + +#### Process flow + +#### Trigger + +* + - * 1. The customer who has fraud behaviors will need to be added into black list. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Black List” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be blocked from the marketing campaign by uploading a file into the system. + +Additionally, users are able to assign customers to the blacklist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this blacklist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the black list. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be blocked from the marketing campaign if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The blacklist is stored and accessible to another module. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + +### Whitelist + +#### Requirement Definition + +* + - 1. The business need to exclude a list of customers that are excluded from the standard frequency cap rules. + 2. The whitelist ensures your top customers continue receiving your marketing messages without limit. We can use the whitelist for testing and optimizing campaign purposes. We can aslo use the whitelist for user who have shown strong interest in your marketing campaigns. + +#### Process flow + +#### Trigger + +* + - * 1. A set of customers needs to be added to the whitelist to exlcuse them from the frequency cap rules. + +#### Pre-Condition + +* + - * 1. Users have to have access rights in “Whitelist” module to able to access this screen. + 2. Depending on the user's access rights, they can view, add, edit, or approve manually marketing request. + +#### Sktech + +Listing page + +![](data:image/png;base64...) + +Edit mode + +Step 1: Generral Information + +![](data:image/png;base64...) + +Step 2: Customer List + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +Detail Mode + +![](data:image/png;base64...) + +#### Business rules + +Users are able to upload a list of customers who will be excluded from the frequency cap rules by uploading a file into the system. + +Additionally, users are able to assign customers to the whitelist by selecting a list of cif number belong to OLS system. + +Users are able to review the customer list or download the customer list that they have already uploaded to the system. + +Screen description + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data type** | +| **Listing page** | | | | +| | ID / ID | Blacklist indentifier | Display | +| | Name List/ Tên danh sách | The name of the black list. | Display | +| | Description/Mô tả | More description for this whitelist. | Display | +| | Customer List/Danh sách khách hàng | A list of customer that inputted by user or uploaded by user. Use ellipsis (…) to indicate that the customer list is too long to display in full. Mouseover to see full list. | Display | +| | ![](data:image/png;base64...) | By clicking here to download the customer list. This should be orginal file if this file is uploaded by the user. A file containing a list of customers entered by the user will be generated by the system. This file should under the CSV format as upload sample file. | Button | +| **Edit mode** | | | | +| | **General Information** | | | +| | ID \*/ ID | Blacklist indentifier For refer only | X(10) | +| | Name List\*/ Tên danh sách | The name of the whitelist. For refere only | X(50) | +| | Description/Mô tả | More description for this blacklist. For refer only | X(200) | +| | **Customer List** | | | +| | Input Type\*/ Kiểu nhập dữ liệu | Users can choose one of following option : * + - Input from screen - Upload file | Radio | +| | Customer List/ Danh sách khách hàng | A drop-down to select the customer who will be excluded from the frequency cap rules if “input from screen” is selected in previous step. | Drop-down Multiple select To avoid performance issue, user should enter at least 4 digit of CIF number to select the customer | +| | Upload file/Tải file | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse fiel from their device. | Button | +| | Customer List | If file upload successful then the customer list will be display here | Display | + +Users review and approve the record in the same manner as on other screens + +#### Post-condition + +The whitelist is stored and accessible to another module. + +The whitelist is excludes from the frequency cap rules as default. If there is any cap rules should need to include the whitelist then the user should indicate those whitelist. + +#### Exception flow + +If the file type or size is not valid, the system displays an error message and prompts the customer to select a different file. + +The system should clearly display the upload processing status to the user. + diff --git a/docs/staging/structured/system/application_parameter.md b/docs/staging/structured/system/application_parameter.md new file mode 100644 index 0000000..fae1836 --- /dev/null +++ b/docs/staging/structured/system/application_parameter.md @@ -0,0 +1,73 @@ +## Application Parameter + +### Requirement Definition + +* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. + +### Process Flow + +### Wireframe + +* + 1. Access control + +![](data:image/png;base64...) + +* + 1. Display setting + +![](data:image/png;base64...) + +* + 1. Functionality + +![](data:image/png;base64...) + +### Trigger + +### Pre-condition + +* Users have to have access right on this screen in order to access this screen. +* Depending on the user’s access rights, they can view/add/edit/ + +### Business Rule + +* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: + +![](data:image/png;base64...) + +1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. +2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. +3. Application parameters list detail: + +| Label (EN/VN) | Parameter | Data Type | +| --- | --- | --- | +| **Access *Control*** | | | +| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | +| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | +| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | +| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | +| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | +| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | +| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | +| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | +| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | +| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | +| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | +| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | +| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | +| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | +| **Display Setting** | | | +| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | +| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | +| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | +| **Functionality** | | | +| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | +| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | + +### Post-Condition + +* The application now uses the new, standardized parameter format. +* All existing parameter settings have been successfully migrated to the new format. +* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. +* The application's parameter management is more maintainable, scalable with other systems. + +### Exception flow + diff --git a/docs/staging/structured/system/system.md b/docs/staging/structured/system/system.md new file mode 100644 index 0000000..c4d440c --- /dev/null +++ b/docs/staging/structured/system/system.md @@ -0,0 +1,72 @@ +## Application Parameter + +### Requirement Definition + +* The “**Application Parameters**” module provides a means to maintain a set of application control parameters that define the system behavior in relation to user authentication, and user interface. These include password policy parameters session time-outs and system display format. + +### Process Flow + +### Wireframe + +* + 1. Access control + +![](data:image/png;base64...) + +* + 1. Display setting + +![](data:image/png;base64...) + +* + 1. Functionality + +![](data:image/png;base64...) + +### Trigger + +### Pre-condition + +* Users have to have access right on this screen in order to access this screen. +* Depending on the user’s access rights, they can view/add/edit/ + +### Business Rule + +* + 1. When the Application Parameters option is selected (under the System Management module in the navigation panel), the screen is displayed with the "Access Control" tabs as the default, as illustrated in the following: + +![](data:image/png;base64...) + +1. There are 3 tabs under the **Application Parameters** modules: **Access Control, System Display, and Functionality**. +2. All parameters under each tab will be pre-defined by the system as default. When any tabs is selected then the parameters are displayed according and allow the user to modify them. +3. Application parameters list detail: + +| Label (EN/VN) | Parameter | Data Type | +| --- | --- | --- | +| **Access *Control*** | | | +| Same User Cannot Approve \*/ Người dùng không thể phê duyệt cùng bản ghi | Allow/Disallow the user to approve/reject the record that they themselves created. | Switch button Default OFF | +| Same User Cannot Modify Own Profile \*/ Người dung không thể thay đổi thông tin cá nhân | Allow/Disallow the user to change their profile in the system. | Switch Button Default OFF | +| User Session Inactivity Time-out (minutes)\* / Hết hạn phiên đăng nhập | The user session will be ended if there are no user actions for N minutes. The system will throw an alert message and require the user login again. | 9(2) Default N as 30 minutes | +| Maximum Failed Forgotten Password Attempts \*/ | User id is blocked from further log-ins and the user profile record is suspended (blocked) until it is reset if customer enters more than N invalid passwords consecutively. | 9(2) Default N as 5 tiems | +| Inactivate User Id after N days of no log-ins\*/Tài khoản bị dừng hoạt động sau N ngày không đăng nhập. | User status is automatically inactive until reset if the user has not logged in for more than the number of days specified. | 9(3) Default as 30 days | +| Remind User to Change password N Days Before password expires\*/ Nhắc người dùng đổi mật khẩu trước N ngày trước khi hết hạn. | When the user logs into the system, the system will show an alert message to notify the user has to change the password from N day away before the password expires. | 9(3) Defaut as 5 days | +| Password expiration [days] \*/ Số ngày hiệu lực của mật khẩu | The number of days after which a new password will be expired. This determines how long a password remains valid before the user must change it. After this period, the account is locked and the user is unable to log in until the administrator unlocks the account. | 9(3) Default as 180 days | +| Disallow re-use of the last N passwords \*/ Cho phép dùng lại mật khẩu trong N lần gần nhất | The system just allows the user to re-use the last N password only. These options help to ensure passwords are regularly updated and not recycled. User can not re-use any of their last 2 passwords. | 9(1) Default as 2 times | +| Maximum password length \*/ Độ tài tối đa của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be not greater than this length | 9(2) Default as 50 | +| Minimum password length\* /Độ dài tối thiểu của mật khẩu | When the user is setting a new password or when changing an existing password, the new password must be at least this length | 9(2) Default as 8 | +| Password must at least N numeric digit \*/ Mật khẩu phải có ít nhất N số | When the user sets a new password or when changing an existing password, the new password must be at least N numeric digits. | 9(2) Default as 1 digit | +| Password must have at least [N] upper case alphabet\*/ Mật khẩu có ít nhất N kí tự in hoa | When the user sets a new password or when changing an existing password, the new password must be at least N upper case alphabet. | 9(2) Default as 1 | +| Password must have at least [N] lower case alphabet \*/ Mật khẩu có ít nhất N chữ cái thường | When the user sets a new password or when changing an existing password, the new password must be at least N lowercase alphabet. | 9(2) Default as 1 | +| Password must have at least [N] special character\*/ Mật khẩu có ít nhất N kí tự đặc biệt | When the user sets a new password or when changing an existing password, the new password must be at least N special character. | 9(2) Default as 1 | +| **Display Setting** | | | +| Date format \* / Định dạng ngày | A drop-down to select the following date display format: * DD/MM/YYYY * DD-MM-YYYY * DDMMYYYY * MM/DD/YYYY * MM-DD-YYYY * YYYY/MM/DD * YYYY-MM-DD * DD,MM,YYYY This determines how dates are displayed throughout the system. This is the default display. | Dropdown Select one Default as DD/MM/YYYY | +| Time format\* /Định dạng giờ | A drop-down to select the following time display format: * HH:mm: ss * HHmmss * HH, mm, ss * HH;mm;ss * HH/mm/ss This determines how times are displayed throughout the system. This is the default display. | Drop-down Select one Default as HH:mm: ss | +| Amount display format \*/ Định dạng số | This parameter determines how amounts are displayed throughout the system: * American [999,999,99] * European [999.999,99] | X(20) | +| **Functionality** | | | +| Processing Date / Ngày xử lí | The date on which a particular transaction or event is processed or recorded in the OLS system for the online transaction instead of the system. This parameter must be used for testing only. In production the processing date should be empty then the system always uses the system to process or record the online transaction. | Date Default is empty | +| Allow Cross Function Update\* / Cho phép cập nhật chéo | This allows or disallows cross-updates between data created by users and data created. The following functions apply to this parameter: * Customer data * Account data * Card data | Switch button Default ON | + +### Post-Condition + +* The application now uses the new, standardized parameter format. +* All existing parameter settings have been successfully migrated to the new format. +* The application's functionality remains uninterrupted, and end-users can continue using the application without any noticeable changes. +* The application's parameter management is more maintainable, scalable with other systems. + +### Exception flow diff --git a/docs/staging/structured/targeting/targeting.md b/docs/staging/structured/targeting/targeting.md new file mode 100644 index 0000000..710251a --- /dev/null +++ b/docs/staging/structured/targeting/targeting.md @@ -0,0 +1,139 @@ +## OneTargeting + +### Segmentation Definiiton + +#### Requirement Definition + +* 1. Segmentation is one proessing to divide a customer base into smaller, that provides a way to narrow down the target audience based on the types of products or services the customers have previously purchased. + 2. This screen allows businesses to create more personalized and effective marketing strategies for each segment, rather than adopting a one-size-fits-all approach. + 3. In the system sides, segement is one combination of more than one criteria, that allows same criteria set may be re-used many times. The most importantly, it allows a more efficient way to setup the targeting customer. + +#### Process Flow + +#### Trigger + +* + 1. User access to the OneTargeting Module to create/update new segment. + +#### Pre-Condition + +1. Users have to have access rights in “Segmentation” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. +3. Assume that all criteria are defined as attribute and appear in right panel in message content part to user can drag/drop to setup. + +#### Sktech + +* + - 1. Create /Edit mode + +![](data:image/png;base64...) + +![](data:image/png;base64...) + +* + - 1. View mode + +#### Business Rule + +1. The same approach as Campaing Rule Crireria screen, OLS system will use Query Builder to build query for this screen. +2. Refer to [Rule Criteria](#_Business_rules_1) section to get more detail about the business rule of this screen. The criterion list are described in the #3. +3. Here are some way that business segment their targeting customer : + +| **Index** | **Segement Group** | **Criteria Group** | **Combination by following Criteia** | **Segment Example** | +| --- | --- | --- | --- | --- | +| | Demographic Segmentation | Customer Profile | Age | Life Cycle segment: Children: 0 -14 Youth: 15- 24 Adults: 24- 64 Seniors: 65 and above | +| Last Name | | +| First Name | | +| Income | **Income segment**: High-Income Customer Middle –Icome Customer Low-Income Customer | +| Gender | Male customer Female customer | +| Marital Status | Singel customer Married customer | +| DOB | **Generation segment:** Gen Z: Year DOB from 1997 – 2012 Gen Y: 1981 – 1996 Gen X: 1965 – 1980 Gen W (Baby Boomers): 1946- 1964 | +| Location: Country/State/City/Zip Code | **Geography segement:** International customer Urban customer Suburban customer Mountain Customer | +| Customer’s Tenure | **Customer’s Tunure** **Segment** (Use Customer Registration) : New customer: under 1 year Early- tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long - tenured customer: above 5 years | +| Account ‘s Tenure | **Account’s Tunure** **Segment** (use AOD) : New customer: under 1 year Early - tenured customer: 1- 2 years Mid-Tenured customer: 2- 5 years Long tenured customer: above 5 years | +| Account’s Status | | +| Next AOD | | +| Customer’s staus | Used in the many segment that | +| | Behavior Segmentation | Transaction | Last transaction /Integration | **Churned customer :** E.g Last transaction is more than 6 months ago and customer status is active | +| Transaction Frequency: Should be tracked in the specific period such as day/week/month / Quarter/Year/Custom period to determine for following criteria : * + 1. **Total number txn frequency on the specific period.** 2. **Avegare txn frequency** | **Customer Segment:** High-Value Customers: frequency range depend on each business rule Medium-Value Customers: frequency range depend on each business rule Low-Value Customers: frequency range depend on each business rule | +| Customer Recency: When was the last transaction/ integration. | +| Total spending value: How much customer spends (total nett transaction amount) | +| Transaction Date | **Peak –Time customer:** E.g Transaction date is on special day Transaction date on weekend (day of the week) Midnight transaction (Time of the transaction) **Consistent-Time Customers**: E.g Transaciton do on each the first day of the month **Flexible-Time Customers** E.g Transaciton is on specific day | +| Transaction Time | +| Merchant: Coporation/Chain/Store/MCC | Use with another crieteria or itself only to create specific segment | +| Merchant Group: Coporation/Chain/Store/MCC Group | +| Transaction Description | +| Transaction Category | +| Transaction Gross Amount | +| Transaction Nett Amount | +| | Flexible segment | Attribute | Attribute Criteria | | +| | Psychographic Segmentation | Item | Favorite Category | **Life Style segment** **Interest segment** **Opinion segment** | +| Favorite Item | +| To be added when implement onedisplay so that we can have the data source for collect the Psychographic Segmentation from survey to decision the marketing strategy | + +#### Post-Condition + +* + - * 1. Each segment are used to define the targeting customer on the marketing module. + +#### Exception Flow + +### Audience Upload + +#### Requirement Definition + +Provide a user –friendly interface to marketers to manage audience uploads. + +#### Process flow + +#### Trigger + +#### Pre-Condition + +1. Users have to have access rights in “Audience Upload” module to able to access this screen. +2. Depending on the user's access rights, they can view, add, edit, or manually approval. + +#### Sktech + +#### Business rules + +Users are able to upload a customer data for targeted marketing campaigns by uploading a file into the system. + +The system should allow users map data from their source files to the required platform fields by accepting the CSV, excel spreadsheets. + +The system validates the uploaded data to ensure all required fields are present and in the correct format + +Screen descrition + +| | | | | +| --- | --- | --- | --- | +| **Index** | **Field (EN/VN)** | **Description** | **Data Type** | +| **Listing page** | | | | +| | Audience Name /Tệp khán giả | Name of the audience | Dipslay | +| | Description /Mô tả | Audience description For use refer only | Display | +| | File size /Dung lượng tệp | The file size | Display as number format | +| | ![](data:image/png;base64...) | By clicking here to download the audience. This should be orginal file tha user already uploaded. | Button | +| **Create/Edit Mode** | | | | +| | File ID \*/ ID tệp | Audience identifier For system refer only | X(10) | +| | Audience Name \*/ Tệp khán giả | The name of the audience Should be uniquie value in the system. | X(50) | +| | Description /Mô tả | Audience description | X(200) | +| | Upload file \*/ Đăng tệp tin lên | This option allow users upload file from their divice. The file shoud follow system’s format. Just allow CSV, xls, xlsx extension and file size should less than or equal to 50 MB. User can drag/drop or choose browse file from their device. | Button | +| | | | | + +#### Post-condition + +#### Exception Condition + +### Customer Audience + +#### Requirement Definition + +#### Process flow + +#### Trigger + +#### Pre-Condition + +#### Wireframe + +#### Business rules + +#### Post-condition + +#### Exception flow diff --git a/docs/staging/validation_report.json b/docs/staging/validation_report.json new file mode 100644 index 0000000..c557c11 --- /dev/null +++ b/docs/staging/validation_report.json @@ -0,0 +1,293 @@ +{ + "summary": { + "total": 31, + "pass": 29, + "error": 0, + "warning": 2 + }, + "results": [ + { + "card_id": "campaign/account_type_group", + "file_path": "docs/knowledge-cards/campaign/account_type_group.md", + "total_lines": 70, + "body_lines": 44, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/campaign_rule", + "file_path": "docs/knowledge-cards/campaign/campaign_rule.md", + "total_lines": 94, + "body_lines": 61, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/cep_request", + "file_path": "docs/knowledge-cards/campaign/cep_request.md", + "total_lines": 77, + "body_lines": 49, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/counter_definition", + "file_path": "docs/knowledge-cards/campaign/counter_definition.md", + "total_lines": 63, + "body_lines": 38, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/item_redemption_rule", + "file_path": "docs/knowledge-cards/campaign/item_redemption_rule.md", + "total_lines": 72, + "body_lines": 44, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/pool_conversion_rate", + "file_path": "docs/knowledge-cards/campaign/pool_conversion_rate.md", + "total_lines": 63, + "body_lines": 38, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/pool_definition", + "file_path": "docs/knowledge-cards/campaign/pool_definition.md", + "total_lines": 75, + "body_lines": 45, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/rep_rule", + "file_path": "docs/knowledge-cards/campaign/rep_rule.md", + "total_lines": 76, + "body_lines": 48, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/reward_campaign", + "file_path": "docs/knowledge-cards/campaign/reward_campaign.md", + "total_lines": 79, + "body_lines": 49, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "campaign/transaction_codes", + "file_path": "docs/knowledge-cards/campaign/transaction_codes.md", + "total_lines": 66, + "body_lines": 41, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "catalogue/catalogue_category", + "file_path": "docs/knowledge-cards/catalogue/catalogue_category.md", + "total_lines": 82, + "body_lines": 50, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "catalogue/item_master", + "file_path": "docs/knowledge-cards/catalogue/item_master.md", + "total_lines": 92, + "body_lines": 61, + "card_tier": "entity", + "errors": [], + "warnings": [ + "Backlink: detail_ref 'catalogue/face_value_logic' — file not found at docs/knowledge-refs/catalogue/face_value_logic.md" + ] + }, + { + "card_id": "catalogue/item_price", + "file_path": "docs/knowledge-cards/catalogue/item_price.md", + "total_lines": 97, + "body_lines": 64, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "catalogue/voucher_code", + "file_path": "docs/knowledge-cards/catalogue/voucher_code.md", + "total_lines": 92, + "body_lines": 58, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/account", + "file_path": "docs/knowledge-cards/customer/account.md", + "total_lines": 75, + "body_lines": 49, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/attribute_counter", + "file_path": "docs/knowledge-cards/customer/attribute_counter.md", + "total_lines": 70, + "body_lines": 43, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/card", + "file_path": "docs/knowledge-cards/customer/card.md", + "total_lines": 65, + "body_lines": 42, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/customer_overview", + "file_path": "docs/knowledge-cards/customer/customer_overview.md", + "total_lines": 85, + "body_lines": 56, + "card_tier": "entity", + "errors": [], + "warnings": [ + "QC-10: related_card 'customer/operations' — no matching card file found." + ] + }, + { + "card_id": "customer/no_hit_transaction", + "file_path": "docs/knowledge-cards/customer/no_hit_transaction.md", + "total_lines": 75, + "body_lines": 46, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/operations_adjustment", + "file_path": "docs/knowledge-cards/customer/operations_adjustment.md", + "total_lines": 80, + "body_lines": 48, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/operations_transaction", + "file_path": "docs/knowledge-cards/customer/operations_transaction.md", + "total_lines": 74, + "body_lines": 47, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/pool_balance", + "file_path": "docs/knowledge-cards/customer/pool_balance.md", + "total_lines": 71, + "body_lines": 45, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/statement", + "file_path": "docs/knowledge-cards/customer/statement.md", + "total_lines": 68, + "body_lines": 41, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "customer/transaction_history", + "file_path": "docs/knowledge-cards/customer/transaction_history.md", + "total_lines": 84, + "body_lines": 53, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "marketing/ab_testing", + "file_path": "docs/knowledge-cards/marketing/ab_testing.md", + "total_lines": 79, + "body_lines": 49, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "marketing/audience_filter", + "file_path": "docs/knowledge-cards/marketing/audience_filter.md", + "total_lines": 76, + "body_lines": 45, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "marketing/frequency_capping", + "file_path": "docs/knowledge-cards/marketing/frequency_capping.md", + "total_lines": 77, + "body_lines": 46, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "marketing/marketing_campaign", + "file_path": "docs/knowledge-cards/marketing/marketing_campaign.md", + "total_lines": 85, + "body_lines": 52, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "marketing/marketing_message", + "file_path": "docs/knowledge-cards/marketing/marketing_message.md", + "total_lines": 75, + "body_lines": 50, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "system/application_parameter", + "file_path": "docs/knowledge-cards/system/application_parameter.md", + "total_lines": 69, + "body_lines": 44, + "card_tier": "entity", + "errors": [], + "warnings": [] + }, + { + "card_id": "targeting/segmentation", + "file_path": "docs/knowledge-cards/targeting/segmentation.md", + "total_lines": 57, + "body_lines": 33, + "card_tier": "entity", + "errors": [], + "warnings": [] + } + ] +} \ No newline at end of file