//updates billStatus and related fields in BIL_TXN_BillingTransactionItems table.
        public static BillingTransactionItemModel UpdateTxnItemBillStatus(BillingDbContext billingDbContext,
                                                                          BillingTransactionItemModel billItem,
                                                                          string billStatus, //provisional,paid,unpaid,returned
                                                                          int userId,
                                                                          DateTime?modifiedDate    = null,
                                                                          int?counterId            = null,
                                                                          int?billingTransactionId = null)
        {
            modifiedDate = modifiedDate != null ? modifiedDate : DateTime.Now;

            billItem = GetBillStatusMapped(billItem, billStatus, modifiedDate, userId, counterId);
            billingDbContext.BillingTransactionItems.Attach(billItem);
            //update returnstatus and returnquantity
            if (billStatus == "paid")
            {
                billingDbContext.Entry(billItem).Property(b => b.PaidDate).IsModified          = true;
                billingDbContext.Entry(billItem).Property(a => a.BillStatus).IsModified        = true;
                billingDbContext.Entry(billItem).Property(b => b.PaymentReceivedBy).IsModified = true;
                billingDbContext.Entry(billItem).Property(b => b.PaidCounterId).IsModified     = true;
            }
            else if (billStatus == "unpaid")
            {
                billingDbContext.Entry(billItem).Property(b => b.PaidDate).IsModified          = true;
                billingDbContext.Entry(billItem).Property(a => a.BillStatus).IsModified        = true;
                billingDbContext.Entry(billItem).Property(b => b.PaidCounterId).IsModified     = true;
                billingDbContext.Entry(billItem).Property(b => b.PaymentReceivedBy).IsModified = true;
            }
            else if (billStatus == "cancel")
            {
                billingDbContext.Entry(billItem).Property(a => a.CancelledBy).IsModified   = true;
                billingDbContext.Entry(billItem).Property(a => a.BillStatus).IsModified    = true;
                billingDbContext.Entry(billItem).Property(a => a.CancelledOn).IsModified   = true;
                billingDbContext.Entry(billItem).Property(a => a.CancelRemarks).IsModified = true;
            }
            else if (billStatus == "adtCancel")
            {
                billingDbContext.Entry(billItem).Property(a => a.CancelledBy).IsModified   = true;
                billingDbContext.Entry(billItem).Property(a => a.BillStatus).IsModified    = true;
                billingDbContext.Entry(billItem).Property(a => a.CancelledOn).IsModified   = true;
                billingDbContext.Entry(billItem).Property(a => a.CancelRemarks).IsModified = true;
            }
            else if (billStatus == "returned")
            {
                billingDbContext.Entry(billItem).Property(a => a.ReturnStatus).IsModified   = true;
                billingDbContext.Entry(billItem).Property(a => a.ReturnQuantity).IsModified = true;
            }

            if (billItem.BillingTransactionId == null)
            {
                billItem.BillingTransactionId = billingTransactionId;
                billingDbContext.Entry(billItem).Property(b => b.BillingTransactionId).IsModified = true;
            }

            //these fields could also be changed during update.
            billingDbContext.Entry(billItem).Property(b => b.BillStatus).IsModified         = true;
            billingDbContext.Entry(billItem).Property(a => a.Price).IsModified              = true;
            billingDbContext.Entry(billItem).Property(a => a.Quantity).IsModified           = true;
            billingDbContext.Entry(billItem).Property(a => a.SubTotal).IsModified           = true;
            billingDbContext.Entry(billItem).Property(a => a.DiscountAmount).IsModified     = true;
            billingDbContext.Entry(billItem).Property(a => a.DiscountPercent).IsModified    = true;
            billingDbContext.Entry(billItem).Property(a => a.DiscountPercentAgg).IsModified = true;
            billingDbContext.Entry(billItem).Property(a => a.TotalAmount).IsModified        = true;
            billingDbContext.Entry(billItem).Property(a => a.ProviderId).IsModified         = true;
            billingDbContext.Entry(billItem).Property(a => a.ProviderName).IsModified       = true;
            billingDbContext.Entry(billItem).Property(a => a.TaxableAmount).IsModified      = true;
            billingDbContext.Entry(billItem).Property(a => a.NonTaxableAmount).IsModified   = true;

            UpdateRequisitionItemsBillStatus(billingDbContext, billItem.ServiceDepartmentName, billStatus, userId, billItem.RequisitionId, modifiedDate);

            //update bill status in BillItemRequistion (Order Table)
            BillItemRequisition billItemRequisition = (from bill in billingDbContext.BillItemRequisitions
                                                       where bill.RequisitionId == billItem.RequisitionId &&
                                                       bill.ServiceDepartmentId == billItem.ServiceDepartmentId
                                                       select bill).FirstOrDefault();

            if (billItemRequisition != null)
            {
                billItemRequisition.BillStatus = billStatus;
                billingDbContext.Entry(billItemRequisition).Property(a => a.BillStatus).IsModified = true;
            }
            return(billItem);
        }
        //post to BIL_TXN_BillingTransactionItems
        public static List <BillingTransactionItemModel> PostUpdateBillingTransactionItems(BillingDbContext dbContext, string connString,
                                                                                           List <BillingTransactionItemModel> billingTransactionItems,
                                                                                           int userId,
                                                                                           DateTime currentDate,
                                                                                           string billStatus,
                                                                                           int?counterId,
                                                                                           int?billingTransactionId = null)
        {
            BillingFiscalYear fiscYear = BillingBL.GetFiscalYear(connString);

            var srvDepts = dbContext.ServiceDepartment.ToList();

            //var empList = masterDbContext.Employees.ToList();
            if (billingTransactionItems != null && billingTransactionItems.Count > 0)
            {
                var ProvisionalReceiptNo = BillingBL.GetProvisionalReceiptNo(connString);
                for (int i = 0; i < billingTransactionItems.Count; i++)
                {
                    var txnItem = billingTransactionItems[i];
                    if (txnItem.BillingTransactionItemId == 0)
                    {
                        txnItem.CreatedOn            = currentDate;
                        txnItem.CreatedBy            = userId;
                        txnItem.RequisitionDate      = currentDate;
                        txnItem.CounterId            = counterId;
                        txnItem.BillingTransactionId = billingTransactionId;
                        if (txnItem.BillStatus == "provisional")
                        {
                            txnItem.ProvisionalReceiptNo    = ProvisionalReceiptNo;
                            txnItem.ProvisionalFiscalYearId = fiscYear.FiscalYearId;
                            txnItem.ProvFiscalYear          = fiscYear.FiscalYearFormatted; //not mapped
                        }
                        //assign providername and servicedepartmentname to each of the incoming transaction items.
                        //Needs Revision: 12-12-17: sud: I think we don't need to get providername since that property already comes from client side:
                        //txnItem.ProviderName = (from a in empList where a.EmployeeId == txnItem.ProviderId select a.FullName).FirstOrDefault();
                        txnItem.ServiceDepartmentName = (from b in srvDepts where b.ServiceDepartmentId == txnItem.ServiceDepartmentId select b.ServiceDepartmentName).FirstOrDefault();

                        txnItem = GetBillStatusMapped(txnItem, billStatus, currentDate, userId, counterId);
                        UpdateRequisitionItemsBillStatus(dbContext, txnItem.ServiceDepartmentName, billStatus, userId, txnItem.RequisitionId, currentDate);
                        dbContext.BillingTransactionItems.Add(txnItem);
                    }
                    else
                    {
                        txnItem = UpdateTxnItemBillStatus(dbContext, txnItem, billStatus, userId, currentDate, counterId, billingTransactionId);
                    }


                    //update the Requisitions billingstatus as 'paid' for above items.
                    //List<Int32?> requisitionIds = (from a in billTranItems select a.BillItemRequisitionId).ToList();
                    BillItemRequisition billItemRequisition = (from bill in dbContext.BillItemRequisitions
                                                               where bill.RequisitionId == txnItem.RequisitionId &&
                                                               bill.ServiceDepartmentId == txnItem.ServiceDepartmentId
                                                               select bill).FirstOrDefault();
                    if (billItemRequisition != null)
                    {
                        billItemRequisition.BillStatus             = "paid";
                        dbContext.Entry(billItemRequisition).State = EntityState.Modified;
                    }
                }
                dbContext.SaveChanges();
            }
            else
            {
                throw new Exception("BillingTranscation Items is null");
            }
            return(billingTransactionItems);
        }