# 🌍 International Credit Request (ReqPay) Implementation

## Overview

This document outlines the implementation of the International Credit Request (ReqPay) API as per NPCI UPI 2.0 specification. The implementation handles the complete international UPI transaction flow with enhanced merchant details, risk scoring, device fingerprinting, and FX conversion.

## 📌 Key Features Implemented

### 1. Enhanced XML Parsing (`UpiXmlSchema.parse_req_pay/1`)
- **Namespace Support**: Handles `xmlns:upi="http://npci.org/upi/schema/"`
- **Complete Field Extraction**: Parses all 50+ fields from the international ReqPay structure
- **Device Information**: Extracts mobile, IP, geocode, location, OS, app details
- **Merchant Details**: Parses MID, SID, TID, merchant type, onboarding info
- **FX Splits**: Handles baseAmount, baseCurr, FX rate, markup
- **Risk Scores**: Extracts SP and NPCI risk scores

### 2. Advanced Validation (`validate_international_req_pay_fields/1`)
- **Purpose Code**: Enforces `purpose="11"` for international merchant credits
- **Transaction Type**: Validates `CREDIT` or `REVERSAL` types
- **Expiry Rules**: Validates EXPIREAFTER between 1-64800 minutes
- **Risk Scores**: Validates scores are 0-100 range
- **Merchant ID**: Validates MID format (6-15 alphanumeric)
- **Currency**: Enforces INR for settlement currency

### 3. International Payment Processing (`UpiTransactionManager.process_international_payment_request/1`)
- **Risk Assessment**: Checks SP and NPCI risk scores against thresholds
- **FX Conversion**: Performs currency conversion with markup calculation
- **Merchant Validation**: Validates merchant details against registry
- **Device Fingerprinting**: Processes device info for fraud detection
- **Partner Integration**: Sends enhanced payload to partner systems
- **Settlement Details**: Handles approval numbers and settlement amounts

### 4. Enhanced Error Handling
- **Risk Threshold Exceeded**: Error code `16`
- **FX Conversion Failed**: Error code `14`
- **Merchant Not Found**: Error code `ZR`
- **Validation Errors**: Error code `93`
- **XML Format Errors**: Error code `ZH`

## 🏗️ XML Structure Support

### Request (ReqPay)
```xml
<upi:ReqPay xmlns:upi="http://npci.org/upi/schema/">
  <Head ver="2.0" prodType="UPI_INTL"/>
  <Meta>
    <Tag name="PAYREQSTART" value=""/>
    <Tag name="PAYREQEND" value=""/>
  </Meta>
  <Txn purpose="11" type="CREDIT">
    <RiskScores>
      <Score provider="sp" type="TXNRISK" value=""/>
      <Score provider="npci" type="TXNRISK" value=""/>
    </RiskScores>
    <Rules>
      <Rule name="EXPIREAFTER" value="1 minute to max 64800 minutes"/>
      <Rule name="MINAMOUNT" value=""/>
    </Rules>
    <QR qVer="2.0" qrMedium="04"/>
  </Txn>
  <Payer>
    <Device>
      <Tag name="MOBILE|GEOCODE|LOCATION|IP|TYPE|ID|OS|APP|CAPABILITY"/>
    </Device>
    <Ac addrType="ACCOUNT"/>
    <Amount curr="INR"/>
    <Institution QrPayLoad="" conCode="" netInstId=""/>
  </Payer>
  <Payees>
    <Payee>
      <Merchant>
        <Identifier subCode="" mid="" sid="" tid="" merchantType=""/>
        <Name brand="" legal="" franchise=""/>
        <Ownership type=""/>
        <Invoice date="" name="" num=""/>
      </Merchant>
      <Ac addrType="ACCOUNT"/>
      <Amount curr="INR">
        <Split name="baseAmount|baseCurr|FX|Mkup"/>
      </Amount>
    </Payee>
  </Payees>
</upi:ReqPay>
```

### Response (RespPay)
```xml
<upi:RespPay xmlns:upi="http://npci.org/upi/schema/">
  <Head ver="2.0" prodType="UPI_INTL"/>
  <Txn purpose="11" type="CREDIT">
    <RiskScores>
      <Score provider="sp|npci" type="TXNRISK"/>
    </RiskScores>
    <QR expireTs="" qVer="2.0" qrMedium="04"/>
  </Txn>
  <Resp result="SUCCESS|FAILURE" errCode="">
    <Ref type="PAYEE" orgAmount="" settAmount="" settCurrency="INR"
         approvalNum="" respCode="" regName="" IFSC="" acNum="" accType=""/>
  </Resp>
</upi:RespPay>
```

## 🔄 Processing Flow

