# 1. Revenue Reports — Test Cases

User Type: **Super Administrator**
Source: *Mi Digital Academy - Education CRM Features Document*
Spec: revenue_reports.md — every feature, sub-feature, and rule covered

---

## Test Execution Policy
- Zero tolerance: any deviation from documented behavior = FAILED = bug
- Every bug is immediately logged/reported (Bug ID, feature, sub-feature,
  expected vs actual, severity) and fixed 100% before the group passes
- Feature group passes only at 100% test pass rate

## Coverage Matrix
| Feature | Sub-feature / Rule | Test IDs |
|---------|--------------------|----------|
| 1.1 Revenue by Course, Time Period, Region | Revenue: the revenue (the revenue, the course, the period, the region, the amount) | TC-SA-19-01-001 |
| 1.1 Revenue by Course, Time Period, Region | Course: the course (the course, the name, the revenue) | TC-SA-19-01-002 |
| 1.1 Revenue by Course, Time Period, Region | Time period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual) | TC-SA-19-01-003 |
| 1.1 Revenue by Course, Time Period, Region | Region: the region (the region of the revenue, e.g., the state, the country) | TC-SA-19-01-004 |
| 1.1 Revenue by Course, Time Period, Region | Revenue amount: the amount (the amount of the revenue, the currency) | TC-SA-19-01-005 |
| 1.1 Revenue by Course, Time Period, Region | Revenue comparison: the comparison (the comparison of the revenue, the courses, the periods, the regions) | TC-SA-19-01-006 |
| 1.1 Revenue by Course, Time Period, Region | Revenue export: the export (the revenue, the format, the period) | TC-SA-19-01-007 |
| 1.1 Revenue by Course, Time Period, Region | Audit logging of the revenue report generation | TC-SA-19-01-008 |
| 1.1 Revenue by Course, Time Period, Region | Rule: the revenue is the income (the revenue, the course, the period, the region, the amount); the revenue is the value | TC-SA-19-01-001 |
| 1.1 Revenue by Course, Time Period, Region | Rule: the course is the segment (the course, the name, the revenue); the course is the category | TC-SA-19-01-002 |
| 1.1 Revenue by Course, Time Period, Region | Rule: the time period is the scope (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control | TC-SA-19-01-003 |
| 1.1 Revenue by Course, Time Period, Region | Rule: the region is the location (the region of the revenue, e.g., the state, the country); the region is the geography | TC-SA-19-01-004 |
| 1.1 Revenue by Course, Time Period, Region | Rule: the revenue is visible (the revenue, the courses, the periods, the regions); the report is managed | TC-SA-19-01-006 |
| 1.1 Revenue by Course, Time Period, Region | Rule: revenue report generation is audit-logged with the revenue, period, and timestamp | TC-SA-19-01-008 |
| 1.2 Subscription vs. One-Time Revenue | Subscription revenue: the revenue (the subscription revenue, the amount, the period) | TC-SA-19-01-009 |
| 1.2 Subscription vs. One-Time Revenue | One-time revenue: the revenue (the one-time revenue, the amount, the period) | TC-SA-19-01-010 |
| 1.2 Subscription vs. One-Time Revenue | Revenue split: the split (the split of the revenue, the subscription, the one-time) | TC-SA-19-01-011 |
| 1.2 Subscription vs. One-Time Revenue | Revenue period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual) | TC-SA-19-01-012 |
| 1.2 Subscription vs. One-Time Revenue | Revenue trend: the trend (the trend of the revenue, the period, the change) | TC-SA-19-01-013 |
| 1.2 Subscription vs. One-Time Revenue | Revenue comparison: the comparison (the comparison of the revenue, the types, the periods) | TC-SA-19-01-014 |
| 1.2 Subscription vs. One-Time Revenue | Revenue export: the export (the revenue, the format, the period) | TC-SA-19-01-015 |
| 1.2 Subscription vs. One-Time Revenue | Audit logging of the revenue split reporting | TC-SA-19-01-016 |
| 1.2 Subscription vs. One-Time Revenue | Rule: the subscription revenue is the recurring (the subscription revenue, the amount, the period); the revenue is the type | TC-SA-19-01-009 |
| 1.2 Subscription vs. One-Time Revenue | Rule: the one-time revenue is the single (the one-time revenue, the amount, the period); the revenue is the type | TC-SA-19-01-010 |
| 1.2 Subscription vs. One-Time Revenue | Rule: the revenue split is the ratio (the split of the revenue, the subscription, the one-time); the split is the measure | TC-SA-19-01-011 |
| 1.2 Subscription vs. One-Time Revenue | Rule: the revenue period is the scope (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control | TC-SA-19-01-012 |
| 1.2 Subscription vs. One-Time Revenue | Rule: the revenue is visible (the subscription, the one-time, the amounts, the period); the report is managed | TC-SA-19-01-014 |
| 1.2 Subscription vs. One-Time Revenue | Rule: revenue split reporting is audit-logged with the revenue, period, and timestamp | TC-SA-19-01-016 |
| 1.3 Refund and Adjustment Reports | Refund: the refund (the refund, the user, the amount, the date) | TC-SA-19-01-017 |
| 1.3 Refund and Adjustment Reports | Adjustment: the adjustment (the adjustment, the user, the amount, the date) | TC-SA-19-01-018 |
| 1.3 Refund and Adjustment Reports | Refund count: the count (the count of the refunds) | TC-SA-19-01-019 |
| 1.3 Refund and Adjustment Reports | Adjustment count: the count (the count of the adjustments) | TC-SA-19-01-020 |
| 1.3 Refund and Adjustment Reports | Refund amount: the amount (the amount of the refunds, the currency) | TC-SA-19-01-021 |
| 1.3 Refund and Adjustment Reports | Refund period: the period (the period of the refunds, e.g., the monthly, the quarterly, the annual) | TC-SA-19-01-022 |
| 1.3 Refund and Adjustment Reports | Refund export: the export (the refunds, the format, the period) | TC-SA-19-01-023 |
| 1.3 Refund and Adjustment Reports | Audit logging of the refund and adjustment reporting | TC-SA-19-01-024 |
| 1.3 Refund and Adjustment Reports | Rule: the refund is the return (the refund, the user, the amount, the date); the refund is the reversal | TC-SA-19-01-017 |
| 1.3 Refund and Adjustment Reports | Rule: the adjustment is the correction (the adjustment, the user, the amount, the date); the adjustment is the fix | TC-SA-19-01-018 |
| 1.3 Refund and Adjustment Reports | Rule: the refund count is the measure (the count of the refunds); the count is the volume | TC-SA-19-01-019 |
| 1.3 Refund and Adjustment Reports | Rule: the refund amount is the value (the amount of the refunds, the currency); the amount is the measure | TC-SA-19-01-021 |
| 1.3 Refund and Adjustment Reports | Rule: the refunds and adjustments are visible (the refunds, the adjustments, the amounts, the period); the report is managed | TC-SA-19-01-022 |
| 1.3 Refund and Adjustment Reports | Rule: refund and adjustment reporting is audit-logged with the refund, period, and timestamp | TC-SA-19-01-024 |

## 1.1 Revenue by Course, Time Period, Region

### TC-SA-19-01-001 — Revenue: the revenue (the revenue, the course, the period, the region, the amount); the revenue is the value
**Type:** Positive
**Covers:** 1.1 → Revenue: the revenue (the revenue, the course, the period, the region, the amount); Rule: the revenue is the income (the revenue, the course, the period, the region, the amount); the revenue is the value
**Preconditions:** Super Admin is logged in; revenue data exists across courses, periods, and regions.
**Steps:**
1. Open Custom Reporting → Revenue Reports.
2. Generate the revenue by course, time period, and region: the revenue (the revenue, the course, the period, the region, the amount) — verify the revenue is the income.
3. Verify each revenue entry shows the course, the period, the region, and the amount.
4. Verify the revenue values match the actual recorded revenue.
**Expected Result:** The revenue is reported — the revenue, the course, the period, the region, and the amount are the value.
**Priority:** Critical

### TC-SA-19-01-002 — Course: the course (the course, the name, the revenue); the course is the category
**Type:** Positive
**Covers:** 1.1 → Course: the course (the course, the name, the revenue); Rule: the course is the segment (the course, the name, the revenue); the course is the category
**Preconditions:** Revenue data exists for multiple courses.
**Steps:**
1. Select the courses: the course (the course, the name, the revenue) — verify the course is the segment.
2. Verify revenue is segmented by course.
3. Verify each course's revenue total is accurate.
**Expected Result:** The course is shown — the course, the name, and the revenue are the category.
**Priority:** High

### TC-SA-19-01-003 — Time period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control
**Type:** Positive
**Covers:** 1.1 → Time period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual); Rule: the time period is the scope (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control
**Preconditions:** Revenue data exists across monthly, quarterly, and annual periods.
**Steps:**
1. Set the time period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual) — verify the period is the scope.
2. Switch between monthly, quarterly, and annual — verify the revenue updates for each period.
3. Verify each period covers the correct date range.
**Expected Result:** The time period is set — the period of the revenue (the monthly, the quarterly, the annual) is the control.
**Priority:** High

