---
title: RctXmlService
summary: API reference for RctXmlService.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-09-24
library: SAIF.Services
reference_type: package
---

# RctXmlService

Implements `IRctXmlService`, converting staged RCT policy/location data into schema-validated RCT XML import files and writing them out in batches to a target folder. It depends only on `IUnitOfWork` for reading staged policy, location, and county data; it embeds an XSD schema as a manifest resource for validation and uses reflection-based helpers to read field values by expression for XML field formatting.

## Purpose
- Loads staged RCT policies (with their locations) and the county reference list needed to build RCT XML.
- Builds an `RCTImport` XML document graph from staged policy/location data, including client info, address, contact details, and inspector assignment.
- Serializes an `RCTImport` to an XML string and validates it against the embedded RCT XSD schema, routing invalid documents to an errors subfolder.
- Splits large staging sets into multiple output files (batched by a configurable policy count) and writes each to the target FTP/output folder.

## Context
- Namespace: `SAIF.Services.Rct`
- Assembly/package: `SAIF.Services` (packaged inside the `SAIF.SAIFCode.Core` NuGet package)

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| RctXmlService(...) | `public RctXmlService(IUnitOfWork unitOfWork)` | Validates `unitOfWork` is non-null via `Enforce.ArgumentNotNull` and wires it in. |
| GetPolicyStagingData | `public IEnumerable<RctPolicyStagingData> GetPolicyStagingData { get; }` | Returns all staged policies ordered by policy number, each populated with its associated staged locations, mapped to contracts. |
| GetCounties | `public IEnumerable<County> GetCounties { get; }` | Returns the county reference list ordered by name, with a synthetic `"Out of state"` (code `C7`, state `WA`) entry appended. |
| GetXmlAndWriteXmlFilesOut | `public StringDictionary GetXmlAndWriteXmlFilesOut(string path, int outputNumberOfPolicies, out int filesWritten, out int policiesWritten)` | Splits all staged policies into batches of `outputNumberOfPolicies` (defaulting to 5000 when 0), builds and validates the RCT XML for each batch, writes valid batches to `path` and invalid ones to an `errors` subfolder, and reports how many files/policies were written; returns an empty result immediately if the target path is null or the embedded XSD resource cannot be found. |
| WriteXmlToFtpFolder | `public void WriteXmlToFtpFolder(string path, RCTImport xmlString)` | Serializes the given `RCTImport` and writes it to the specified file path, wrapping any I/O failure in an `Exception` with a descriptive message. |
| GetRctXmlMemoryString | `public string GetRctXmlMemoryString(RCTImport xmlRctImport)` | Serializes an `RCTImport` object graph to a UTF-8 XML string with an empty default namespace, using an in-memory stream. |
| FormatPolicyXml | `public RCTImport FormatPolicyXml(ReadOnlyCollection<RctPolicyStagingData> policyList, ReadOnlyCollection<County> countyList)` | Builds an `RCTImport` containing one `Client` per staged policy, populating name, address, phone/fax/email, inspector, extended fields, and location list from the policy's primary location and county reference data. |

## Behavioral notes
- Schema validation (`ValidateRctXml`) loads the embedded resource `SAIF.Services.Rct.EvolutionSAIF.xsd`; if that resource is missing, `GetXmlAndWriteXmlFilesOut` aborts entirely and reports an error rather than writing unvalidated files.
- Documents that fail XSD validation are still written out, but to an `errors\` subfolder instead of the normal output path, so invalid batches are never silently dropped.
- `GetXmlAndWriteXmlFilesOut` output file names are timestamped (`yyyyMMddHHmmss`) and sequentially numbered per batch, so repeated runs within the same folder do not overwrite prior output.
- The private static `ReturnValues` dictionary accumulates validation errors/warnings across calls via the shared `XmlValidationEventHandler`, meaning validation messages from one call can persist into a subsequent call on the same service instance unless cleared*.

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- Services/SAIF.Services/Rct/RctXmlService.cs