1. **XML Reception**: Controller receives international ReqPay XML
2. **Detection**: `is_international_payment?/1` detects international indicators
3. **Parsing**: `extract_international_req_pay_data/1` parses all fields
4. **Validation**: `validate_international_payment_data/1` validates business rules
5. **Risk Assessment**: Check SP/NPCI risk scores against thresholds
6. **FX Conversion**: Convert base currency to INR using provided rates
7. **Partner Processing**: Send enhanced payload to partner system
8. **Response Generation**: Create RespPay with settlement details

## 🎯 International Payment Indicators

The system detects international payments by checking for:
- UPI namespace: `xmlns:upi="http://npci.org/upi/schema/"`
- Product type: `prodType="UPI_INTL"`
- Purpose code: `purpose="11"`
- Merchant structure: `<Merchant>` element
- Risk scores: `<RiskScores>` element
- Device info: `<Device>` element
- FX splits: `<Split name="...">`

**Detection Logic**: Considers international if ≥2 indicators present.

## 🛡️ Risk Management

### Risk Score Validation
- **SP Risk Score**: Service Provider risk assessment (0-100)
- **NPCI Risk Score**: NPCI network risk assessment (0-100)
- **Threshold**: Transactions with scores >80 are rejected
- **Error Code**: `16` (Risk threshold exceeded)

### Device Fingerprinting
Captures comprehensive device information:
- Mobile number, IP address, geocode
- Device type, ID, OS, app version
- Location data, capabilities
- Used for fraud detection and compliance

## 💱 FX Handling

### Currency Conversion
- **Base Amount**: Original foreign currency amount
- **Base Currency**: Foreign currency code (SGD, USD, etc.)
- **FX Rate**: Conversion rate to INR
- **Markup**: PSP markup percentage
- **Settlement**: Final INR amount = baseAmount × FX × (1 + markup/100)

### Validation
- Settlement currency must be `INR`
- FX rate must be positive number
- Markup percentage validated
- Conversion amounts logged for audit

## 🏪 Merchant Validation

### Required Fields
- **MID**: Merchant ID (6-15 alphanumeric)
- **Legal Name**: Registered business name
- **Brand Name**: Display name
- **Merchant Type**: SMALL, MEDIUM, LARGE
- **Onboarding Type**: DIRECT, AGGREGATOR
- **Account Details**: IFSC, account number, type

### Validation Rules
- MID format: `^[A-Za-z0-9]{6,15}$`
- Merchant must exist in registry
- Account details must be valid
- Onboarding status must be active

## 📊 Error Codes & Handling

| Code | Description | Scenario |
|------|-------------|----------|
| `00` | Success | Transaction completed |
| `01` | Pending | Timeout escalation started |
| `02` | Failed | General transaction failure |
| `10` | Debit Failed | Insufficient funds |
| `14` | External Error | Partner/FX system error |
| `16` | Risk Threshold | Risk score >80 |
| `93` | Validation Error | Business rule violation |
| `ZH` | Invalid XML | XML parsing failure |
| `ZR` | Merchant Not Found | Invalid merchant |

## 🔧 Configuration

### Timeouts
- **Default Expiry**: 30 minutes
- **Maximum Expiry**: 64800 minutes (45 days)
- **Minimum Expiry**: 1 minute

### Risk Thresholds
- **SP Risk**: Max 80
- **NPCI Risk**: Max 80
- **Combined**: Either score >80 triggers rejection

### FX Settings
- **Base Currencies**: SGD, USD, AED, EUR, GBP
- **Settlement Currency**: INR only
- **Markup Range**: 0-10% typically

## 🧪 Testing

Run the test script to validate implementation:
```bash
elixir test_international_reqpay.exs
```

Tests cover:
- XML parsing accuracy
- Validation logic
- Error handling
- Response generation
- Edge cases

## 📋 Compliance Notes

### NPCI Requirements
- ✅ UPI 2.0 namespace support
- ✅ International purpose code (11)
- ✅ Enhanced merchant onboarding data
- ✅ Risk scoring integration
- ✅ Device fingerprinting
- ✅ FX transparency with splits

### Audit Trail
All transactions logged with:
- Original and converted amounts
- FX rates and markup applied
- Risk scores and decisions
- Device fingerprint data
- Approval numbers for reconciliation

## 🚀 Deployment Checklist

- [ ] UpiXmlSchema functions deployed
- [ ] UpiTransactionManager updated
- [ ] Controller routing configured
- [ ] Partner API integration tested
- [ ] Risk threshold configuration verified
- [ ] FX rate feeds connected
- [ ] Error monitoring setup
- [ ] Audit logging enabled

---

**Implementation Status**: ✅ Complete
**Compliance**: ✅ NPCI UPI 2.0 International
**Testing**: ✅ Unit tests included
**Documentation**: ✅ Comprehensive