### TC-SA-19-01-004 — Region: the region (the region of the revenue, e.g., the state, the country); the region is the geography
**Type:** Edge
**Covers:** 1.1 → Region: the region (the region of the revenue, e.g., the state, the country); Rule: the region is the location (the region of the revenue, e.g., the state, the country); the region is the geography
**Preconditions:** Revenue data exists for multiple regions; a region with zero revenue also exists.
**Steps:**
1. Select the regions: the region (the region of the revenue, e.g., the state, the country) — verify the region is the location.
2. Verify revenue is segmented by region.
3. View a region with zero revenue — verify it shows 0 (no error, no omission).
**Expected Result:** The region is shown — the region of the revenue (the state, the country) is the geography; a zero-revenue region is handled.
**Priority:** High

### TC-SA-19-01-005 — Revenue amount: the amount (the amount of the revenue, the currency); the amount is the value
**Type:** Positive
**Covers:** 1.1 → Revenue amount: the amount (the amount of the revenue, the currency)
**Preconditions:** Revenue data exists in a currency.
**Steps:**
1. View the revenue amount: the amount (the amount of the revenue, the currency) — verify the amount is the value.
2. Verify each amount is shown with the correct currency.
3. Verify the amounts are accurate for the selected scope.
**Expected Result:** The revenue amount is shown — the amount of the revenue and the currency are the value.
**Priority:** High

