# core-midtrans-cifo - Epic Breakdown

**Date:** 2025-11-25
**Project Level:** Quick-Flow (2 Stories)

---

## Epic 1: Payment Flow UX Improvements

**Slug:** payment-ux-improvements

### Goal

Improve payment flow user experience for non-tech-savvy users (ibu-ibu awam) by eliminating duplicate VA generation errors, providing clear loading feedback, implementing user-friendly error messages, and guiding users after successful payment completion.

**Business Value:**
- Reduce abandoned transactions by 20%+
- Decrease support tickets by 30%+
- Increase payment completion rate by 10%+
- Improve user trust and satisfaction

**User Value:**
- Clear feedback during payment processing
- No more confusing technical error messages
- Obvious next steps after payment success
- Smooth, anxiety-free payment experience

### Scope

**In Scope:**

✅ **Prevent Duplicate VA Generation**
- Button disable logic during VA generation
- Request debouncing (500ms)
- Loading overlay with clear messaging
- User-friendly error messages in Bahasa Indonesia

✅ **Improve Error Handling**
- Map HTTP 409 → "Kode pembayaran Anda sudah dibuat! Klik di sini untuk melihat"
- Map HTTP 404 → "Terjadi kesalahan. Silakan coba lagi"
- Recovery buttons ("Coba Lagi", "Lihat Kode Pembayaran", "Kembali")

✅ **Post-Payment UX**
- 5-second countdown timer on success page
- Auto-redirect to dashboard after countdown
- Manual "Kembali Sekarang" button for impatient users

✅ **Mobile-First Design**
- All components optimized for mobile devices
- Responsive design with TailwindCSS
- Touch-friendly buttons (minimum 44x44px)

**Out of Scope:**

❌ **Phase 2 Solutions** (future epics):
- Navigation guards (useEffect cleanup)
- Modal-based success page
- Progressive loading states
- Transaction state machine
- Idempotency key implementation

❌ **Backend Changes:**
- Midtrans API modifications
- Database schema changes
- Backend validation logic

❌ **Complete Redesign:**
- Single-page payment flow
- Optimistic UI patterns
- Guided tour/onboarding

### Success Criteria

**User Experience Success:**
1. ✅ Users cannot generate VA multiple times (button disabled during processing)
2. ✅ Users see clear loading feedback ("Sedang membuat kode pembayaran...")
3. ✅ Error messages are in Bahasa Indonesia and user-friendly
4. ✅ Users have clear recovery options on errors
5. ✅ Users know exactly what to do after payment success (countdown + CTA)

**Technical Success:**
1. ✅ Zero HTTP 409 errors from duplicate VA generation
2. ✅ All error messages mapped to user-friendly Indonesian text
3. ✅ Loading overlay prevents interaction during processing
4. ✅ Auto-redirect works correctly after 5-second countdown
5. ✅ All components work on mobile devices (Chrome, Safari)

**Business Success:**
1. ✅ Reduced abandoned transaction rate (measure before/after)
2. ✅ Reduced support tickets related to payment confusion
3. ✅ Increased payment completion rate
4. ✅ Positive user feedback on payment experience

**Acceptance Criteria Coverage:**
- 10 detailed acceptance criteria defined in tech-spec
- All criteria testable and measurable
- Coverage across both user stories

### Dependencies

**External Dependencies:**
- ✅ Midtrans API (existing integration, no changes required)
- ✅ React 19.1.1 (already installed)
- ✅ Framer Motion 12.23.24 (already installed)
- ✅ TailwindCSS 4.1.17 (already installed)

**Internal Dependencies:**
- ✅ Existing payment feature module (`src/features/payment/`)
- ✅ Existing Midtrans service layer (`src/services/`)
- ✅ Existing TailwindCSS design system

**No New Dependencies Required** - All solutions use existing tech stack

**Prerequisites:**
- None - This is Phase 1, no prior work required
- Brownfield codebase analysis completed (problem-solution doc)
- Tech-spec completed and approved

---

## Story Map - Epic 1

```
Epic 1: Payment Flow UX Improvements (7 points)
│
├── Story 1.1: Prevent Duplicate VA/QR/Code Generation & Improve Feedback (5 points)
│   │
│   ├── Create utility functions (debounce, errorMessages)
│   ├── Create LoadingOverlay component
│   ├── Modify payment method component
│   │   ├── Add button disable logic
    │   ├── Add auto-redirect logic
    │   └── Add manual redirect button
    └── Write tests and verify
    
    Dependencies: None (independent of Story 1.1)
    Deliverable: Users have clear guidance after payment success,
                 auto-redirect prevents back button confusion
```

**Implementation Sequence:**
1. **Story 1.1** - Can be implemented first (no dependencies)
2. **Story 1.2** - Can be implemented in parallel or after Story 1.1

