/// <summary>
        /// Validate business of screen
        /// </summary>
        /// <param name="res"></param>
        /// <param name="doStopReason"></param>
        private void ValidateScreenBusiness_CTS100(ObjectResultData res, CTS100_doStopReason doStopReason)
        {
            try
            {
                CTS100_ScreenParameter sParam = GetScreenObject <CTS100_ScreenParameter>();

                if (doStopReason.ChangeImplementDate > DateTime.Now.Date)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3157, null, new string[] { "dpStopDate" });
                    return;
                }

                if (doStopReason.ChangeImplementDate <= (DateTime.Now.Date.AddYears(-1)))
                {
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3158, null, new string[] { "dpStopDate" });
                    return;
                }

                if (doStopReason.ExpectedResumeDate < doStopReason.ChangeImplementDate)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3182, null, new string[] { "dpOperationDate" });
                    return;
                }

                if (doStopReason.ChangeImplementDate < sParam.CTS100_Session.RegisterStopData.dtTbt_RentalContractBasic[0].LastChangeImplementDate)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3185, null, new string[] { "dpStopDate" });
                    return;
                }

                //Validate stop fee for keeping contract
                if (doStopReason.ContractFeeOnStop > CommonValue.C_MAX_MONTHLY_FEE_INPUT)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3287, new string[] { CommonValue.C_MAX_MONTHLY_FEE_INPUT.ToString("N2") }, new string[] { "txtStopFee" });
                    return;
                }
            }
            catch (Exception ex)
            {
                res.AddErrorMessage(ex);
            }
        }
        /// <summary>
        /// Update data to database when click [Confirm] button in ‘Action button’ section
        /// </summary>
        /// <param name="doStopReason"></param>
        /// <returns></returns>
        public ActionResult CTS100_ConfirmRegisterCancelData(CTS100_doStopReason doStopReason)
        {
            ObjectResultData res = new ObjectResultData();
            CTS100_RegisterStopTargetData registerStopData;
            IRentralContractHandler       rentralHandler;
            dsRentalContractData          dsRentalContract = null;
            IBillingInterfaceHandler      billingHandler;
            IMaintenanceHandler           maintenHandler;

            try
            {
                //CheckSystemStatus
                if (CheckIsSuspending(res) == true)
                {
                    return(Json(res));
                }

                //Check screen permission
                if (CheckUserPermission(ScreenID.C_SCREEN_ID_CP13, FunctionID.C_FUNC_ID_OPERATE) == false)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0053);
                    return(Json(res));
                }


                CTS100_ScreenParameter sParam = GetScreenObject <CTS100_ScreenParameter>();

                //ValidateScreenBusiness
                res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                ValidateScreenBusiness_CTS100(res, doStopReason);
                if (res.IsError)
                {
                    return(Json(res));
                }

                //ValidateDataBusiness
                res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                ValidateBusiness_CTS100(res, sParam.CTS100_Session.InitialData.ContractCode);
                if (res.IsError)
                {
                    return(Json(res));
                }

                res.MessageType = MessageModel.MESSAGE_TYPE.INFORMATION;
                using (TransactionScope scope = new TransactionScope())
                {
                    /*--- RegisterStopService ---*/
                    registerStopData = sParam.CTS100_Session;
                    if (registerStopData.RegisterStopData != null)
                    {
                        dsRentalContract = new dsRentalContractData();

                        //Generate security occurrence
                        rentralHandler = ServiceContainer.GetService <IRentralContractHandler>() as IRentralContractHandler;
                        string strOCC = rentralHandler.GenerateContractOCC(registerStopData.InitialData.ContractCode, true);

                        /*--- MapRentalContractData ---*/
                        //dtTbt_RentalContractBasic
                        dsRentalContract.dtTbt_RentalContractBasic = new List <tbt_RentalContractBasic>();
                        tbt_RentalContractBasic rentalContractBasic = CommonUtil.CloneObject <tbt_RentalContractBasic, tbt_RentalContractBasic>(registerStopData.RegisterStopData.dtTbt_RentalContractBasic[0]);
                        rentalContractBasic.LastOCC                 = strOCC;
                        rentalContractBasic.LastChangeType          = RentalChangeType.C_RENTAL_CHANGE_TYPE_STOP;
                        rentalContractBasic.ContractStatus          = ContractStatus.C_CONTRACT_STATUS_STOPPING;
                        rentalContractBasic.LastChangeImplementDate = doStopReason.ChangeImplementDate; //DateTime.Now;
                        rentalContractBasic.StopProcessDate         = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        dsRentalContract.dtTbt_RentalContractBasic.Add(rentalContractBasic);

                        //dtTbt_RentalSecurityBasic
                        dsRentalContract.dtTbt_RentalSecurityBasic = new List <tbt_RentalSecurityBasic>();
                        tbt_RentalSecurityBasic rentalSecurityBasicData = CommonUtil.CloneObject <tbt_RentalSecurityBasic, tbt_RentalSecurityBasic>(registerStopData.RegisterStopData.dtTbt_RentalSecurityBasic[0]);
                        rentalSecurityBasicData.ContractCode = registerStopData.InitialData.ContractCode;
                        rentalSecurityBasicData.OCC          = strOCC;
                        rentalSecurityBasicData.ChangeType   = RentalChangeType.C_RENTAL_CHANGE_TYPE_STOP;

                        //Add by Jutarat A. 03102012
                        rentalSecurityBasicData.QuotationTargetCode = null;
                        rentalSecurityBasicData.QuotationAlphabet   = null;
                        rentalSecurityBasicData.SalesmanEmpNo1      = null;
                        rentalSecurityBasicData.SalesmanEmpNo2      = null;
                        rentalSecurityBasicData.SalesSupporterEmpNo = null;
                        //End Add

                        rentalSecurityBasicData.ChangeImplementDate = doStopReason.ChangeImplementDate;

                        #region Contract Fee on Stop

                        rentalSecurityBasicData.ContractFeeOnStopCurrencyType = doStopReason.ContractFeeOnStopCurrencyType;
                        if (rentalSecurityBasicData.ContractFeeOnStopCurrencyType == SECOM_AJIS.Common.Util.ConstantValue.CurrencyUtil.C_CURRENCY_US)
                        {
                            rentalSecurityBasicData.ContractFeeOnStopUsd = doStopReason.ContractFeeOnStop;
                            rentalSecurityBasicData.ContractFeeOnStop    = null;
                        }
                        else
                        {
                            rentalSecurityBasicData.ContractFeeOnStopUsd = null;
                            rentalSecurityBasicData.ContractFeeOnStop    = doStopReason.ContractFeeOnStop;
                        }

                        #endregion

                        rentalSecurityBasicData.NormalAdditionalDepositFee = null; //0;
                        rentalSecurityBasicData.OrderAdditionalDepositFee  = null; //0;
                        rentalSecurityBasicData.DepositFeeBillingTiming    = null;
                        rentalSecurityBasicData.PlanCode   = null;                 //Add by Jutarat A. 03102012
                        rentalSecurityBasicData.ApproveNo1 = doStopReason.ApproveNo1;
                        rentalSecurityBasicData.ApproveNo2 = doStopReason.ApproveNo2;

                        //Add by Jutarat A. 03102012
                        rentalSecurityBasicData.ApproveNo3 = null;
                        rentalSecurityBasicData.ApproveNo4 = null;
                        rentalSecurityBasicData.ApproveNo5 = null;
                        //End Add

                        rentalSecurityBasicData.AlmightyProgramEmpNo = null;
                        rentalSecurityBasicData.CounterNo            = 0;
                        rentalSecurityBasicData.ChangeReasonType     = null;
                        rentalSecurityBasicData.ChangeNameReasonType = null;
                        rentalSecurityBasicData.StopCancelReasonType = doStopReason.StopCancelReasonType;
                        rentalSecurityBasicData.ContractDocPrintFlag = FlagType.C_FLAG_OFF;

                        //Add by Jutarat A. 24072012
                        rentalSecurityBasicData.InstallationCompleteFlag  = null;
                        rentalSecurityBasicData.InstallationSlipNo        = null;
                        rentalSecurityBasicData.InstallationCompleteDate  = null;
                        rentalSecurityBasicData.InstallationCompleteEmpNo = null;
                        rentalSecurityBasicData.InstallationTypeCode      = null;
                        //End Add

                        //Add by Jutarat A. 03102012
                        rentalSecurityBasicData.NegotiationStaffEmpNo1 = null;
                        rentalSecurityBasicData.NegotiationStaffEmpNo2 = null;
                        //End Add

                        rentalSecurityBasicData.ExpectedResumeDate = doStopReason.ExpectedResumeDate;
                        rentalSecurityBasicData.NormalInstallFee   = null;
                        rentalSecurityBasicData.OrderInstallFee    = null;
                        rentalSecurityBasicData.OrderInstallFee_ApproveContract = null;
                        rentalSecurityBasicData.OrderInstallFee_CompleteInstall = null;
                        rentalSecurityBasicData.OrderInstallFee_StartService    = null;

                        //Add by Jutarat A. 03102012
                        rentalSecurityBasicData.DispatchTypeCode  = null;
                        rentalSecurityBasicData.PlannerEmpNo      = null;
                        rentalSecurityBasicData.PlanCheckerEmpNo  = null;
                        rentalSecurityBasicData.PlanCheckDate     = null;
                        rentalSecurityBasicData.PlanApproverEmpNo = null;
                        rentalSecurityBasicData.PlanApproveDate   = null;
                        //End Add

                        rentalSecurityBasicData.DocumentCode   = null;
                        rentalSecurityBasicData.DocAuditResult = null;
                        rentalSecurityBasicData.CreateDate     = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        rentalSecurityBasicData.CreateBy       = CommonUtil.dsTransData.dtUserData.EmpNo;
                        rentalSecurityBasicData.UpdateDate     = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        rentalSecurityBasicData.UpdateBy       = CommonUtil.dsTransData.dtUserData.EmpNo;
                        dsRentalContract.dtTbt_RentalSecurityBasic.Add(rentalSecurityBasicData);

                        //dtTbt_RentalBEDetails
                        if (registerStopData.RegisterStopData.dtTbt_RentalBEDetails != null && registerStopData.RegisterStopData.dtTbt_RentalBEDetails.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalBEDetails = new List <tbt_RentalBEDetails>();
                            tbt_RentalBEDetails rentalBEDetailsData;
                            foreach (tbt_RentalBEDetails data in registerStopData.RegisterStopData.dtTbt_RentalBEDetails)
                            {
                                rentalBEDetailsData     = CommonUtil.CloneObject <tbt_RentalBEDetails, tbt_RentalBEDetails>(data);
                                rentalBEDetailsData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalBEDetails.Add(rentalBEDetailsData);
                            }
                        }

                        //dtTbt_RentalInstrumentDetails
                        if (registerStopData.RegisterStopData.dtTbt_RentalInstrumentDetails != null && registerStopData.RegisterStopData.dtTbt_RentalInstrumentDetails.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalInstrumentDetails = new List <tbt_RentalInstrumentDetails>();
                            tbt_RentalInstrumentDetails rentalInstrumentDetailsData;
                            foreach (tbt_RentalInstrumentDetails data in registerStopData.RegisterStopData.dtTbt_RentalInstrumentDetails)
                            {
                                rentalInstrumentDetailsData     = CommonUtil.CloneObject <tbt_RentalInstrumentDetails, tbt_RentalInstrumentDetails>(data);
                                rentalInstrumentDetailsData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalInstrumentDetails.Add(rentalInstrumentDetailsData);
                            }
                        }

                        //dtTbt_RentalMaintenanceDetails
                        if (registerStopData.RegisterStopData.dtTbt_RentalMaintenanceDetails != null && registerStopData.RegisterStopData.dtTbt_RentalMaintenanceDetails.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalMaintenanceDetails = new List <tbt_RentalMaintenanceDetails>();
                            tbt_RentalMaintenanceDetails rentalMaintenanceDetailsData;
                            foreach (tbt_RentalMaintenanceDetails data in registerStopData.RegisterStopData.dtTbt_RentalMaintenanceDetails)
                            {
                                rentalMaintenanceDetailsData     = CommonUtil.CloneObject <tbt_RentalMaintenanceDetails, tbt_RentalMaintenanceDetails>(data);
                                rentalMaintenanceDetailsData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalMaintenanceDetails.Add(rentalMaintenanceDetailsData);
                            }
                        }

                        //dtTbt_RentalOperationType
                        if (registerStopData.RegisterStopData.dtTbt_RentalOperationType != null && registerStopData.RegisterStopData.dtTbt_RentalOperationType.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalOperationType = new List <tbt_RentalOperationType>();
                            tbt_RentalOperationType rentalOperationTypeData;
                            foreach (tbt_RentalOperationType data in registerStopData.RegisterStopData.dtTbt_RentalOperationType)
                            {
                                rentalOperationTypeData     = CommonUtil.CloneObject <tbt_RentalOperationType, tbt_RentalOperationType>(data);
                                rentalOperationTypeData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalOperationType.Add(rentalOperationTypeData);
                            }
                        }

                        //dtTbt_RentalSentryGuard
                        if (registerStopData.RegisterStopData.dtTbt_RentalSentryGuard != null && registerStopData.RegisterStopData.dtTbt_RentalSentryGuard.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalSentryGuard = new List <tbt_RentalSentryGuard>();
                            tbt_RentalSentryGuard rentalSentryGuardData;
                            foreach (tbt_RentalSentryGuard data in registerStopData.RegisterStopData.dtTbt_RentalSentryGuard)
                            {
                                rentalSentryGuardData     = CommonUtil.CloneObject <tbt_RentalSentryGuard, tbt_RentalSentryGuard>(data);
                                rentalSentryGuardData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalSentryGuard.Add(rentalSentryGuardData);
                            }
                        }

                        //dtTbt_RentalSentryGuardDetails
                        if (registerStopData.RegisterStopData.dtTbt_RentalSentryGuardDetails != null && registerStopData.RegisterStopData.dtTbt_RentalSentryGuardDetails.Count > 0)
                        {
                            dsRentalContract.dtTbt_RentalSentryGuardDetails = new List <tbt_RentalSentryGuardDetails>();
                            tbt_RentalSentryGuardDetails rentalSentryGuardDetailsData;
                            foreach (tbt_RentalSentryGuardDetails data in registerStopData.RegisterStopData.dtTbt_RentalSentryGuardDetails)
                            {
                                rentalSentryGuardDetailsData     = CommonUtil.CloneObject <tbt_RentalSentryGuardDetails, tbt_RentalSentryGuardDetails>(data);
                                rentalSentryGuardDetailsData.OCC = strOCC;
                                dsRentalContract.dtTbt_RentalSentryGuardDetails.Add(rentalSentryGuardDetailsData);
                            }
                        }

                        //dtTbt_RelationType
                        if (registerStopData.RegisterStopData.dtTbt_RelationType != null && registerStopData.RegisterStopData.dtTbt_RelationType.Count > 0)
                        {
                            dsRentalContract.dtTbt_RelationType = new List <tbt_RelationType>();
                            tbt_RelationType relationTypeData;
                            foreach (tbt_RelationType data in registerStopData.RegisterStopData.dtTbt_RelationType)
                            {
                                relationTypeData     = CommonUtil.CloneObject <tbt_RelationType, tbt_RelationType>(data);
                                relationTypeData.OCC = strOCC;
                                dsRentalContract.dtTbt_RelationType.Add(relationTypeData);
                            }
                        }
                        /*---------------------------*/

                        //Save stop service contract data
                        //dsRentalContractData dsRentalContractResult = rentralHandler.InsertEntireContract(dsRentalContract);
                        rentralHandler.InsertEntireContractForCTS010(dsRentalContract);

#if !ROUND2
                        //Send billing data
                        billingHandler = ServiceContainer.GetService <IBillingInterfaceHandler>() as IBillingInterfaceHandler;
                        billingHandler.SendBilling_StopService(
                            registerStopData.InitialData.ContractCode,
                            doStopReason.ChangeImplementDate.Value,
                            doStopReason.ContractFeeOnStop);
#endif

                        //Delete maintenance check-up schedule
                        maintenHandler = ServiceContainer.GetService <IMaintenanceHandler>() as IMaintenanceHandler;
                        List <tbt_MaintenanceCheckupDetails> tbt_MaintenanceCheckupDetailsList = maintenHandler.DeleteMACheckupDetail(registerStopData.InitialData.ContractCode, doStopReason.ChangeImplementDate.Value);
                        List <tbt_MaintenanceCheckup>        tbt_MaintenanceCheckupList        = maintenHandler.DeleteMACheckup(registerStopData.InitialData.ContractCode, doStopReason.ChangeImplementDate.Value);
                    }
                    /*--------------------------*/

                    scope.Complete();
                    res.ResultData = new object[] { MessageUtil.GetMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0046), sParam.ContractCode };
                }
            }
            catch (Exception ex)
            {
                res.AddErrorMessage(ex);
            }

            return(Json(res));
        }
        /// <summary>
        /// Validate business when click [Register] button in ‘Action button’ section
        /// </summary>
        /// <param name="doStopReason"></param>
        /// <returns></returns>
        public ActionResult CTS100_RegisterStopData(CTS100_doStopReason doStopReason)
        {
            ObjectResultData res = new ObjectResultData();

            try
            {
                //CheckSystemStatus
                if (CheckIsSuspending(res) == true)
                {
                    return(Json(res));
                }

                //Check screen permission
                if (CheckUserPermission(ScreenID.C_SCREEN_ID_CP13, FunctionID.C_FUNC_ID_OPERATE) == false)
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0053);
                    return(Json(res));
                }


                CTS100_ScreenParameter sParam = GetScreenObject <CTS100_ScreenParameter>();

                //CheckMandatory
                res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                if (ModelState.IsValid == false)
                {
                    CTS100_doStopReason doStopReasonTemp = CommonUtil.CloneObject <CTS100_doStopReason, CTS100_doStopReason>(doStopReason);
                    if (sParam.CTS100_Session.InitialData.HasStopFee == 0)
                    {
                        doStopReasonTemp.ContractFeeOnStopCurrencyType = SECOM_AJIS.Common.Util.ConstantValue.CurrencyUtil.C_CURRENCY_LOCAL;
                        doStopReasonTemp.ContractFeeOnStop             = 0;
                    }

                    ValidatorUtil.BuildErrorMessage(res, new object[] { doStopReasonTemp }, null, false);
                }
                if (res.IsError)
                {
                    return(Json(res));
                }

                //ValidateScreenBusiness
                ValidateScreenBusiness_CTS100(res, doStopReason);
                if (res.IsError)
                {
                    return(Json(res));
                }

                //ValidateDataBusiness
                ValidateBusiness_CTS100(res, sParam.CTS100_Session.InitialData.ContractCode);
                if (res.IsError)
                {
                    return(Json(res));
                }

                //ValidateBusinessForWarning
                //res.MessageType = MessageModel.MESSAGE_TYPE.INFORMATION;
                if (doStopReason.ExpectedResumeDate >= ((DateTime)doStopReason.ChangeImplementDate).AddMonths(6))
                {
                    res.MessageType = MessageModel.MESSAGE_TYPE.WARNING_DIALOG_LIST;
                    res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3159);
                    //return Json(res);
                }

                res.ResultData = true;
            }
            catch (Exception ex)
            {
                res.AddErrorMessage(ex);
            }

            return(Json(res));
        }