### TC-SA-19-01-006 — Revenue comparison: the comparison (the comparison of the revenue, the courses, the periods, the regions); the report is managed
**Type:** Positive
**Covers:** 1.1 → Revenue comparison: the comparison (the comparison of the revenue, the courses, the periods, the regions); Rule: the revenue is visible (the revenue, the courses, the periods, the regions); the report is managed
**Preconditions:** Revenue data exists across multiple courses, periods, and regions.
**Steps:**
1. Compare the revenue: the comparison (the comparison of the revenue, the courses, the periods, the regions) — verify the revenue is visible.
2. Verify the comparison shows the revenue across the selected courses, periods, and regions.
3. Verify the comparison values are accurate.
**Expected Result:** The revenue comparison works — the comparison of the revenue across the courses, periods, and regions is visible.
**Priority:** High

### TC-SA-19-01-007 — Revenue export: the export (the revenue, the format, the period); the export is the record
**Type:** Positive
**Covers:** 1.1 → Revenue export: the export (the revenue, the format, the period)
**Preconditions:** Revenue data exists for a period.
**Steps:**
1. Export the revenue: the export (the revenue, the format, the period).
2. Verify the export is generated in the selected format.
3. Verify the exported data matches the revenue report.
**Expected Result:** The revenue is exported — the revenue in the selected format for the period is generated.
**Priority:** Medium

