Metro2

This library follows the METRO 2 ® data reporting format, which is a data reporting format for consumer credit account data furnishers.

It contains structs for

A port from the Ruby implementation

Installation

def deps do
  [{:metro_2, "~> 0.2.0"}]
end

Demo

Try the interactive demo to see the library in action with realistic credit reporting data:

mix run demo.exs

The demo showcases:

Output: Creates demo_output.metro2 with 200+ lines of properly formatted METRO 2® data.

For detailed demo documentation, see README_DEMO.md.

Usage

Every segment struct contains field structs, which contain information about the individual field length, type and allowed characters, which are important for the serialization process.

To access a field value in a segment struct:

# Create a new base segment with proper field initialization
base_segment = Metro2.Records.BaseSegment.new()

# Set field values
base_segment = Metro2.Fields.put(base_segment, :first_name, "John-Smith")  # Dashes allowed in names
base_segment = Metro2.Fields.put(base_segment, :address_1, "123 Main St./Apt 2")  # Dots/slashes allowed in addresses

# Get field values
first_name = Metro2.Fields.get(base_segment, :first_name)

METRO 2® File Structure

The Metro2 File Structure is the root structure and it has the following initial structure:

defstruct [
    header: %HeaderSegment{},
    base_segments: [],
    tailer: %TailerSegment{}
  ]

Create and serialize a Metro2 file:

# Create a new file with properly initialized segments
my_file = Metro2.File.new()

# Update header segment
my_file = %{my_file | header: Metro2.Fields.put(my_file.header, :reporter_name, "My Credit Union")}

# Add base segments
base_segment = Metro2.Records.BaseSegment.new()
|> Metro2.Fields.put(:surname, "Smith-Johnson")
|> Metro2.Fields.put(:first_name, "John")

my_file = Metro2.File.add_base_segment(my_file, base_segment)

# Serialize to METRO 2® format
metro2_content = Metro2.File.serialize(my_file)

Header Segment

The header segment contains information about the data furnisher. You should simply transform the header segment structure in the file structure.

Base Segment

The base segment is stored in a list in the Metro2.File structure. Each base segment represents one reportable loan.

# Create a base segment with proper character validation
base_segment = Metro2.Records.BaseSegment.new()
|> Metro2.Fields.put(:surname, "Smith-Johnson")        # Dashes allowed in names
|> Metro2.Fields.put(:first_name, "John")
|> Metro2.Fields.put(:address_1, "123 Main St./Apt 2") # Dots/slashes allowed in addresses  
|> Metro2.Fields.put(:account_status, "11")            # Current account
|> Metro2.Fields.put(:current_balance, 1500)

# Add to file
file = Metro2.File.new()
|> Metro2.File.add_base_segment(base_segment)

Tailer Segment

The tailer segment contains counters for metrics like the SSN and the account statuses. It will be completely auto-generated based on the base segments.

Character Validation

The library enforces METRO 2® character validation rules:

Limitations

The Metro2 Standard contains, besides the base segment (which is the most common one), a couple of special segments which are not supported yet.