/// <summary>
        /// Check data authority
        /// </summary>
        /// <param name="dtContractDocReceive"></param>
        /// <returns></returns>
        private bool CTS190_CheckDataAuthority(dtContractDocHeader dtContractDocReceive)
        {
            bool hasAuthority = false;

            // Old
            //List<OfficeDataDo> list = (from p in CommonUtil.dsTransData.dtOfficeData
            //                           where p.OfficeCode == dtContractDocReceive.ContractOfficeCode ||
            //                                 p.OfficeCode == dtContractDocReceive.OperationOfficeCode
            //                           select p).ToList<OfficeDataDo>();

            //hasAuthority = (list.Count > 0);

            IRentralContractHandler handlerRC   = ServiceContainer.GetService <IRentralContractHandler>() as IRentralContractHandler;
            ISaleContractHandler    handlerSale = ServiceContainer.GetService <ISaleContractHandler>() as ISaleContractHandler;
            // get RCB
            List <tbt_RentalContractBasic> dtRCB = handlerRC.GetTbt_RentalContractBasic(dtContractDocReceive.ContractCode, null);
            // get Sale basic
            List <tbt_SaleBasic> dtSB = handlerSale.GetTbt_SaleBasic(dtContractDocReceive.ContractCode, null, true);


            List <OfficeDataDo> list = new List <OfficeDataDo>();

            if (dtRCB.Count > 0)
            {
                list = (from p in CommonUtil.dsTransData.dtOfficeData
                        where p.OfficeCode == dtRCB[0].ContractOfficeCode ||
                        p.OfficeCode == dtRCB[0].OperationOfficeCode
                        select p).ToList <OfficeDataDo>();
            }
            else if (dtSB.Count > 0)
            {
                list = (from p in CommonUtil.dsTransData.dtOfficeData
                        where p.OfficeCode == dtSB[0].ContractOfficeCode ||
                        p.OfficeCode == dtSB[0].OperationOfficeCode
                        select p).ToList <OfficeDataDo>();
            }

            hasAuthority = (list.Count > 0);

            return(hasAuthority);
        }
        /// <summary>
        /// Register data
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private bool CTS190_Register(dtContractDocHeader dt)
        {
            List <tbt_ContractDocument> lsInsert = null; //Add by Jutarat A. on 12032013
            List <tbt_ContractDocument> dtUpdate = null; //Add by Jutarat A. on 12032013

            try
            {
                IContractDocumentHandler handlerCD = ServiceContainer.GetService <IContractDocumentHandler>() as IContractDocumentHandler;

                if (dt.IsCreateFlag)
                {
                    // **tt** Create dt tbt_ContractDocument and update some field follow DDS (in case create)
                    tbt_ContractDocument dtInsert = new tbt_ContractDocument();

                    dtInsert.ContractCode        = dt.ContractCode;
                    dtInsert.OCC                 = dt.OCC;
                    dtInsert.DocumentCode        = dt.DocumentCode;
                    dtInsert.ContractOfficeCode  = dt.ContractOfficeCode;
                    dtInsert.OperationOfficeCode = dt.OperationOfficeCode;
                    dtInsert.DocStatus           = dt.DocStatus;
                    dtInsert.DocAuditResult      = dt.DocAuditResult;
                    dtInsert.CollectDocDate      = dt.CollectDocDate;
                    dtInsert.IssuedDate          = dt.IssuedDate;



                    // Generate new Doc OCC
                    string newDocOCC = "";
                    newDocOCC = handlerCD.GenerateDocOCC(dt.ContractCode, dt.OCC);

                    dtInsert.ContractDocOCC = newDocOCC;
                    dtInsert.DocNo          = string.Format("{0}-{1}-{2}", dt.ContractCode, dt.OCC, newDocOCC);

                    // Keep back
                    dt.DocNo = string.Format("{0}-{1}-{2}", dt.ContractCode, dt.OCC, newDocOCC);

                    //List<tbt_ContractDocument> lsInsert = new List<tbt_ContractDocument>();
                    lsInsert = new List <tbt_ContractDocument>(); //Modify by Jutarat A. on 12032013
                    lsInsert.Add(dtInsert);

                    // Insert : InsertTbt_ContractDocument **
                    handlerCD.InsertTbt_ContractDocument(lsInsert);

                    // Call UpdateContractBasic
                    CTS190_UpdateContractBasicData(lsInsert);
                }
                else
                {
                    // **tt**  Get dt tbt_ContractDocument  from handler and update some field follow DDS (in case update)
                    //List<tbt_ContractDocument> dtUpdate = new List<tbt_ContractDocument>();
                    dtUpdate = new List <tbt_ContractDocument>(); //Modify by Jutarat A. on 12032013

                    if (dt.IsContractFlag.Value == true)
                    {
                        dtUpdate = handlerCD.GetContractDocHeaderByContractCode(dt.ContractCode, dt.OCC, dt.ContractDocOCC);
                    }
                    else
                    {
                        dtUpdate = handlerCD.GetContractDocHeaderByQuotationCode(dt.QuotationTargetCode, dt.Alphabet, dt.ContractDocOCC);
                    }

                    if (dtUpdate.Count == 0)
                    {
                        return(false);
                    }


                    for (int i = 0; i < dtUpdate.Count; i++)
                    {
                        dtUpdate[i].DocStatus      = dt.DocStatus;
                        dtUpdate[i].DocAuditResult = dt.DocAuditResult;
                        dtUpdate[i].CollectDocDate = dt.CollectDocDate;
                    }

                    if (dtUpdate.Count > 1)
                    {
                        dtUpdate.RemoveRange(1, dtUpdate.Count - 1);
                    }

                    // Keep back
                    dt.DocNo = dtUpdate[0].DocNo;



                    // Set Not user status
                    int isUpdated = handlerCD.SetNotUsedStatus(dtUpdate[0].ContractCode, dtUpdate[0].OCC, ContractDocStatus.C_CONTRACT_DOC_STATUS_NOT_USED, ContractDocStatus.C_CONTRACT_DOC_STATUS_COLLECTED, false, null);

                    // Update : UpdateTbt_ContractDocument **
                    List <tbt_ContractDocument> tt_Updated = handlerCD.UpdateTbt_ContractDocument(dtUpdate);

                    // Call UpdateContractBasic
                    CTS190_UpdateContractBasicData(dtUpdate);

                    // Update RentalSecurityBasic
                    CTS190_UpdateRentalSecurityBasic(dtUpdate);

                    // Update SalesBasic
                    CTS190_UpdateSaleBasic(dtUpdate);

                    // Update about PO (Recursive)
                    if (dt.DocumentCode == DocumentCode.C_DOCUMENT_CODE_CONTRACT_EN || dt.DocumentCode == DocumentCode.C_DOCUMENT_CODE_CONTRACT_TH)
                    {
                        List <tbt_ContractDocument> dtContractDoc = handlerCD.GetContractDocHeaderByContractCode(dt.ContractCode, ParticularOCC.C_PARTICULAR_OCC_PO, null);

                        if (dtContractDoc.Count == 0)
                        {
                            dtContractDocHeader dtPO = new dtContractDocHeader();
                            dtPO.IsCreateFlag   = true;
                            dtPO.IsContractFlag = false;

                            dtPO.ContractCode        = dtUpdate[0].ContractCode;
                            dtPO.OCC                 = ParticularOCC.C_PARTICULAR_OCC_PO;
                            dtPO.DocumentCode        = DocumentCode.C_DOCUMENT_CODE_PO;
                            dtPO.ContractOfficeCode  = dtUpdate[0].ContractOfficeCode;
                            dtPO.OperationOfficeCode = dtUpdate[0].OperationOfficeCode;
                            dtPO.IssuedDate          = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                            dtPO.DocStatus           = ContractDocStatus.C_CONTRACT_DOC_STATUS_ISSUED;
                            dtPO.DocAuditResult      = DocAuditResult.C_DOC_AUDIT_RESULT_NO_NEED_TO_RECEIVE;

                            // Recursive
                            CTS190_Register(dtPO);
                        }
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                //Add by Jutarat A. on 12032013
                string source    = "SIMS web application";
                string logName   = "(CTS190)Application";
                string logDetail = ex.ToString();

                if (!EventLog.SourceExists(source))
                {
                    EventLog.CreateEventSource(source, logName);
                }

                if (lsInsert != null && lsInsert.Count > 0)
                {
                    logDetail = String.Format("{0} : {1}", ex.ToString(), CommonUtil.ConvertToXml_Store <tbt_ContractDocument>(lsInsert));
                }
                else if (dtUpdate != null && dtUpdate.Count > 0)
                {
                    logDetail = String.Format("{0} : {1}", ex.ToString(), CommonUtil.ConvertToXml_Store <tbt_ContractDocument>(dtUpdate));
                }

                EventLog objLog = new EventLog();
                objLog.Source = source;
                objLog.Log    = logName;
                objLog.WriteEntry(logDetail, EventLogEntryType.Error);
                //End Add

                throw ex;
            }
        }
        /// <summary>
        /// Add received contract document
        /// </summary>
        /// <param name="cond"></param>
        /// <returns></returns>
        public ActionResult CTS190_AddReceivedContractDoc(CTS190_ScreenParameter cond)
        {
            ObjectResultData res = new ObjectResultData();

            res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
            CommonUtil cm = new CommonUtil();

            IMasterHandler handlerMaster = ServiceContainer.GetService <IMasterHandler>() as IMasterHandler;
            List <dtDocumentTemplateByDocumentCode> listDocTemplate = new List <dtDocumentTemplateByDocumentCode>();

            string contracCode;
            string quotationTargetCode;

            try
            {
                ICommonContractHandler     handler = ServiceContainer.GetService <ICommonContractHandler>() as ICommonContractHandler;
                List <dtContractDocHeader> list    = new List <dtContractDocHeader>();

                contracCode         = cm.ConvertContractCode(cond.ContractCode_QuotationTargetCode, CommonUtil.CONVERT_TYPE.TO_LONG);
                quotationTargetCode = cm.ConvertQuotationTargetCode(cond.ContractCode_QuotationTargetCode, CommonUtil.CONVERT_TYPE.TO_LONG);


                // Check required field.
                if (ModelState.IsValid == false)
                {
                    ValidatorUtil.BuildErrorMessage(res, this);
                    if (res.IsError)
                    {
                        return(Json(res));
                    }
                }

                // Business check 1
                if (cond.OCC_Alphabet == null)
                {
                    cond.OCC_Alphabet = string.Empty;
                }

                if (!(cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_PO.ToUpper()))
                //|| cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_START_CONFIRM_LETTER.ToUpper())) //Comment by Jutarat A. on 22042013
                {
                    //Then Check "Contract document OCC" field
                    // ---> Then show message at warning section (MSG3234: Please specify contract document occurrence)

                    if (CommonUtil.IsNullOrEmpty(cond.ContractDocOCC) == true)
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3234, null, new string[] { "ContractDocOCC" });
                        return(Json(res));
                    }
                }


                // Business check 2
                if (CommonUtil.IsNullOrEmpty(cond.ContractDocOCC) == true) // Not fill ContractDocOCC
                {
                    if (!(cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_PO.ToUpper()))
                    //|| cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_START_CONFIRM_LETTER.ToUpper())) //Comment by Jutarat A. on 22042013
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0001);
                        return(Json(res));
                    }

                    //#region Check billing basic data

                    //if (cond.OCC_Alphabet.ToUpper().CompareTo(ParticularOCC.C_PARTICULAR_OCC_MIN_BILLING_MEMO.ToUpper()) >= 0
                    //        && cond.OCC_Alphabet.ToUpper().CompareTo(ParticularOCC.C_PARTICULAR_OCC_MAX_BILLING_MEMO.ToUpper()) <= 0)
                    //{
                    //    string occ = cond.OCC_Alphabet.Trim();
                    //    if (occ.Length > 2)
                    //        occ = occ.Substring(occ.Length - 2);

                    //    IBillingHandler bhandler = ServiceContainer.GetService<IBillingHandler>() as IBillingHandler;
                    //    doTbt_BillingBasic bs = bhandler.GetBillingBasicData(contracCode.Trim(), occ, null, null, null);
                    //    if (bs == null)
                    //    {
                    //        res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3242);
                    //        return Json(res);
                    //    }
                    //}

                    //#endregion

                    list = handler.GetContractDocHeader(contracCode.Trim(), quotationTargetCode.Trim(), cond.OCC_Alphabet.Trim(), cond.ContractDocOCC);

                    if (list.Count == 0) // not found ! (ContractDoc Header)
                    {
                        //Comment by Jutarat A. on 22042013
                        //if (cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_START_CONFIRM_LETTER.ToUpper())
                        //{
                        //    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0001);
                        //    return Json(res);
                        //}
                        //End Comment

                        IRentralContractHandler        handlerRental = ServiceContainer.GetService <IRentralContractHandler>() as IRentralContractHandler;
                        List <tbt_RentalContractBasic> rentalList    = handlerRental.GetTbt_RentalContractBasic(contracCode, null);

                        if (rentalList.Count == 0)
                        {
                            res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0001);
                            return(Json(res));
                        }
                        else
                        {
                            // Create dt !!

                            dtContractDocHeader dt = new dtContractDocHeader();
                            dt.ContractCode = contracCode.ToUpper();
                            dt.OCC          = cond.OCC_Alphabet.Trim().ToUpper();
                            if (cond.OCC_Alphabet.Trim().ToUpper() == ParticularOCC.C_PARTICULAR_OCC_PO.ToUpper())
                            {
                                dt.DocumentCode = DocumentCode.C_DOCUMENT_CODE_PO;
                            }
                            //else
                            //{
                            //    dt.DocumentCode = DocumentCode.C_DOCUMENT_CODE_CHANGE_PAYMENT_MEMO;
                            //}


                            listDocTemplate = handlerMaster.GetDocumentTemplateByDocumentCode(dt.DocumentCode);

                            if (listDocTemplate.Count > 0)
                            {
                                dt.DocumentNameEN = listDocTemplate[0].DocumentNameEN;
                                dt.DocumentNameJP = listDocTemplate[0].DocumentNameJP;
                                dt.DocumentNameLC = listDocTemplate[0].DocumentNameLC;
                            }

                            dt.ContractOfficeCode  = rentalList[0].ContractOfficeCode;
                            dt.OperationOfficeCode = rentalList[0].OperationOfficeCode;
                            dt.DocStatus           = ContractDocStatus.C_CONTRACT_DOC_STATUS_COLLECTED;
                            dt.DocAuditResult      = cond.DocAuditResult;
                            dt.CollectDocDate      = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;

                            // extra field
                            dt.ContractCode_QuotationTargetCode = contracCode.ToUpper();
                            dt.OCC_Alphabet = cond.OCC_Alphabet.Trim().ToUpper();


                            dt.IsCreateFlag   = true; //***
                            dt.IsContractFlag = true; //***

                            list.Clear();
                            list.Add(dt);
                        }
                    }
                    else  // Found !! (ContractDoc Header)
                    {
                        // Update dt !!

                        list[0].IsCreateFlag   = false; // is updated
                        list[0].DocStatus      = ContractDocStatus.C_CONTRACT_DOC_STATUS_COLLECTED;
                        list[0].DocAuditResult = cond.DocAuditResult;
                        list[0].CollectDocDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                    }
                }
                else // ContractDocOCC is filled
                {
                    list = handler.GetContractDocHeader(contracCode.Trim(), quotationTargetCode.Trim(), cond.OCC_Alphabet.Trim(), cond.ContractDocOCC.Trim());

                    if (list.Count > 0)
                    {
                        // get Document templete for get "ReportFlag"
                        listDocTemplate = handlerMaster.GetDocumentTemplateByDocumentCode(list[0].DocumentCode);

                        if (listDocTemplate.Count == 0)
                        {
                            res.MessageType = MessageModel.MESSAGE_TYPE.INFORMATION;
                            res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0111, new string[] { "Document Template is not found." }, null);
                            return(Json(res));
                        }

                        // Business check
                        if (CommonUtil.IsNullOrEmpty(list[0].ContractCode) == true)
                        {
                            res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3160);
                            return(Json(res));
                        }
                        // Business check
                        if (listDocTemplate[0].ReportFlag == true)
                        {
                            if (list[0].DocStatus == ContractDocStatus.C_CONTRACT_DOC_STATUS_NOT_ISSUED || list[0].IssuedDate.HasValue == false)
                            {
                                res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3179);
                                return(Json(res));
                            }
                        }
                        else
                        {
                            if (list[0].DocStatus == ContractDocStatus.C_CONTRACT_DOC_STATUS_NOT_ISSUED)
                            {
                                res.AddErrorMessage(MessageUtil.MODULE_CONTRACT, MessageUtil.MessageList.MSG3179);
                                return(Json(res));
                            }
                        }


                        // Update dt !!

                        list[0].IsCreateFlag   = false; // is updated
                        list[0].DocStatus      = ContractDocStatus.C_CONTRACT_DOC_STATUS_COLLECTED;
                        list[0].DocAuditResult = cond.DocAuditResult;
                        list[0].CollectDocDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                    }
                }


                if (list.Count > 0)
                {
                    // CheckDataAuthority
                    if (CTS190_CheckDataAuthority(list[0]) == false)
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0063);
                        return(Json(res));
                    }
                }
                else
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0001);
                    return(Json(res));
                }


                CommonUtil.MappingObjectLanguage <dtContractDocHeader>(list);
                MiscTypeMappingList miscList = new MiscTypeMappingList();
                miscList.AddMiscType(list.ToArray());

                ICommonHandler comHandler = ServiceContainer.GetService <ICommonHandler>() as ICommonHandler;
                comHandler.MiscTypeMappingList(miscList);


                if (list.Count > 0)
                {
                    if (list[0].IsContractFlag.Value)
                    {
                        list[0].ContractCode_QuotationTargetCode = cm.ConvertContractCode(list[0].ContractCode_QuotationTargetCode, CommonUtil.CONVERT_TYPE.TO_SHORT);
                    }
                    else
                    {
                        list[0].ContractCode_QuotationTargetCode = cm.ConvertQuotationTargetCode(list[0].ContractCode_QuotationTargetCode, CommonUtil.CONVERT_TYPE.TO_SHORT);
                    }

                    string myContractCode        = cm.ConvertContractCode(list[0].ContractCode, CommonUtil.CONVERT_TYPE.TO_SHORT);
                    string myOCC                 = list[0].OCC;
                    string myQuotationTargetCode = cm.ConvertQuotationTargetCode(list[0].QuotationTargetCode, CommonUtil.CONVERT_TYPE.TO_SHORT);
                    string myAlphabet            = list[0].Alphabet;

                    string myDocOCC = list[0].ContractDocOCC;
                    if (cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_PO.ToUpper())
                    {
                        //|| cond.OCC_Alphabet.ToUpper() == ParticularOCC.C_PARTICULAR_OCC_START_CONFIRM_LETTER.ToUpper()) //Comment by Jutarat A. on 22042013
                        myDocOCC = "";
                    }

                    // Update my_checked_id_by_ct , my_checked_id_by_quo , my_checked_id
                    list[0].my_checked_id_by_ct  = string.Format("{0}-{1}-{2}", myContractCode, myOCC, myDocOCC).ToUpper();
                    list[0].my_checked_id_by_quo = string.Format("{0}-{1}-{2}", myQuotationTargetCode, myAlphabet, myDocOCC).ToUpper();
                    list[0].my_checked_id        = string.Format("{0}-{1}", list[0].my_checked_id_by_ct, list[0].my_checked_id_by_quo).ToUpper();
                    res.ResultData = list[0];
                }



                return(Json(res));
            }
            catch (Exception ex)
            {
                res.MessageType = MessageModel.MESSAGE_TYPE.INFORMATION;
                res.AddErrorMessage(ex);
                return(Json(res));
            }
        }