### TC-SA-19-01-008 — Revenue report generation is audit-logged with the revenue, period, and timestamp
**Type:** Positive
**Covers:** 1.1 → Audit logging of the revenue report generation; Rule: revenue report generation is audit-logged with the revenue, period, and timestamp
**Preconditions:** Super Admin has generated a revenue report.
**Steps:**
1. Open the audit trail and filter by "revenue report".
2. Verify entries show the revenue, the period, and the timestamp.
**Expected Result:** The revenue report generation is audit-logged with the revenue, period, and timestamp.
**Priority:** Critical

## 1.2 Subscription vs. One-Time Revenue

### TC-SA-19-01-009 — Subscription revenue: the revenue (the subscription revenue, the amount, the period); the revenue is the type
**Type:** Positive
**Covers:** 1.2 → Subscription revenue: the revenue (the subscription revenue, the amount, the period); Rule: the subscription revenue is the recurring (the subscription revenue, the amount, the period); the revenue is the type
**Preconditions:** Subscription revenue data exists.
**Steps:**
1. Report the subscription vs. one-time revenue: the subscription revenue (the subscription revenue, the amount, the period) — verify the revenue is the recurring.
2. Verify the subscription revenue amount matches the actual subscription revenue.
3. Verify the period is applied correctly.
**Expected Result:** The subscription revenue is shown — the subscription revenue, the amount, and the period are the type.
**Priority:** Critical

### TC-SA-19-01-010 — One-time revenue: the revenue (the one-time revenue, the amount, the period); the revenue is the type
**Type:** Positive
**Covers:** 1.2 → One-time revenue: the revenue (the one-time revenue, the amount, the period); Rule: the one-time revenue is the single (the one-time revenue, the amount, the period); the revenue is the type
**Preconditions:** One-time revenue data exists.
**Steps:**
1. View the one-time revenue: the revenue (the one-time revenue, the amount, the period) — verify the revenue is the single.
2. Verify the one-time revenue amount matches the actual one-time revenue.
3. Verify the period is applied correctly.
**Expected Result:** The one-time revenue is shown — the one-time revenue, the amount, and the period are the type.
**Priority:** Critical

### TC-SA-19-01-011 — Revenue split: the split (the split of the revenue, the subscription, the one-time); the split is the measure
**Type:** Edge
**Covers:** 1.2 → Revenue split: the split (the split of the revenue, the subscription, the one-time); Rule: the revenue split is the ratio (the split of the revenue, the subscription, the one-time); the split is the measure
**Preconditions:** Both subscription and one-time revenue exist; a period with only one-time revenue (zero subscription) also exists.
**Steps:**
1. View the revenue split: the split (the split of the revenue, the subscription, the one-time) — verify the split is the ratio.
2. Verify the split percentages sum to 100% for the period.
3. View a period with zero subscription revenue — verify the split shows 0% subscription / 100% one-time (no division error).
**Expected Result:** The revenue split is shown — the split of the revenue (the subscription, the one-time) is the measure; a zero-subscription period is handled.
**Priority:** High

### TC-SA-19-01-012 — Revenue period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control
**Type:** Positive
**Covers:** 1.2 → Revenue period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual); Rule: the revenue period is the scope (the period of the revenue, e.g., the monthly, the quarterly, the annual); the period is the control
**Preconditions:** Revenue data exists across monthly, quarterly, and annual periods.
**Steps:**
1. Set the revenue period: the period (the period of the revenue, e.g., the monthly, the quarterly, the annual) — verify the period is the scope.
2. Switch between monthly, quarterly, and annual — verify the revenue updates for each period.
3. Verify each period covers the correct date range.
**Expected Result:** The revenue period is set — the period of the revenue (the monthly, the quarterly, the annual) is the control.
**Priority:** High

