private ClientAPI ResolveUri(APICallSignature callSig)
        {
            string    uri       = "";
            ClientAPI clientApi = new ClientAPI();
            var       repo      = new RepositoryFactory().CreateClientAPIRepository();

            switch (callSig.CallObjCode)
            {
            case "JE":    //Journal Entry
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "JE" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "GI":    //Goods Issue
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "GI" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "GR":    //Goods Receipt
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "GR" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "ITM":    //item
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "ITM" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "BP":    //Business Partner
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "BP" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "GL":    //Gl Account
                clientApi = repo.Get(x => x.Action.ToUpper() == callSig.Action.ToUpper() && x.SboTransactionType.ToUpper() == "GL" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;
            }

            return(clientApi);
        }
        private ClientAPI ResolveUri(APICallSignature callSig)
        {
            string    uri       = "";
            ClientAPI clientApi = new ClientAPI();
            var       repo      = new RepositoryFactory().CreateClientAPIRepository();

            switch (callSig.CallObjCode)
            {
            case "30":    //Journal Entry
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "30" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S"?0:1)).Include("Params").FirstOrDefault();
                break;

            case "60":    //Goods Issue
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "60" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "59":    //Goods Receipt
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "59" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "4":    //item
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "4" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "2":    //Business Partner
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "2" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;

            case "1":    //Gl Account
                clientApi = repo.Get(x => x.Action == callSig.Action && x.SboTransactionType == "1" && x.ValueType == (PostDataValueType)(callSig.ValueType == "S" ? 0 : 1)).Include("Params").FirstOrDefault();
                break;
            }

            return(clientApi);
        }
        private object ResolveObject(APICallSignature callSig)
        {
            object obj = null;

            Task.Run(async() => {
                switch (callSig.CallObjCode)
                {
                case "30":
                    var journalRepo = new sbo.fx.Factories.RepositoryFactory().JournalRepository();
                    obj             = await journalRepo.GetByTransId(int.Parse(callSig.CallKey));
                    break;

                case "60":
                    var inventoryOutRepo = new sbo.fx.Factories.RepositoryFactory().InventoryTransactionRepository();
                    obj = await inventoryOutRepo.GetTransactionByDocNo(int.Parse(callSig.CallKey), InventoryType.Out);
                    break;

                case "59":
                    var inventoryInRepo = new sbo.fx.Factories.RepositoryFactory().InventoryTransactionRepository();
                    obj = await inventoryInRepo.GetTransactionByDocNo(int.Parse(callSig.CallKey), InventoryType.In);
                    break;

                case "4":
                    var itemRepo = new sbo.fx.Factories.RepositoryFactory().ItemRepository();
                    obj          = await itemRepo.GetItemByItemCode(callSig.CallKey);
                    break;

                case "2":
                    var bpRepo = new sbo.fx.Factories.RepositoryFactory().BusinessPartnerRepository();
                    obj        = await bpRepo.GetByCardCode(callSig.CallKey);
                    break;

                case "1":
                    var glRepo = new sbo.fx.Factories.RepositoryFactory().GlAccountRepository();
                    obj        = await glRepo.GetByAccountCode(callSig.CallKey);
                    break;
                }
            });

            return(obj);
        }
        public async Task <IHttpActionResult> InvokeDomainEndPoint(APICallSignature callSig)
        {
            try
            {
                ClientAPI clientApi = ResolveUri(callSig);
                object    obj       = ResolveObject(callSig);
                string    errorMsg  = "";

                if (obj == null)
                {
                    errorMsg = "Object is null";
                    var resp = new HttpResponseMessage(HttpStatusCode.NotFound);
                    resp.Content      = new StringContent(errorMsg);
                    resp.ReasonPhrase = "Object not found.";
                    throw new HttpResponseException(resp);
                }

                if (string.IsNullOrEmpty(clientApi.URL))
                {
                    errorMsg = "URL invalid";
                    var resp = new HttpResponseMessage(HttpStatusCode.NotFound);
                    resp.Content      = new StringContent(errorMsg);
                    resp.ReasonPhrase = "No API.";
                    throw new HttpResponseException(resp);
                }


                await InvokeClientAPI(obj, clientApi.URL, clientApi.SboTransactionType);

                return(Ok("Success"));
            }
            catch (HttpResponseException ex)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }
        }
        private object ResolveObject(APICallSignature callSig)
        {
            try
            {
                object obj = null;
                Task.Run(async() => {
                    switch (callSig.CallObjCode)
                    {
                    case "JE":
                        var journalRepo = new sbo.fx.Factories.RepositoryFactory().JournalRepository();
                        journalRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await journalRepo.GetByTransIdForRDPosting(int.Parse(callSig.CallKey));
                        }
                        break;

                    case "GI":
                        var inventoryOutRepo = new sbo.fx.Factories.RepositoryFactory().InventoryTransactionRepository();
                        inventoryOutRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await inventoryOutRepo.GetTransactionByDocNo(int.Parse(callSig.CallKey), InventoryType.Out);
                        }
                        break;

                    case "GR":
                        var inventoryInRepo = new sbo.fx.Factories.RepositoryFactory().InventoryTransactionRepository();
                        inventoryInRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await inventoryInRepo.GetTransactionByDocNo(int.Parse(callSig.CallKey), InventoryType.In);
                        }
                        break;

                    case "ITM":
                        var itemRepo = new sbo.fx.Factories.RepositoryFactory().ItemRepository();
                        itemRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await itemRepo.GetItemByItemCode(callSig.CallKey);
                        }
                        break;

                    case "BP":
                        var bpRepo = new sbo.fx.Factories.RepositoryFactory().BusinessPartnerRepository();
                        bpRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await bpRepo.GetByCardCode(callSig.CallKey);
                        }
                        break;

                    case "GL":
                        var glRepo = new sbo.fx.Factories.RepositoryFactory().GlAccountRepository();
                        glRepo.InitRepository(GlobalInstance.Instance.SboComObject, GlobalInstance.Instance.SqlObject);
                        if (GlobalInstance.Instance.SqlObject.State == System.Data.ConnectionState.Closed)
                        {
                            GlobalInstance.Instance.SqlObject.Open();
                        }
                        if (GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Broken || GlobalInstance.Instance.SqlObject.State != System.Data.ConnectionState.Closed)
                        {
                            obj = await glRepo.GetByAccountCode(callSig.CallKey);
                        }
                        break;
                    }
                }).Wait();

                return(obj);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }