public async Task <bool> UpdateBilling(UpdateBillingCommand cmd)
        {
            bool isTemp = cmd.StartDate == DateTime.Now.FirstOfMonth();

            using (var bc = new BillingClient())
            {
                LNF.Models.Billing.Process.BillingProcessResult toolDataCleanResult = null;
                LNF.Models.Billing.Process.BillingProcessResult toolDataResult      = null;
                LNF.Models.Billing.Process.BillingProcessResult toolStep1Result     = null;
                LNF.Models.Billing.Process.BillingProcessResult roomDataCleanResult = null;
                LNF.Models.Billing.Process.BillingProcessResult roomDataResult      = null;
                LNF.Models.Billing.Process.BillingProcessResult roomStep1Result     = null;
                LNF.Models.Billing.Process.BillingProcessResult subsidyResult       = null;

                // Tool
                toolDataCleanResult = await bc.BillingProcessDataClean(LNF.Models.Billing.BillingCategory.Tool, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0);

                toolDataResult = await bc.BillingProcessData(LNF.Models.Billing.BillingCategory.Tool, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0);

                toolStep1Result = await bc.BillingProcessStep1(LNF.Models.Billing.BillingCategory.Tool, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0, isTemp, true);

                // Room
                roomDataCleanResult = await bc.BillingProcessDataClean(LNF.Models.Billing.BillingCategory.Room, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0);

                roomDataResult = await bc.BillingProcessData(LNF.Models.Billing.BillingCategory.Room, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0);

                roomStep1Result = await bc.BillingProcessStep1(LNF.Models.Billing.BillingCategory.Room, cmd.StartDate, cmd.EndDate, cmd.ClientID, 0, isTemp, true);

                // Subsidy
                if (!isTemp)
                {
                    subsidyResult = await bc.BillingProcessStep4("subsidy", cmd.StartDate, cmd.ClientID);
                }

                UpdateBillingResult updateResult = new UpdateBillingResult(toolDataCleanResult, toolDataResult, toolStep1Result, roomDataCleanResult, roomDataResult, roomStep1Result, subsidyResult);

                if (updateResult.HasError())
                {
                    throw new Exception(updateResult.GetErrorMessage());
                }

                return(true);
            }
        }