### TC-SA-19-01-013 — Revenue trend: the trend (the trend of the revenue, the period, the change); the trend is the direction
**Type:** Positive
**Covers:** 1.2 → Revenue trend: the trend (the trend of the revenue, the period, the change)
**Preconditions:** Revenue data exists across multiple periods.
**Steps:**
1. View the revenue trend: the trend (the trend of the revenue, the period, the change) — verify the trend is the direction.
2. Verify the trend shows the revenue over time with the period and the change.
3. Verify the trend values are accurate.
**Expected Result:** The revenue trend is shown — the trend of the revenue, the period, and the change are the direction.
**Priority:** High

### TC-SA-19-01-014 — Revenue comparison: the comparison (the comparison of the revenue, the types, the periods); the report is managed
**Type:** Positive
**Covers:** 1.2 → Revenue comparison: the comparison (the comparison of the revenue, the types, the periods); Rule: the revenue is visible (the subscription, the one-time, the amounts, the period); the report is managed
**Preconditions:** Revenue data exists across multiple types and periods.
**Steps:**
1. Compare the revenue: the comparison (the comparison of the revenue, the types, the periods) — verify the revenue is visible.
2. Verify the comparison shows the subscription vs. one-time across the selected periods.
3. Verify the comparison values are accurate.
**Expected Result:** The revenue comparison works — the comparison of the revenue across the types and periods is visible.
**Priority:** High

### TC-SA-19-01-015 — Revenue export: the export (the revenue, the format, the period); the export is the record
**Type:** Positive
**Covers:** 1.2 → Revenue export: the export (the revenue, the format, the period)
**Preconditions:** Revenue data exists for a period.
**Steps:**
1. Export the revenue: the export (the revenue, the format, the period).
2. Verify the export is generated in the selected format.
3. Verify the exported data matches the revenue split report.
**Expected Result:** The revenue is exported — the revenue in the selected format for the period is generated.
**Priority:** Medium

### TC-SA-19-01-016 — Revenue split reporting is audit-logged with the revenue, period, and timestamp
**Type:** Positive
**Covers:** 1.2 → Audit logging of the revenue split reporting; Rule: revenue split reporting is audit-logged with the revenue, period, and timestamp
**Preconditions:** Super Admin has reported the subscription vs. one-time revenue.
**Steps:**
1. Open the audit trail and filter by "revenue split".
2. Verify entries show the revenue, the period, and the timestamp.
**Expected Result:** The revenue split reporting is audit-logged with the revenue, period, and timestamp.
**Priority:** Critical

## 1.3 Refund and Adjustment Reports

### TC-SA-19-01-017 — Refund: the refund (the refund, the user, the amount, the date); the refund is the reversal
**Type:** Positive
**Covers:** 1.3 → Refund: the refund (the refund, the user, the amount, the date); Rule: the refund is the return (the refund, the user, the amount, the date); the refund is the reversal
**Preconditions:** Refunds exist.
**Steps:**
1. Report the refunds and adjustments: the refunds (the refund, the user, the amount, the date) — verify the refund is the return.
2. Verify each refund shows the user, the amount, and the date.
3. Process a new refund — verify it appears in the report.
**Expected Result:** The refunds are shown — the refund, the user, the amount, and the date are the reversal.
**Priority:** Critical

### TC-SA-19-01-018 — Adjustment: the adjustment (the adjustment, the user, the amount, the date); the adjustment is the fix
**Type:** Positive
**Covers:** 1.3 → Adjustment: the adjustment (the adjustment, the user, the amount, the date); Rule: the adjustment is the correction (the adjustment, the user, the amount, the date); the adjustment is the fix
**Preconditions:** Adjustments exist.
**Steps:**
1. View the adjustments: the adjustment (the adjustment, the user, the amount, the date) — verify the adjustment is the correction.
2. Verify each adjustment shows the user, the amount, and the date.
3. Record a new adjustment — verify it appears in the report.
**Expected Result:** The adjustments are shown — the adjustment, the user, the amount, and the date are the fix.
**Priority:** Critical

