Skip to content

SQL-008: Bill regenerate service cascade insert (CbpBillService)

BillRegenerator.RegenBillServiceData clones each of the original bill's services onto the new cloned bill. The CBP_BILL_SERVICE rows are inserted by the CbpBill.Services cascade (Cascade.AllDeleteOrphan) at flush* rather than an explicit Add.

Classification

Field Value
SQL ID SQL-008
Operation type Create*
Execution method ORM (cascade on flush*)
Database Oracle*
Schema [unqualified]**
Command type N/A — ORM (NHibernate generates SQL at runtime from the ClassMaps in Data/SAIF.Data.NHibernate/Mappings/**)
Business object BillRegenerator
Criteria property N/A — ORM
Lifecycle method RegenBillServiceData

Tables

Table Access Columns used
CBP_BILL_SERVICE INSERT BILL_ID, BILL_SERVICE_SEQ_NUM, UPDATE_NUM, BILL_SERVICE_DATE, BILL_SERVICE_END_DATE, PROVIDER_SERVICE_CODE, BILL_SERVICE_TYPE_CODE, SERVICE_MODIFIER_CODE1, SERVICE_MODIFIER_CODE2, SERVICE_MODIFIER_CODE3, SERVICE_MODIFIER_CODE4, SERVICE_QUANTITY, CHARGE_AMT, MSRP_INVOICE_AMT, TOOTH_NUM, SERVICE_LOCATION_CODE, DAYS_SUPPLY_QTY, UPDATE_USER, UPDATE_DATE, DIAGNOSIS_POINTER_CODE1, DIAGNOSIS_POINTER_CODE2, DIAGNOSIS_POINTER_CODE3, DIAGNOSIS_POINTER_CODE4, SECONDARY_PROV_SERVICE_CODE, SECONDARY_BILL_SERV_TYPE_CODE, PRESCRIPTION_WRITTEN_DATE, PRESCRIBING_PROVIDER_ID, COMPOUND_DRUG_FLAG, PRESCRIBER_LAST_NAME, PRESCRIBER_FIRST_NAME, TAX_CHARGED_AMT, PRESCRIBING_PROVIDER_CODE, DISPENSE_AS_WRITTEN_CODE, PRESC_PROVIDER_LOC_SEQ_NUM, SERV_PROVIDER_LOC_SEQ_NUM, MSRP_INVOICE_CODE

LINQ statement

Source: Domain/SAIF.Domain/Claims/Bills/BillRegenerator.cs:118

// Domain/SAIF.Domain/Claims/Bills/BillRegenerator.cs:84-120
foreach (var service in bill.Services.OrderBy(x => x.Id))
{
    var cloneBillService = new CbpBillService
    {
        Id = service.Id,
        PrescribingProviderLocation = service.PrescribingProviderLocation,
        ServicingProviderLocation = service.ServicingProviderLocation,
        BillServiceDate = service.BillServiceDate,
        BillServiceEndDate = service.BillServiceEndDate,
        ProviderServiceCode = service.ProviderServiceCode,
        ServiceModifierCode1 = service.ServiceModifierCode1,
        ServiceModifierCode2 = service.ServiceModifierCode2,
        ServiceModifierCode3 = service.ServiceModifierCode3,
        ServiceModifierCode4 = service.ServiceModifierCode4,
        ServiceQuantity = service.ServiceQuantity,
        ChargeAmount = service.ChargeAmount,
        MsrpInvoiceAmount = service.MsrpInvoiceAmount,
        MsrpInvoiceCode = service.MsrpInvoiceCode,
        ToothNumber = service.ToothNumber,
        ServiceLocationCode = service.ServiceLocationCode,
        DaysSupplyQuantity = service.DaysSupplyQuantity,
        BillServiceTypeCode = service.BillServiceTypeCode,
        UpdateUser = currentUser,
        UpdateDate = DateTime.Now,
        PharmacyDispenseAsWrittenCode = service.PharmacyDispenseAsWrittenCode,
        SecondaryProvServiceCode = service.SecondaryProvServiceCode,
        DiagnosisPointerCode1 = service.DiagnosisPointerCode1,
        DiagnosisPointerCode2 = service.DiagnosisPointerCode2,
        DiagnosisPointerCode3 = service.DiagnosisPointerCode3,
        DiagnosisPointerCode4 = service.DiagnosisPointerCode4,
        SecondaryBillServiceTypeCode = service.SecondaryBillServiceTypeCode,
        CompoundDrugFlag = service.CompoundDrugFlag
    };

    clonebill.AddService(cloneBillService);

}

// Data/SAIF.Data/Model/Claims/Bills/CbpBill.cs:106-116
public virtual void AddService(CbpBillService service)
{
    service.Bill = this;

    if (service.Id == 0)
        service.Id = (Services.Count == 0)
            ? 1
            : Services.Max(x => x.Id) + 1;

    Services.Add(service);
}

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
INSERT INTO CBP_BILL_SERVICE (
  BILL_ID,
  BILL_SERVICE_SEQ_NUM,
  UPDATE_NUM,
  BILL_SERVICE_DATE,
  BILL_SERVICE_END_DATE,
  PROVIDER_SERVICE_CODE,
  BILL_SERVICE_TYPE_CODE,
  SERVICE_MODIFIER_CODE1,
  SERVICE_MODIFIER_CODE2,
  SERVICE_MODIFIER_CODE3,
  SERVICE_MODIFIER_CODE4,
  SERVICE_QUANTITY,
  CHARGE_AMT,
  MSRP_INVOICE_AMT,
  TOOTH_NUM,
  SERVICE_LOCATION_CODE,
  DAYS_SUPPLY_QTY,
  UPDATE_USER,
  UPDATE_DATE,
  DIAGNOSIS_POINTER_CODE1,
  DIAGNOSIS_POINTER_CODE2,
  DIAGNOSIS_POINTER_CODE3,
  DIAGNOSIS_POINTER_CODE4,
  SECONDARY_PROV_SERVICE_CODE,
  SECONDARY_BILL_SERV_TYPE_CODE,
  PRESCRIPTION_WRITTEN_DATE,
  PRESCRIBING_PROVIDER_ID,
  COMPOUND_DRUG_FLAG,
  PRESCRIBER_LAST_NAME,
  PRESCRIBER_FIRST_NAME,
  TAX_CHARGED_AMT,
  PRESCRIBING_PROVIDER_CODE,
  DISPENSE_AS_WRITTEN_CODE,
  PRESC_PROVIDER_LOC_SEQ_NUM,
  SERV_PROVIDER_LOC_SEQ_NUM,
  MSRP_INVOICE_CODE)
VALUES (
  :Bill,
  :Id,
  :UpdateNumber,
  :BillServiceDate,
  :BillServiceEndDate,
  :ProviderServiceCode,
  :BillServiceTypeCode,
  :ServiceModifierCode1,
  :ServiceModifierCode2,
  :ServiceModifierCode3,
  :ServiceModifierCode4,
  :ServiceQuantity,
  :ChargeAmount,
  :MsrpInvoiceAmount,
  :ToothNumber,
  :ServiceLocationCode,
  :DaysSupplyQuantity,
  :UpdateUser,
  :UpdateDate,
  :DiagnosisPointerCode1,
  :DiagnosisPointerCode2,
  :DiagnosisPointerCode3,
  :DiagnosisPointerCode4,
  :SecondaryProvServiceCode,
  :SecondaryBillServiceTypeCode,
  :PrescriptionWrittenDate,
  :PrescribingProviderId,
  :CompoundDrugFlag,
  :PrescriberLastName,
  :PrescriberFirstName,
  :TaxChargedAmount,
  :PrescribingProviderCode,
  :PharmacyDispenseAsWrittenCode,
  :PrescribingProviderLocation,
  :ServicingProviderLocation,
  :MsrpInvoiceCode)

Translation notes: - Stateful session (OracleUnitOfWorkFactory → StatefulSessionStrategy, confirmed via Legends): the child row is not inserted by an explicit repository call; it is inserted by NHibernate cascade when the owning entity is saved/flushed. Cascade source: CbpBill.Services (CbpBillMap.cs:79-82), fired when the cloned bill is added (SQL-007). - Composite key (CbpBillServiceMap.cs:13-15): :Bill (→ BILL_ID, the parent bill identifier) and :Id (→ BILL_SERVICE_SEQ_NUM, assigned in C#: copied from the source service, or computed by CbpBill.AddService when 0). No sequence. - References(x => x.Bill).Column("BILL_ID").Not.Insert() (CbpBillServiceMap.cs:55-57) — BILL_ID is written once, via the key. - :UpdateNumber is the initial version value NHibernate seeds on insert (version column mapped with Version(...)). - Reference bind variables (:<Property>) carry the referenced entity's identifier value.

Operations and processes

  • OP-DOM-16 BillRegenerator.Regenerate — clones the bill and sets status Entered with responsible party SYSTEM (see Operations and processes)

Business rules

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

  • Domain/SAIF.Domain/Claims/Bills/BillRegenerator.cs