Skip to content

SQL-221: Check for duplicate LegalBillService

BillRateService.CheckForDuplicateService looks up LegalBillService rows against the same billing/rendering provider and case, first with an exact match on bill-service code, service-from date, and billed amount, then (if none found) with a looser match on provider/case/date only. Both queries join LEGAL_BILL to reach the provider and case filters.

Classification

Field Value
SQL ID SQL-221
Operation type Read
Execution method ORM (NHibernate LINQ)
Database Oracle
Schema [unqualified]**
Command type N/A (ORM-generated)
Business object LegalBillService
Criteria property N/A — ORM
Lifecycle method CheckForDuplicateService

Parameters

Parameter Direction Type Max length Description
:providerLocationId Input long N/A method argument, matched against billing or rendering provider
:caseId Input long N/A method argument, matched against the bill's legal case
:billId Input long N/A method argument, excluded bill (<>)
:billServiceCode Input string N/A serviceLine.BillService.Code (statement 1 only)
:serviceFromDate Input DateTime N/A serviceLine.ServiceFromDate
:billedAmount Input decimal N/A serviceLine.BilledAmount (statement 1 only)

Tables

Table Access Columns used
LEGAL_BILL_SERVICE SELECT all 18 mapped columns; filters BILL_SERVICE_CODE, SERVICE_FROM_DATE, BILLED_AMOUNT
LEGAL_BILL JOIN LEGAL_BILL_SEQ_NUM, BILLING_PROV_LOC_SEQ_NUM, RENDERING_PROV_LOC_SEQ_NUM, LEGAL_CASE_SEQ_NUM

PROVIDER_LOCATION, LEGAL_CASE, and BILL_SERVICE_CODE are not joined. LegalBill.BillingProvider.Id, RenderingProvider.Id, and LegalCase.Id are FK identifiers on LEGAL_BILL (the first-level navigation LegalBill is joined, but its second-level navigations short-circuit to its own FK columns), and x.BillService.Code is the FK identifier LEGAL_BILL_SERVICE.BILL_SERVICE_CODE. LEGAL_BILL itself IS joined: its FK columns are needed and are not available on LEGAL_BILL_SERVICE.

LINQ statement

Source: Services/SAIF.Services/Legal/Bills/BillRateService.cs:79, also :92.

// Services/SAIF.Services/Legal/Bills/BillRateService.cs:79
var legalBillService = _unitOfWork.GetRepository<BillData.LegalBillService>().Query()
      .FirstOrDefault(x => (x.LegalBill.BillingProvider.Id == providerLocationId || x.LegalBill.RenderingProvider.Id == providerLocationId)
                        && x.LegalBill.LegalCase.Id == caseId
                        && x.LegalBill.Id != billId
                        && x.BillService.Code == serviceLine.BillService.Code
                        && x.ServiceFromDate == serviceLine.ServiceFromDate
                        && x.BilledAmount == serviceLine.BilledAmount);

// Services/SAIF.Services/Legal/Bills/BillRateService.cs:92
legalBillService = _unitOfWork.GetRepository<BillData.LegalBillService>().Query()
    .FirstOrDefault(x => (x.LegalBill.BillingProvider.Id == providerLocationId || x.LegalBill.RenderingProvider.Id == providerLocationId)
                      && x.LegalBill.LegalCase.Id == caseId
                      && x.LegalBill.Id != billId
                      && x.ServiceFromDate == serviceLine.ServiceFromDate);

Sample SQL

Inferred SQL: This SQL was inferred from the LINQ statement above and the NHibernate mappings. It is not concrete SQL from source code; NHibernate generates the executed statement at runtime, so aliases, column order, join syntax, and bind-parameter names may differ.

-- Inferred from LINQ (NHibernate mapping translation); not concrete SQL
-- (1) L79 — duplicate check including service code and billed amount
SELECT * FROM (
  SELECT S.LEGAL_BILL_SERVICE_SEQ_NUM,
       S.UPDATE_NUM,
       S.AMENDED_FLAG,
       S.SERVICE_FROM_DATE,
       S.SERVICE_THRU_DATE,
       S.BILLED_AMOUNT,
       S.PAID_AMOUNT,
       S.BILLED_UNITS,
       S.ADJUSTMENT_REASON_TEXT,
       S.PARENT_BILL_SERVICE_SEQ_NUM,
       S.CREATE_USER,
       S.CREATE_DATE,
       S.UPDATE_USER,
       S.UPDATE_DATE,
       S.LEGAL_BILL_SEQ_NUM,
       S.BILL_SERVICE_CODE,
       S.BILL_SERVICE_RATE_TYPE_CODE,
       S.ADJUSTMENT_REASON_CODE
  FROM   LEGAL_BILL_SERVICE S
    INNER JOIN LEGAL_BILL LB ON LB.LEGAL_BILL_SEQ_NUM = S.LEGAL_BILL_SEQ_NUM
  WHERE  (LB.BILLING_PROV_LOC_SEQ_NUM = :providerLocationId
          OR LB.RENDERING_PROV_LOC_SEQ_NUM = :providerLocationId)
    AND  LB.LEGAL_CASE_SEQ_NUM = :caseId
    AND  LB.LEGAL_BILL_SEQ_NUM <> :billId
    AND  S.BILL_SERVICE_CODE = :billServiceCode
    AND  S.SERVICE_FROM_DATE = :serviceFromDate
    AND  S.BILLED_AMOUNT = :billedAmount
) WHERE ROWNUM <= 1

-- (2) L92 — possible-duplicate check (provider/case/bill/from-date only)
SELECT * FROM (
  SELECT S.<all 18 mapped LEGAL_BILL_SERVICE columns, as in (1)>
  FROM   LEGAL_BILL_SERVICE S
    INNER JOIN LEGAL_BILL LB ON LB.LEGAL_BILL_SEQ_NUM = S.LEGAL_BILL_SEQ_NUM
  WHERE  (LB.BILLING_PROV_LOC_SEQ_NUM = :providerLocationId
          OR LB.RENDERING_PROV_LOC_SEQ_NUM = :providerLocationId)
    AND  LB.LEGAL_CASE_SEQ_NUM = :caseId
    AND  LB.LEGAL_BILL_SEQ_NUM <> :billId
    AND  S.SERVICE_FROM_DATE = :serviceFromDate
) WHERE ROWNUM <= 1

Translation notes: - FirstOrDefault → Oracle10 dialect wraps each query in SELECT * FROM (...) WHERE ROWNUM <= 1. - Only the first-level navigation x.LegalBill needs a join. The second-level .BillingProvider.Id / .RenderingProvider.Id / .LegalCase.Id are short-circuited to FK columns on the joined LEGAL_BILL, so PROVIDER_LOCATION and LEGAL_CASE are never joined.

Operations and processes

Sources

  • Services/SAIF.Services/Legal/Bills/BillRateService.cs (L79, L92)