**Note:** Stories are independent and can be implemented in any order or in parallel.

---

## Stories - Epic 1

### Story 1.1: Prevent Duplicate VA Generation & Improve Feedback

As a **non-tech-savvy user (ibu-ibu)**,
I want **clear feedback during VA generation and user-friendly error messages**,
So that **I don't accidentally create duplicate payment codes and I understand what to do when errors occur**.

**Acceptance Criteria:**

**AC #1: Button Disable During Processing**
- **Given** user clicks "Generate VA" button
- **When** API request is in progress
- **Then** button is disabled and shows loading spinner
- **And** user cannot click button again
- **And** loading overlay appears with message "Sedang membuat kode pembayaran..."

**AC #2: Debounce Prevents Rapid Clicks**
- **Given** user clicks "Generate VA" button multiple times within 500ms
- **When** debounce is active
- **Then** only one API request is sent
- **And** subsequent clicks within 500ms are ignored

**AC #3: User-Friendly Error Messages**
- **Given** VA generation fails with HTTP 409
- **When** error is displayed to user
- **Then** message shows "Kode pembayaran Anda sudah dibuat! Klik di sini untuk melihat"
- **And** "Lihat Kode Pembayaran" button is displayed
- **And** clicking button navigates to existing VA view

**AC #4: Error Recovery Options**
- **Given** VA generation fails with any error
- **When** error is displayed to user
- **Then** "Coba Lagi" button is displayed
- **And** clicking button retries VA generation
- **And** "Kembali" button is displayed
- **And** clicking button returns to payment method selection

**AC #5: Loading Overlay Prevents Interaction**
- **Given** VA generation is in progress
- **When** loading overlay is displayed
- **Then** user cannot interact with page content
- **And** overlay shows clear message in Bahasa Indonesia
- **And** overlay is responsive on mobile devices

**Prerequisites:** None

**Technical Notes:**
- Use existing React hooks (useState, useEffect)
- Leverage Framer Motion for overlay animations
- Follow existing TailwindCSS design patterns
- No new dependencies required

**Estimated Effort:** 5 points (~2-3 days) - Covers all 3 payment methods (Bank Transfer, GoPay/QRIS, Convenience Store)

---

### Story 1.2: Improve Post-Payment UX

As a **non-tech-savvy user (ibu-ibu)**,
I want **clear guidance on what to do after successful payment**,
So that **I don't get confused and press the back button which causes errors**.

**Acceptance Criteria:**

**AC #6: Countdown Timer Display**
- **Given** user completes payment successfully
- **When** payment success page loads
- **Then** countdown timer shows "Anda akan diarahkan ke dashboard dalam 5 detik..."
- **And** countdown decrements every second (5, 4, 3, 2, 1)
- **And** timer is visible and readable on mobile devices

**AC #7: Auto-Redirect After Countdown**
- **Given** countdown timer reaches 0
- **When** timer completes
- **Then** user is automatically redirected to dashboard/home page
- **And** redirect happens smoothly without errors

**AC #8: Manual Redirect Button**
- **Given** countdown timer is active
- **When** user clicks "Kembali Sekarang" button
- **Then** user is immediately redirected to dashboard/home page
- **And** countdown is cancelled

**AC #9: Mobile-First Responsive Design**
- **Given** user accesses payment flow on mobile device
- **When** countdown and button are displayed
- **Then** all elements are properly sized and positioned for mobile
- **And** all text is readable without zooming
- **And** button is easily tappable (minimum 44x44px)

**AC #10: Bahasa Indonesia Throughout**
- **Given** user views success page
- **When** text is displayed
- **Then** all text is in Bahasa Indonesia
- **And** language is appropriate for non-tech-savvy users
- **And** no technical jargon is used

**Prerequisites:** None

**Technical Notes:**
- Use useEffect with setTimeout for countdown
- Use useNavigate from react-router-dom for redirect
- Follow existing TailwindCSS responsive patterns
- Ensure proper cleanup on component unmount

**Estimated Effort:** 2 points (~1 day)

---

## Implementation Timeline - Epic 1

**Total Story Points:** 7 points

**Estimated Timeline:** 3-4 days (assuming 1.5-2 points per day)

**Recommended Sequence:**
1. Story 1.1 (3 points) - Implement first or in parallel
2. Story 1.2 (2 points) - Implement second or in parallel

**Notes:**
- Stories are independent and can be worked on in parallel by different developers
- Both stories should be completed before deployment to production
- Comprehensive testing required after both stories complete
- Deployment can happen after both stories pass QA

---

**Epic Status:** Draft - Ready for Implementation

**Next Steps:**
1. Review and approve epic and stories
2. Assign stories to developers
3. Begin implementation following tech-spec guidance
4. Track progress in sprint board
5. Deploy to production after QA approval
