# Special Circumstances

## Special Comment Codes

### Overview

Special Comment Codes provide additional context about an account's status. Peach automatically applies some codes and allows manual override of others.

### Automatically Applied Codes

| Code | Description | When Applied |
|  --- | --- | --- |
| `AC` | Paying Under Partial Payment Agreement | Active payment plan with amount less than scheduled payment |
| `AI` | Recalled to Active Military Duty | Active military duty case exists |
| `AP` | Credit Line Suspended | Line of credit is frozen |
| `AU` | Account Paid in Full for Less Than Full Balance | Charged-off or paid-off loan with zero balance and at least one service credit of type `settlementOfDebt`, `settlementOfDebtNoLoss`, or `badDebt` |
| `AW` | Affected by Natural or Declared Disaster | Active FEMA case exists |
| `CI` | Account Closed Due to Inactivity | Line of credit closed for inactivity |


### Override Codes (Manually Applied)

These codes can be set via API:

| Code | Description |
|  --- | --- |
| `B` | Account Payments Managed by Financial Counseling Program |
| `CN` | Loan Modified Under Federal Government Plan |
| `CO` | Loan Modified |
| `M` | Account Closed at Grantor's Request |
| `O` | Account Transferred to Another Company/Servicer |


### Special Comment Determination Logic


```
FUNCTION determine_special_comment(loan, snapshot, reporting_status):
  
  # Priority 1: Manual override
  override = get_one_time_field_value(SpecialComment)
  IF override IS NOT NULL:
    RETURN override
  
  # Priority 2: Settlement/Bad Debt detection
  IF snapshot.loan_status IN ('ChargedOff', 'PaidOff') AND balance = 0:
    settlement_credits = find_service_credits(
      types=['settlementOfDebt', 'settlementOfDebtNoLoss', 'badDebt'],
      status='Succeeded'
    )
    IF count(settlement_credits) > 0:
      RETURN 'AU'  # Paid for Less Than Full Balance
  
  # Priority 3: Active payment plan (less than regular payment)
  IF snapshot.loan_status = 'Active':
    IF active_payment_plan_amount < scheduled_payment_amount:
      RETURN 'AC'  # Paying Under Partial Payment Agreement
  
  # Priority 4: Frozen line of credit
  IF is_open_ended AND snapshot.loan_status = 'Frozen':
    RETURN 'AP'  # Credit Line Suspended
  
  # Priority 5: Inactivity closure (LOC)
  IF is_open_ended AND loan.is_closed AND close_reason = 'inactivity':
    RETURN 'CI'  # Closed Due to Inactivity
  
  # Priority 6: FEMA disaster case
  IF active_fema_case_exists():
    RETURN 'AW'  # Affected by Disaster
  
  # Priority 7: Military duty
  IF active_military_duty_case_exists():
    RETURN 'AI'  # Active Military Duty
  
  RETURN ''  # No special comment
```

## Compliance Condition Codes

### Overview

Compliance Condition Codes indicate specific regulatory circumstances, primarily related to disputes.

### Code Reference

| Code | Description |
|  --- | --- |
| `XA` | Account Closed at Consumer's Request |
| `XB` | Account Information Disputed Under FCRA |
| `XC` | FCRA Dispute Investigation Completed - Consumer Disagrees |
| `XD` | Account Closed at Consumer's Request + Disputed Under FCRA |
| `XE` | Account Closed at Consumer's Request + Investigation Completed - Consumer Disagrees |
| `XF` | Account in Dispute Under FCBA |
| `XG` | FCBA Dispute Investigation Completed - Consumer Disagrees |
| `XH` | Account Previously in Dispute |
| `XJ` | Account Closed at Consumer's Request + Disputed Under FCBA |
| `XR` | Remove Previously Reported Code |


### Automatic Application