### TC-SA-19-01-019 — Refund count: the count (the count of the refunds); the count is the volume
**Type:** Positive
**Covers:** 1.3 → Refund count: the count (the count of the refunds); Rule: the refund count is the measure (the count of the refunds); the count is the volume
**Preconditions:** Refunds exist.
**Steps:**
1. View the refund count: the count (the count of the refunds) — verify the count is the measure.
2. Verify the count matches the actual number of refunds.
3. Process a new refund — verify the count increments by 1.
**Expected Result:** The refund count is shown — the count of the refunds is the volume.
**Priority:** High

### TC-SA-19-01-020 — Adjustment count: the count (the count of the adjustments); the count is the volume
**Type:** Positive
**Covers:** 1.3 → Adjustment count: the count (the count of the adjustments)
**Preconditions:** Adjustments exist.
**Steps:**
1. View the adjustment count: the count (the count of the adjustments) — verify the count is the measure.
2. Verify the count matches the actual number of adjustments.
**Expected Result:** The adjustment count is shown — the count of the adjustments is the volume.
**Priority:** High

### TC-SA-19-01-021 — Refund amount: the amount (the amount of the refunds, the currency); the amount is the measure
**Type:** Positive
**Covers:** 1.3 → Refund amount: the amount (the amount of the refunds, the currency); Rule: the refund amount is the value (the amount of the refunds, the currency); the amount is the measure
**Preconditions:** Refunds exist in a currency.
**Steps:**
1. View the refund amount: the amount (the amount of the refunds, the currency) — verify the amount is the value.
2. Verify the total refund amount matches the sum of individual refunds.
3. Verify the currency is shown correctly.
**Expected Result:** The refund amount is shown — the amount of the refunds and the currency are the measure.
**Priority:** High

### TC-SA-19-01-022 — Refund period: the period (the period of the refunds, e.g., the monthly, the quarterly, the annual); the report is managed
**Type:** Positive
**Covers:** 1.3 → Refund period: the period (the period of the refunds, e.g., the monthly, the quarterly, the annual); Rule: the refunds and adjustments are visible (the refunds, the adjustments, the amounts, the period); the report is managed
**Preconditions:** Refunds exist across monthly, quarterly, and annual periods.
**Steps:**
1. Set the refund period: the period (the period of the refunds, e.g., the monthly, the quarterly, the annual) — verify the period is the scope.
2. Switch between monthly, quarterly, and annual — verify the refunds update for each period.
3. Verify the refunds and adjustments are visible for the period.
**Expected Result:** The refund period is set — the period of the refunds (the monthly, the quarterly, the annual) is the scope; the report is managed.
**Priority:** High

### TC-SA-19-01-023 — Refund export: the export (the refunds, the format, the period); the export is the record
**Type:** Positive
**Covers:** 1.3 → Refund export: the export (the refunds, the format, the period)
**Preconditions:** Refunds exist for a period.
**Steps:**
1. Export the refunds: the export (the refunds, the format, the period).
2. Verify the export is generated in the selected format.
3. Verify the exported data matches the refund report.
**Expected Result:** The refunds are exported — the refunds in the selected format for the period are generated.
**Priority:** Medium

### TC-SA-19-01-024 — Refund and adjustment reporting is audit-logged with the refund, period, and timestamp
**Type:** Positive
**Covers:** 1.3 → Audit logging of the refund and adjustment reporting; Rule: refund and adjustment reporting is audit-logged with the refund, period, and timestamp
**Preconditions:** Super Admin has reported the refunds and adjustments.
**Steps:**
1. Open the audit trail and filter by "refund and adjustment".
2. Verify entries show the refund, the period, and the timestamp.
**Expected Result:** The refund and adjustment reporting is audit-logged with the refund, period, and timestamp.
**Priority:** Critical
