File837Extractor¶
File837Extractor parses an inbound HIPAA 837 EDI file (version constant "1.7") into e-bill entities through a segment state machine, and is the entry point for operation OP-DOM-10: it validates the ISA date against the batch submission date, walks NM1/N3/N4, PRV, REF, PWK, and LIN segments per bill, applies pharmacy-detection and truncation rules, and persists the resulting Ebill/bill/service/document structures through the repository. The class holds its working state (_queryProvider, _profileService, current provider/address/patient/e-bill/service, and parsed NPIs) in private static fields across a single ProcessFile call, so it is not safe for concurrent use across overlapping calls*.
Purpose¶
- Drives the full 837-to-e-bill extraction for a batch, validating the ISA date against the batch submission date and failing the file when segment ordering or required data is missing or invalid (DOM-BR-100 through DOM-BR-108).
- Applies per-bill parsing rules: NM1/N3/N4 address ordering, PRV "BI" billing-provider defaults, recognized REF qualifiers, required PWK documents, LIN qualifier validation, pharmacy-bill detection, and service-code truncation.
- Exposes segment-container traversal helpers (
GetClaims,GetPatients,GetProviders) and drug/segment predicate helpers (AreAllServicesCompoundDrugs,SegmentExists,AllServicesArePharmacy) that the main parse loop and callers use to navigate the parsed 837 structure.
Context¶
- Namespace:
SAIF.Domain.Claims.Ebilling - Assembly/package:
SAIF.Domain(Domain/SAIF.Domain/SAIF.Domain.csproj, .NET Framework 4.6.2 class library)
Public members¶
| Member | Signature | Purpose |
|---|---|---|
| Version | public const string Version = "1.7" |
Identifies the 837-extraction logic version this class implements. |
| ProcessFile | public static bool ProcessFile(IEbillingQueryProvider ebillingQueryProvider, IUserProfileService userProfileService, IEdiFile file, Batch batch, ILogWriter controlLog) |
Parses the given 837 file against the batch, validating the ISA date (DOM-BR-100) and applying the per-segment rules (DOM-BR-101–DOM-BR-108) while persisting the resulting e-bill structures*, returning whether the file processed successfully. |
| AreAllServicesCompoundDrugs | public static bool AreAllServicesCompoundDrugs(IList<EbillService> billServices) |
Reports whether every service in the list is a compound drug, used to decide pharmacy-specific handling. |
| CreateEbillAddress | public static EbillAddress CreateEbillAddress(string nameType, N3Segment n3Segment, N4Segment n4Segment) |
Builds an EbillAddress from a parsed N3/N4 segment pair for the given address role (physical, payment, or facility). |
| SegmentExists | public static bool SegmentExists(IEnumerable<IEdiSegment> file, IEdiSegment currentSegment, string segmentType) |
Reports whether a segment of the given type exists in the file relative to the current parse position, used to validate expected segment ordering such as N4 following N3 (DOM-BR-103). |
| AllServicesArePharmacy | public static bool AllServicesArePharmacy(IEnumerable<IEdiSegment> file, IEdiSegment billSegment) |
Reports whether every LX service line under the bill has a LIN segment, which for transaction set 005010X222A1 marks the bill as pharmacy (DOM-BR-107). |
| ProcessNameSegment | public static void ProcessNameSegment(Nm1Segment nameSegment, EbillProvider provider, EbillService service, EbillPatient patient) |
Applies an NM1 name segment to the correct target (facility/provider, service, or patient) based on the segment's entity-identifier code*. |
| GetClaims | public static ISegmentGroupContainer GetClaims(ISegmentGroup patient) |
Returns the claim-level segment group nested under a patient segment group. |
| GetPatients | public static ISegmentGroupContainer GetPatients(ISegmentGroup provider) |
Returns the patient-level segment group nested under a provider segment group. |
| GetProviders | public static ISegmentGroupContainer GetProviders(ISegmentGroup transactionSet) |
Returns the provider-level segment group nested under a transaction-set segment group. |
Behavioral notes¶
- The class keeps its working state in private
staticfields that are overwritten and read across the wholeProcessFilecall, so two files must not be processed concurrently on the same process*. - PRV "BI" provider segments default
TaxIdto999999999and truncate taxonomy to 10 characters when the source data does not supply them (DOM-BR-104). - One code path inside
ProcessFilethrowsNotImplementedExceptionfor a case the parser does not yet handle*. - Persisting the parsed e-bill, bill, service, and document structures through the repository is inferred from the presence of repository calls in
ProcessFile; the exact insert sequence was not traced line by line*.
Note: Statements marked with
*were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts.
Sources¶
Domain/SAIF.Domain/Claims/Ebilling/File837Extractor.cs