**XA (Account Closed at Consumer's Request):** Applied automatically when:

- Portfolio type is open-ended (C, R, O)
- Loan is closed
- Close reason is `requestedByBorrower`


### Manual Override

Compliance Condition Codes can be set via API:


```json
PUT /people/{personId}/loans/{loanId}/credit-reporting
{
  "metro2": {
    "complianceConditionCode": "XB"
  }
}
```

## Consumer Information Indicators

### Overview

Consumer Information Indicators report bankruptcy status. These are automatically determined based on bankruptcy case data.

> **Important:** Bankruptcy cases must be in `Processing` or `Completed` status to be reported in Metro2. Cases in `Initiated` or `Canceled` status are **NOT** reported. Lenders must manually change the case status to `Processing` after reviewing case details.


### Bankruptcy Status Codes

| Code | Description |
|  --- | --- |
| `A` | Petition for Chapter 7 Bankruptcy |
| `B` | Petition for Chapter 11 Bankruptcy |
| `C` | Petition for Chapter 12 Bankruptcy |
| `D` | Petition for Chapter 13 Bankruptcy |
| `E` | Discharged Through Chapter 7 Bankruptcy |
| `F` | Discharged Through Chapter 11 Bankruptcy |
| `G` | Discharged Through Chapter 12 Bankruptcy |
| `H` | Discharged Through Chapter 13 Bankruptcy |
| `Q` | Remove Previously Reported Bankruptcy |
| `Z` | Bankruptcy - Undesignated Chapter |
| `1A` | Personal Receivership |


> **Note:** Codes I-P (Dismissed/Withdrawn by chapter) are defined in Metro 2 but Peach uses code `Q` for all dismissed, withdrawn, or closed cases per CRRG guidance.


### Consumer Information Indicator Algorithm

**Step-by-step logic:**

1. **Fetch bankruptcy cases** where:
  - `case.type = 'bankruptcy'`
  - `case.status IN ('Processing', 'Completed')`
  - Date filter applies (see below)
2. **Apply date filter** — case must be active during reported month:

```
(reported_month >= case.courtCaseFiledDate::month/year 
 AND reported_month <= coalesce(case.courtCaseClosedDate::month/year,
                                 case.courtCaseDebtorDispositionDate::month/year))
OR
(reported_month >= case.courtCaseFiledDate::month/year 
 AND case.courtCaseClosedDate == empty 
 AND case.courtCaseDebtorDispositionDate == empty)
```
3. **Determine bkCaseInPetition flag:**
  - If `coalesce(courtCaseClosedDate, courtCaseDebtorDispositionDate)` is within reported month → `bkCaseInPetition = false`
  - Otherwise → `bkCaseInPetition = true`
4. **Return code based on bkCaseInPetition + chapter:**


| bkCaseInPetition | courtCaseChapter | Disposition | Loan Associated? | Code |
|  --- | --- | --- | --- | --- |
| `true` | chapter7 | — | — | **A** |
| `true` | chapter11 | — | — | **B** |
| `true` | chapter12 | — | — | **C** |
| `true` | chapter13 | — | — | **D** |
| `false` | chapter7 | discharged | Yes | **E** |
| `false` | chapter11 | discharged | Yes | **F** |
| `false` | chapter12 | discharged | Yes | **G** |
| `false` | chapter13 | discharged | Yes | **H** |
| `false` | any | discharged | No | **Q** |
| `false` | any | dismissed/closed | — | **Q** |


**Full Algorithm:**


```
FUNCTION determine_consumer_information_indicator(loan, reported_month):
  
  # Step 1: Fetch qualifying bankruptcy cases
  # Filter by: type, status, and date range
  case = find_case(
    type = 'bankruptcy',
    status IN ('Processing', 'Completed'),
    date_filter: (
      (reported_month >= case.courtCaseFiledDate::month/year 
       AND reported_month <= coalesce(case.courtCaseClosedDate::month/year,
                                       case.courtCaseDebtorDispositionDate::month/year))
      OR
      (reported_month >= case.courtCaseFiledDate::month/year 
       AND case.courtCaseClosedDate == empty 
       AND case.courtCaseDebtorDispositionDate == empty)
    )
  )
  
  # If multiple cases exist, select the most recent based on case.createdAt
  
  IF case IS NULL:
    RETURN ''  # Blank - no applicable bankruptcy
  
  # Step 2: Determine if case is still in petition (active)
  bkCaseInPetition = True
  
  final_date = coalesce(case.courtCaseClosedDate, case.courtCaseDebtorDispositionDate)
  IF final_date IS NOT NULL AND final_date IS WITHIN reported_month:
    bkCaseInPetition = False  # Case was finalized in the reported month
  
  # Step 3: Return petition codes if bkCaseInPetition = true
  IF bkCaseInPetition = True:
    IF case.courtCaseChapter = 'chapter7':  RETURN 'A'
    IF case.courtCaseChapter = 'chapter11': RETURN 'B'
    IF case.courtCaseChapter = 'chapter12': RETURN 'C'
    IF case.courtCaseChapter = 'chapter13': RETURN 'D'
  
  # Step 4: Handle discharged cases (bkCaseInPetition = false)
  IF bkCaseInPetition = False AND case.courtCaseDebtorDisposition = 'discharged':
    # CRITICAL: Discharge codes E/F/G/H only apply when loan IS associated with case
    IF loan_is_associated_with_case(loan, case):
      IF case.courtCaseChapter = 'chapter7':  RETURN 'E'
      IF case.courtCaseChapter = 'chapter11': RETURN 'F'
      IF case.courtCaseChapter = 'chapter12': RETURN 'G'
      IF case.courtCaseChapter = 'chapter13': RETURN 'H'
    ELSE:
      # Loan is NOT associated with the discharged case
      RETURN 'Q'  # Remove previously reported bankruptcy
  
  # Step 5: Handle dismissed/closed cases (bkCaseInPetition = false)
  IF bkCaseInPetition = False:
    IF case.courtCaseDebtorDisposition = 'dismissed' OR
       case.courtCaseLastStatus IN ('dismissed', 'closedFiledInError', 
                                     'closedTransferredOut', 'closedDischargeNA',
                                     'closedUndeterminedReason'):
      RETURN 'Q'  # Remove previously reported bankruptcy
  
  RETURN ''  # Blank
```

### Code Q Usage

Code Q (Remove Previously Reported Bankruptcy) is reported when:

- A bankruptcy case is dismissed, withdrawn, or closed without discharge
- A bankruptcy case is discharged but the **loan was not associated** with the case
- The closure/disposition occurred in the current reporting month
- This tells bureaus to remove the bankruptcy indicator from subsequent reports


## Military Protections (SCRA/MLA)

### Overview

The Servicemembers Civil Relief Act (SCRA) and Military Lending Act (MLA) provide protections for active-duty military members.

### Credit Reporting Impact

When a borrower has active military duty status:

| Impact | Description |
|  --- | --- |
| Special Comment | Code `AI` (Recalled to Active Military Duty) is applied |
| Account Status | May report as current (11) during protected period |
| Delinquency | Protected servicemembers may not be reported as delinquent |


### Military Case Requirements

For military protection to apply in credit reporting:

- A Military Duty case must exist in Peach
- Case status must be `Processing` or `Completed` with `Approved` outcome
- `duty_start_date` must be on or before the reporting date
- `duty_end_date` must be null or on/after the reporting date


## Bankruptcy Reporting

### Date of First Delinquency in Bankruptcy

For bankruptcy cases where the account is current:

- DOFD is set to the `court_case_filed_date`
- This applies when Consumer Information Indicator is a bankruptcy code
- Account Status is current (11)


## Consumer Disputes

### FCRA Disputes

When a consumer disputes information under FCRA:

| Stage | Compliance Condition Code |
|  --- | --- |
| Dispute received | `XB` |
| Investigation completed, consumer disagrees | `XC` |
| Dispute resolved | `XR` (remove) or clear |


### FCBA Disputes

For billing disputes under FCBA (credit cards, revolving accounts):

| Stage | Compliance Condition Code |
|  --- | --- |
| Dispute in process | `XF` |
| Investigation completed, consumer disagrees | `XG` |
| Dispute resolved | `XR` or clear |


### Combined Scenarios

When a consumer closes an account AND disputes:

- `XD`: Closed + FCRA dispute pending
- `XE`: Closed + FCRA investigation complete, disagrees
- `XJ`: Closed + FCBA dispute pending