private void CheckAgingProcLifo(long patNum, double bal_0_30, double bal_31_60, double bal_61_90, double balOver90, double payPlanDue, YN prefVal) { int agingProcLifoPrev = PrefC.GetInt(PrefName.AgingProcLifo); try { PrefT.UpdateInt(PrefName.AgingProcLifo, (int)prefVal); Ledgers.ComputeAging(patNum, DateTime.Today); PatAssertBalances(patNum, bal_0_30, bal_31_60, bal_61_90, balOver90, payPlanDue); } finally { PrefT.UpdateInt(PrefName.AgingProcLifo, agingProcLifoPrev); } }
/// <summary>Creates patient objects corresponding to the totalPat parameter. Each patient has a procedure /// and statement created on the specified date. Aging is run for each patient.</summary> public static void CreatePatWithProcAndStatement(int totalPat, DateTime dateTimeSentStmt = default(DateTime), bool hasPortalAccessInfo = false, PatientStatus patStatus = PatientStatus.Patient, StatementMode stmtMode = StatementMode.Mail, bool hasSignedTil = false, double procFee = 0) { for (int i = 0; i < totalPat; i++) { Patient patient = CreatePatient("", 0, 0, "", "", ContactMethod.Email, "", "", "", default(DateTime), 0, 0, hasPortalAccessInfo, patStatus, hasSignedTil); DateTime dateProc = DateTime.Today.AddDays(-1); //Create a completed procedure that was completed the day before the first payplan charge date AND before the payment plan creation date. ProcedureT.CreateProcedure(patient, "D1100", ProcStat.C, "", procFee, dateProc); //Run Ledgers to update the patient balance from the procedure fee Ledgers.ComputeAging(patient.PatNum, dateTimeSentStmt); //Insert a statement that was sent during the "bill in advance days" for the payment plan charge AND before the payment plan creation date. StatementT.CreateStatement(patient.PatNum, mode_: stmtMode, isSent: true, dateSent: dateTimeSentStmt); } }
public void LedgersTests_ComputeAgingForPaysplitsAllocatedToDiffPats() { string suffix = MethodBase.GetCurrentMethod().Name; Patient patDad = PatientT.CreatePatient(fName: "Father", suffix: suffix); //Father-guarantor Patient patChild = PatientT.CreatePatient(fName: "Child", suffix: suffix); //Child PatientT.SetGuarantor(patChild, patDad.PatNum); Procedure proc1 = ProcedureT.CreateProcedure(patChild, "D1110", ProcStat.C, "", 50, DateTime.Today.AddDays(-45)); Procedure proc2 = ProcedureT.CreateProcedure(patChild, "D0120", ProcStat.C, "", 40, DateTime.Today.AddDays(-45)); Ledgers.ComputeAging(patDad.PatNum, DateTime.Today); patDad = Patients.GetPat(patDad.PatNum); Assert.AreEqual(90, patDad.Bal_31_60); Patient patMom = PatientT.CreatePatient(fName: "Mom", suffix: suffix); //Mom is not associated to the father and childs account long patNum = patMom.PatNum; //complete procedures for patMom. Procedure proc3 = ProcedureT.CreateProcedure(patMom, "D1110", ProcStat.C, "", 50, DateTime.Today.AddDays(-1)); Procedure proc4 = ProcedureT.CreateProcedure(patMom, "D0120", ProcStat.C, "", 40, DateTime.Today.AddDays(-1)); //Compute aging. Check that the aging is correct before we continue Ledgers.ComputeAging(patNum, DateTime.Today); patMom = Patients.GetPat(patNum); Assert.AreEqual(90, patMom.Bal_0_30); //patMom will now make a payment for her procedures and patChilds Payment pay = PaymentT.MakePaymentNoSplits(patNum, 100, clinicNum: proc3.ClinicNum); List <PaySplit> listPaySplits = new List <PaySplit>(); listPaySplits.Add(PaySplitT.CreateSplit(proc3.ClinicNum, patNum, pay.PayNum, 0, DateTime.Today, proc3.ProcNum, proc3.ProvNum, 50, 0)); //Create a paysplit for patChild. PatChild is from a different family. listPaySplits.Add(PaySplitT.CreateSplit(proc1.ClinicNum, patChild.PatNum, pay.PayNum, 0, DateTime.Today, proc1.ProcNum, proc1.ProvNum, 50, 0)); //This should compute the aging for the string strErrorMsg = Ledgers.ComputeAgingForPaysplitsAllocatedToDiffPats(patNum, listPaySplits); Assert.IsTrue(string.IsNullOrEmpty(strErrorMsg)); patDad = Patients.GetPat(patDad.PatNum); Assert.AreEqual(40, patDad.Bal_31_60); //Compute patMom aging to verify that it is correct. Ledgers.ComputeAging(patNum, DateTime.Today); patMom = Patients.GetPat(patNum); Assert.AreEqual(40, patMom.Bal_0_30); }
public void LedgersTests_ComputeAgingProcLifo_LargeDb() { Def defNeg = DefT.CreateDefinition(DefCat.AdjTypes, "Ortho Revenue", "-"); Def defPos = DefT.CreateDefinition(DefCat.AdjTypes, "Ortho Revenue", "+"); Def defPay = DefT.CreateDefinition(DefCat.PaymentTypes, "Check"); List <Patient> listPats = new List <Patient>(); for (int i = 0; i < 1000; i++) { Patient pat = PatientT.CreatePatient(fName: "Schedule Based", lName: "UDP Ortho LargeDb"); Procedure proc = ProcedureT.CreateProcedure(pat, "D8090", ProcStat.C, "", 4000, DateTime.Today.AddMonths(-6).AddDays(-1)); PayPlan payPlan = PayPlanT.CreatePayPlan(pat.PatNum, 4000, 166.67, DateTime.Today.AddMonths(-6).AddDays(-1), proc.ProvNum); Adjustment adj6 = AdjustmentT.MakeAdjustment(pat.PatNum, -2800, DateTime.Today.AddMonths(-6).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defNeg.DefNum); Payment pay6 = PaymentT.MakePayment(pat.PatNum, 166.67, DateTime.Today.AddMonths(-6).AddDays(-1), payPlanNum: payPlan.PayPlanNum, provNum: proc.ProvNum, procNum: proc.ProcNum, payType: defPay.DefNum); PayPlanCharge ppc6 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-6).AddDays(-1), 1200, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); Adjustment adj5 = AdjustmentT.MakeAdjustment(pat.PatNum, 121.74, DateTime.Today.AddMonths(-5).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defPos.DefNum); Payment pay5 = PaymentT.MakePayment(pat.PatNum, 166.67, DateTime.Today.AddMonths(-5).AddDays(-1), payPlanNum: payPlan.PayPlanNum, provNum: proc.ProvNum, procNum: proc.ProcNum, payType: defPay.DefNum); PayPlanCharge ppc5 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-5).AddDays(-1), 121.74, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); Adjustment adj4 = AdjustmentT.MakeAdjustment(pat.PatNum, 121.74, DateTime.Today.AddMonths(-4).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defPos.DefNum); PayPlanCharge ppc4 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-4).AddDays(-1), 121.74, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); Adjustment adj3 = AdjustmentT.MakeAdjustment(pat.PatNum, 121.74, DateTime.Today.AddMonths(-3).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defPos.DefNum); PayPlanCharge ppc3 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-3).AddDays(-1), 121.74, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); Adjustment adj2 = AdjustmentT.MakeAdjustment(pat.PatNum, 121.74, DateTime.Today.AddMonths(-2).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defPos.DefNum); PayPlanCharge ppc2 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-2).AddDays(-1), 121.74, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); Adjustment adj1 = AdjustmentT.MakeAdjustment(pat.PatNum, 121.74, DateTime.Today.AddMonths(-1).AddDays(-1), proc.ProcDate, proc.ProcNum, provNum: proc.ProvNum, adjType: defPos.DefNum); PayPlanCharge ppc1 = PayPlanChargeT.CreateOne(payPlan.PayPlanNum, pat.Guarantor, pat.PatNum, DateTime.Today.AddMonths(-1).AddDays(-1), 121.74, 0, "D8090: CompOrthoAdlt", proc.ProvNum, 0, PayPlanChargeType.Credit, proc.ProcNum); listPats.Add(pat); } int payPlansVersionPrev = PrefC.GetInt(PrefName.PayPlansVersion); int agingProcLifoPrev = PrefC.GetInt(PrefName.AgingProcLifo); Stopwatch swOn = new Stopwatch(); Stopwatch swOff = new Stopwatch(); Stopwatch swUnset = new Stopwatch(); try { PrefT.UpdateInt(PrefName.PayPlansVersion, (int)PayPlanVersions.AgeCreditsAndDebits); swOn.Start(); PrefT.UpdateInt(PrefName.AgingProcLifo, (int)YN.Yes); Ledgers.ComputeAging(0, DateTime.Today); //Compute aging for all patients. foreach (Patient pat in listPats) { PatAssertBalances(pat.PatNum, 166.67, 166.67, 166.67, 333.34, 833.35); } swOn.Stop(); swOff.Start(); PrefT.UpdateInt(PrefName.AgingProcLifo, (int)YN.No); Ledgers.ComputeAging(0, DateTime.Today); //Compute aging for all patients. foreach (Patient pat in listPats) { PatAssertBalances(pat.PatNum, 166.67, 288.41, 288.41, 89.86, 833.35); } swOff.Stop(); swUnset.Start(); PrefT.UpdateInt(PrefName.AgingProcLifo, (int)YN.Unknown); Ledgers.ComputeAging(0, DateTime.Today); //Compute aging for all patients. foreach (Patient pat in listPats) { PatAssertBalances(pat.PatNum, 166.67, 288.41, 288.41, 89.86, 833.35); } swUnset.Stop(); } finally { PrefT.UpdateInt(PrefName.PayPlansVersion, payPlansVersionPrev); PrefT.UpdateInt(PrefName.AgingProcLifo, agingProcLifoPrev); } //Fails if swOn run time is at least 10 times as large as the average of the runtimes for swUnset and swOff. Assert.IsTrue(swOn.Elapsed.TotalMilliseconds < (swUnset.Elapsed.TotalMilliseconds + swOff.Elapsed.TotalMilliseconds) * 5, "Pref On: " + swOn.Elapsed + "\r\n" + "Pref Off: " + swOff.Elapsed + "\r\n" + "Pref Unset: " + swUnset.Elapsed); }