{"version":3,"sources":["../src/fhir-pas.ts"],"names":[],"mappings":"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","file":"fhir-pas.mjs","sourcesContent":["import type {\n  AuthorizationRequest,\n  Determination,\n  DocumentationRequirement\n} from \"./domain.js\";\n\nexport interface FhirResource {\n  readonly resourceType: string;\n  readonly id?: string;\n  [key: string]: unknown;\n}\n\nexport interface FhirBundle extends FhirResource {\n  readonly resourceType: \"Bundle\";\n  readonly type: \"collection\";\n  readonly entry: ReadonlyArray<{\n    readonly fullUrl: string;\n    readonly resource: FhirResource;\n  }>;\n}\n\nconst claimTypeProfessional = {\n  coding: [\n    {\n      system: \"http://terminology.hl7.org/CodeSystem/claim-type\",\n      code: \"professional\"\n    }\n  ]\n};\n\nconst identifier = (system: string, value: string) => ({\n  system,\n  value\n});\n\nconst patientId = (request: AuthorizationRequest) =>\n  `patient-${request.patient.memberId.toLowerCase()}`;\n\nconst providerId = (request: AuthorizationRequest) =>\n  `provider-${request.provider.npi}`;\n\nconst coverageId = (request: AuthorizationRequest) =>\n  `coverage-${request.patient.memberId.toLowerCase()}`;\n\nexport const toPasClaimBundle = (\n  request: AuthorizationRequest,\n  authId: string\n): FhirBundle => {\n  const patient: FhirResource = {\n    resourceType: \"Patient\",\n    id: patientId(request),\n    identifier: [\n      identifier(\"urn:backwork:member-id\", request.patient.memberId)\n    ],\n    birthDate: request.patient.dob\n  };\n\n  const provider: FhirResource = {\n    resourceType: \"Organization\",\n    id: providerId(request),\n    identifier: [\n      identifier(\"http://hl7.org/fhir/sid/us-npi\", request.provider.npi),\n      identifier(\"urn:irs:tin\", request.provider.tin)\n    ]\n  };\n\n  const coverage: FhirResource = {\n    resourceType: \"Coverage\",\n    id: coverageId(request),\n    status: \"active\",\n    beneficiary: {\n      reference: `Patient/${patient.id}`\n    },\n    payor: [\n      {\n        display: \"Backwork Reference Payer\"\n      }\n    ]\n  };\n\n  const diagnosis = request.service.diagnosis.map((code, index) => ({\n    sequence: index + 1,\n    diagnosisCodeableConcept: {\n      coding: [\n        {\n          system: \"http://hl7.org/fhir/sid/icd-10-cm\",\n          code\n        }\n      ]\n    }\n  }));\n  const diagnosisSequence = request.service.diagnosis.map(\n    (_, index) => index + 1\n  );\n  const supportingInfo = request.supportingInfo.map((info, index) => ({\n    sequence: index + 1,\n    category: {\n      coding: [\n        {\n          system: \"https://backwork.example/fhir/CodeSystem/x278-supporting-info\",\n          code: info.id\n        }\n      ]\n    },\n    valueString: info.value\n  }));\n\n  const claim: FhirResource = {\n    resourceType: \"Claim\",\n    id: authId,\n    status: \"active\",\n    use: \"preauthorization\",\n    type: claimTypeProfessional,\n    patient: {\n      reference: `Patient/${patient.id}`\n    },\n    provider: {\n      reference: `Organization/${provider.id}`\n    },\n    insurance: [\n      {\n        sequence: 1,\n        focal: true,\n        coverage: {\n          reference: `Coverage/${coverage.id}`\n        }\n      }\n    ],\n    created: new Date().toISOString(),\n    priority: {\n      coding: [\n        {\n          system: \"http://terminology.hl7.org/CodeSystem/processpriority\",\n          code: request.service.urgency === \"expedited\" ? \"stat\" : \"normal\"\n        }\n      ]\n    },\n    ...(diagnosis.length > 0 ? { diagnosis } : {}),\n    item: [\n      {\n        sequence: 1,\n        productOrService: {\n          coding: [\n            {\n              system:\n                request.service.codeSystem === \"CPT\"\n                  ? \"http://www.ama-assn.org/go/cpt\"\n                  : request.service.codeSystem,\n              code: request.service.code\n            }\n          ]\n        },\n        ...(diagnosisSequence.length > 0 ? { diagnosisSequence } : {}),\n        quantity: {\n          value: request.service.units\n        },\n        servicedDate: request.service.requestedStart,\n        locationCodeableConcept: {\n          coding: [\n            {\n              system:\n                \"https://www.cms.gov/Medicare/Coding/place-of-service-codes\",\n              code: request.service.placeOfService\n            }\n          ]\n        }\n      }\n    ],\n    ...(supportingInfo.length > 0 ? { supportingInfo } : {})\n  };\n\n  return {\n    resourceType: \"Bundle\",\n    id: `pas-${authId}`,\n    type: \"collection\",\n    entry: [\n      {\n        fullUrl: `urn:uuid:${patient.id}`,\n        resource: patient\n      },\n      {\n        fullUrl: `urn:uuid:${provider.id}`,\n        resource: provider\n      },\n      {\n        fullUrl: `urn:uuid:${coverage.id}`,\n        resource: coverage\n      },\n      {\n        fullUrl: `urn:uuid:claim-${authId}`,\n        resource: claim\n      }\n    ]\n  };\n};\n\nexport const toDtrQuestionnaires = (\n  requirements: ReadonlyArray<DocumentationRequirement>\n): ReadonlyArray<FhirResource> =>\n  requirements.map((requirement) => ({\n    resourceType: \"Questionnaire\",\n    id: requirement.id,\n    url: requirement.questionnaire,\n    status: \"active\",\n    title: requirement.description,\n    item: [\n      {\n        linkId: requirement.id,\n        text: requirement.description,\n        type: \"text\",\n        required: true\n      }\n    ]\n  }));\n\nconst outcomeFor = (determination: Determination): \"complete\" | \"partial\" | \"queued\" | \"error\" => {\n  switch (determination.status) {\n    case \"approved\":\n    case \"denied\":\n      return \"complete\";\n    case \"info-needed\":\n      return \"partial\";\n    case \"pended\":\n      return \"queued\";\n    case \"error\":\n      return \"error\";\n  }\n};\n\nconst dispositionFor = (determination: Determination): string => {\n  switch (determination.status) {\n    case \"approved\":\n      return \"Approved\";\n    case \"denied\":\n      return `${determination.reasonCode}: ${determination.reasonText}`;\n    case \"info-needed\":\n      return `Additional information required: ${determination.documentationRequired\n        .map((requirement) => requirement.id)\n        .join(\", \")}`;\n    case \"pended\":\n      return `Pending payer action: ${determination.pendingReason}`;\n    case \"error\":\n      return `${determination.reasonCode}: ${determination.reasonText}`;\n  }\n};\n\nexport const toPasClaimResponse = (\n  request: AuthorizationRequest,\n  determination: Determination\n): FhirResource => {\n  const response: FhirResource = {\n    resourceType: \"ClaimResponse\",\n    id: determination.authId,\n    status: \"active\",\n    use: \"preauthorization\",\n    type: claimTypeProfessional,\n    patient: {\n      reference: `Patient/${patientId(request)}`\n    },\n    created: new Date().toISOString(),\n    insurer: {\n      display: \"Backwork Reference Payer\"\n    },\n    request: {\n      reference: `Claim/${determination.authId}`\n    },\n    outcome: outcomeFor(determination),\n    disposition: dispositionFor(determination)\n  };\n\n  if (determination.status === \"approved\") {\n    response.preAuthRef = determination.authNumber;\n    response.preAuthPeriod = {\n      start: determination.validFrom,\n      end: determination.validThrough\n    };\n  }\n\n  if (determination.status === \"denied\") {\n    response.processNote = [\n      {\n        number: 1,\n        type: \"display\",\n        text: determination.reasonText\n      }\n    ];\n  }\n\n  if (determination.status === \"info-needed\") {\n    response.extension = determination.documentationRequired.map((requirement) => ({\n      url: \"https://backwork.example/fhir/StructureDefinition/x278-dtr-questionnaire\",\n      valueCanonical: requirement.questionnaire\n    }));\n    response.processNote = [\n      {\n        number: 1,\n        type: \"display\",\n        text: dispositionFor(determination)\n      }\n    ];\n  }\n\n  if (determination.status === \"pended\") {\n    response.preAuthRef = determination.authId;\n    response.extension = [\n      {\n        url: \"https://backwork.example/fhir/StructureDefinition/x278-subscription\",\n        valueUrl: determination.subscription\n      }\n    ];\n  }\n\n  return response;\n};\n"]}