// POST: api/WealthPlanTarget
        //public void Post([FromBody]string value)
        //public WealthPlanTargetResponse Post([FromBody]string value)
        public WealthPlanTargetResponse Post(WealthPlanTarget wealthPlanTarget)
        {
            WealthPlanTargetPersistance wealthPlanTargetPersistance = new WealthPlanTargetPersistance();

            if (wealthPlanTargetPersistance == null)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
            }

            //WealthPlanTarget wealthPlanTarget = new WealthPlanTarget();

            return(wealthPlanTargetPersistance.GetWealthPlanTarget(wealthPlanTarget));
        }
Example #2
0
        //public ArrayList GetWealthPlanTarget(WealthPlanTarget wealthPlanTarget)
        public WealthPlanTargetResponse GetWealthPlanTarget(WealthPlanTarget wealthPlanTarget)
        {
            /*
             * OdbcConnection conn = null;
             * OdbcCommand command = null;
             * OdbcDataReader mySQLReader = null;
             */

            SqlConnection conn        = null;
            SqlCommand    command     = null;
            SqlDataReader mySQLReader = null;

            bool hasRows = false;

            string[] actions = { "A", "D", "U", "I" };

            var hash = System.Security.Cryptography.SHA512.Create();

            HttpContext httpContext = HttpContext.Current;
            string      authHeader  = httpContext.Request.Headers["Authorization"];

            //ArrayList proceedsArray = new ArrayList();
            List <Proceeds> proceedsArray    = new List <Proceeds>();
            List <Proceeds> proceedsArrayTmp = new List <Proceeds>();

            WealthPlanTargetResponse wealthPlanTargetResponse = new WealthPlanTargetResponse();

            wealthPlanTargetResponse.Message = "Not Found";
            wealthPlanTargetResponse.Status  = "Fail";

            wealthPlanTargetResponse.Amount_Needed        = wealthPlanTarget.Amount_Needed;
            wealthPlanTargetResponse.Investment_Period    = wealthPlanTarget.Investment_Period;
            wealthPlanTargetResponse.Initial_Investment   = wealthPlanTarget.Initial_Investment;
            wealthPlanTargetResponse.Investment_Per_Month = wealthPlanTarget.Investment_Per_Month;
            wealthPlanTargetResponse.Investment_Risk      = wealthPlanTarget.Investment_Risk;

            try
            {
                string myConnectionString = ConfigurationManager.ConnectionStrings["localDB"].ConnectionString;;
                //conn = new OleDbConnection(myConnectionString);
                conn = new SqlConnection(myConnectionString);

                conn.Open();

                //command = new OleDbCommand();
                command                = new SqlCommand();
                command.Connection     = conn;
                command.CommandTimeout = 0;

                //  ทำการเก็บ log ด้วย token
                //  ตอนนี้ยังไม่ต้องมี

                /*
                 * if (authHeader != null && authHeader.StartsWith("Bearer"))
                 * {
                 *  authHeader = authHeader.Substring("Bearer ".Length).Trim();
                 *
                 *  //--------------------------------  Insert Log   ----------------
                 *  command.CommandType = CommandType.Text;
                 *  command.CommandText = "insert into SrvA_Log_Cloud(AccessToken,AccessModule,Dt_Gen,Flag) values(?,'WealthPlanTarget',GETDATE(),1)";
                 *  command.Parameters.Clear();
                 *  command.Parameters.AddWithValue("@AccessToken", authHeader);
                 *  command.ExecuteNonQuery();
                 *
                 *  command.CommandType = CommandType.Text;
                 *  command.CommandText = "insert into SrvA_WealthPlanTarget_Log_Cloud(AccessToken,Amount_Needed,Investment_Period,Initial_Investment,Investment_Per_Month,Investment_Risk,Dt_Gen,Flag) values(?,'WealthPlanTarget',GETDATE(),1)";
                 *  command.Parameters.Clear();
                 *  command.Parameters.AddWithValue("@AccessToken", authHeader);
                 *  command.Parameters.AddWithValue("@Amount_Needed", wealthPlanTarget.Amount_Needed);
                 *  command.Parameters.AddWithValue("@Investment_Period", wealthPlanTarget.Investment_Period);
                 *  command.Parameters.AddWithValue("@Initial_Investment", wealthPlanTarget.Initial_Investment);
                 *  command.Parameters.AddWithValue("@Investment_Per_Month", wealthPlanTarget.Investment_Per_Month);
                 *  command.Parameters.AddWithValue("@Investment_Risk", wealthPlanTarget.Investment_Risk);
                 *  command.ExecuteNonQuery();
                 *  //--------------------------------  /Insert Log  ----------------
                 *
                 * }
                 */

                SqlParameter param = null;

                if (wealthPlanTarget.AccessToken == null || wealthPlanTarget.AccessToken.Trim() == "")
                {
                    //wealthPlan.AccessToken = "test2";    //for test only
                    //wealthPlan.WealthPlanName = "WealthPlan 1";    //for test only

                    wealthPlanTargetResponse.Message = "AccessToken can not be null or empty";
                    wealthPlanTargetResponse.Status  = "Fail";
                    return(wealthPlanTargetResponse);
                }   //  end if wealthPlanTarget.AccessToken == null

                if (wealthPlanTarget.WealthPlanTargetName == null || wealthPlanTarget.WealthPlanTargetName.Trim() == "")
                {
                    wealthPlanTargetResponse.Message = "WealthPlanTarget Name can not be null or empty";
                    wealthPlanTargetResponse.Status  = "Fail";
                    return(wealthPlanTargetResponse);
                }   //  end if wealthPlanTarget.WealthPlanName == null

                if (wealthPlanTarget.Action == null || wealthPlanTarget.Action.Trim() == "")
                {
                    wealthPlanTargetResponse.Message = "Action can not be null or empty";
                    wealthPlanTargetResponse.Status  = "Fail";
                    return(wealthPlanTargetResponse);
                }   //  end if wealthPlanTarget.Action == null

                if (!actions.Contains(wealthPlanTarget.Action.ToUpper()))
                {
                    wealthPlanTargetResponse.Message = "Action can not be null or empty or invalid";
                    wealthPlanTargetResponse.Status  = "Fail";
                    return(wealthPlanTargetResponse);
                }   //  end if wealthPlan.Action not in A,D,U,I

                //  start Main
                //--------------------------------  Check Access Token   ----------------

                //--------------------------------  Check Access Token   ----------------

                //--------------------------------  Insert Log   ----------------
                command.CommandType = CommandType.Text;
                command.CommandText = "insert into SrvA_Log_Cloud(AccessToken,AccessModule,Dt_Gen,Flag) values(@AccessToken,'WealthPlanTarget',GETDATE(),1)";

                command.Parameters.Clear();
                param = null;

                param           = new SqlParameter("@AccessToken", System.Data.SqlDbType.NVarChar, -1); //nvarchar(max)
                param.Value     = wealthPlanTarget.AccessToken == null ? "" : wealthPlanTarget.AccessToken.Trim();
                param.Direction = ParameterDirection.Input;
                command.Parameters.Add(param);

                command.ExecuteNonQuery();
                //--------------------------------  /Insert Log  ----------------

                //--------------------------------  Check WealthPlanTargetName  ----------------
                command.CommandType = CommandType.Text;
                command.CommandText = "select wpt.WealthPlanTargetName, li.Mobile_No from SrvA_WealthPlanTarget_Cloud wpt left join SrvA_Login_Cloud li on wpt.AccessToken = li.AccessToken and wpt.Flag = 1 where Mobile_No = (select top 1 Mobile_No from SrvA_Login_Cloud where Flag = 1 and AccessToken = @AccessToken) and wpt.WealthPlanTargetName = @WealthPlanTargetName";

                command.Parameters.Clear();
                param = null;

                param           = new SqlParameter("@AccessToken", System.Data.SqlDbType.NVarChar, -1); //nvarchar(max)
                param.Value     = wealthPlanTarget.AccessToken == null ? "" : wealthPlanTarget.AccessToken.Trim();
                param.Direction = ParameterDirection.Input;
                command.Parameters.Add(param);

                param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                param.Direction = ParameterDirection.Input;
                command.Parameters.Add(param);

                mySQLReader = command.ExecuteReader();

                if (mySQLReader.HasRows)
                {
                    hasRows = true;
                }

                while (mySQLReader.Read())
                {
                    //mySQLReader.GetString(mySQLReader.GetOrdinal("UnitHolder"));
                    //forgotResponse.Message = mySQLReader.GetDataTypeName(mySQLReader.GetOrdinal("Mobile_No"));
                    //forgotResponse.Message = mySQLReader.GetValue(mySQLReader.GetOrdinal("Mobile_No")).ToString();
                    wealthPlanTarget.Mobile_No = mySQLReader.GetString(mySQLReader.GetOrdinal("Mobile_No"));
                    //forgotResponse.Message = "Waiting for OTP";
                }

                mySQLReader.Close();
                //--------------------------------  /Check WealthPlanTargetName  ----------------

                switch (wealthPlanTarget.Action.ToUpper())
                {
                case "A":
                    if (hasRows)
                    {
                        wealthPlanTargetResponse.Message = "WealthPlanTargetName can not be duplicate";
                        wealthPlanTargetResponse.Status  = "Fail";
                    }
                    else
                    {
                        //--------------------------------  Insert WealthPlanTarget   ----------------
                        command.CommandType = CommandType.Text;
                        command.CommandText = "insert into SrvA_WealthPlanTarget_Cloud(AccessToken,WealthPlanTargetName,Amount_Needed,Investment_Period,Initial_Investment,Investment_Per_Month,Investment_Risk,Dt_Gen,Flag) values(@AccessToken,@WealthPlanTargetName,@Amount_Needed,@Investment_Period,@Initial_Investment,@Investment_Per_Month,@Investment_Risk,GETDATE(),1)";

                        command.Parameters.Clear();
                        param = null;

                        param           = new SqlParameter("@AccessToken", System.Data.SqlDbType.NVarChar, -1); //nvarchar(max)
                        param.Value     = wealthPlanTarget.AccessToken == null ? "" : wealthPlanTarget.AccessToken.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                        param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Amount_Needed", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Amount_Needed == null ? 0 : wealthPlanTarget.Amount_Needed;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Period", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Period == null ? 0 : wealthPlanTarget.Investment_Period;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Initial_Investment", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Initial_Investment == null ? 0 : wealthPlanTarget.Initial_Investment;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Per_Month", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Per_Month == null ? 0 : wealthPlanTarget.Investment_Per_Month;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Risk", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Risk == null ? 0 : wealthPlanTarget.Investment_Risk;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        command.ExecuteNonQuery();
                        //--------------------------------  /Insert WealthPlanTarget  ----------------
                        wealthPlanTargetResponse.Message = "Success";
                        wealthPlanTargetResponse.Status  = "OK";
                    }
                    break;

                case "U":
                    if (!hasRows)
                    {
                        wealthPlanTargetResponse.Message = "Can not find this name";
                        wealthPlanTargetResponse.Status  = "Fail";
                    }
                    else
                    {
                        //--------------------------------  Update WealthPlanTarget   ----------------
                        command.CommandType = CommandType.Text;
                        command.CommandText = "update SrvA_WealthPlanTarget_Cloud set Flag = 0 where WealthPlanTargetName = @WealthPlanTargetName and AccessToken in (select AccessToken from SrvA_Login_Cloud where Mobile_No = @Mobile_No)";

                        command.Parameters.Clear();
                        param = null;

                        param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                        param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Mobile_No", System.Data.SqlDbType.NVarChar, 20);
                        param.Value     = wealthPlanTarget.Mobile_No == null ? "" : wealthPlanTarget.Mobile_No.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        command.ExecuteNonQuery();
                        //--------------------------------  Update WealthPlanTarget   ----------------

                        //--------------------------------  Insert WealthPlanTarget   ----------------
                        command.CommandType = CommandType.Text;
                        command.CommandText = "insert into SrvA_WealthPlanTarget_Cloud(AccessToken,WealthPlanTargetName,Amount_Needed,Investment_Period,Initial_Investment,Investment_Per_Month,Investment_Risk,Dt_Gen,Flag) values(@AccessToken,@WealthPlanTargetName,@Amount_Needed,@Investment_Period,@Initial_Investment,@Investment_Per_Month,@Investment_Risk,GETDATE(),1)";

                        command.Parameters.Clear();
                        param = null;

                        param           = new SqlParameter("@AccessToken", System.Data.SqlDbType.NVarChar, -1); //nvarchar(max)
                        param.Value     = wealthPlanTarget.AccessToken == null ? "" : wealthPlanTarget.AccessToken.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                        param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Amount_Needed", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Amount_Needed == null ? 0 : wealthPlanTarget.Amount_Needed;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Period", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Period == null ? 0 : wealthPlanTarget.Investment_Period;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Initial_Investment", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Initial_Investment == null ? 0 : wealthPlanTarget.Initial_Investment;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Per_Month", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Per_Month == null ? 0 : wealthPlanTarget.Investment_Per_Month;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Investment_Risk", System.Data.SqlDbType.Float);
                        param.Value     = wealthPlanTarget.Investment_Risk == null ? 0 : wealthPlanTarget.Investment_Risk;
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        command.ExecuteNonQuery();
                        //--------------------------------  /Insert WealthPlanTarget  ----------------
                        wealthPlanTargetResponse.Message = "Success";
                        wealthPlanTargetResponse.Status  = "OK";
                    }
                    break;

                case "D":
                    if (!hasRows)
                    {
                        wealthPlanTargetResponse.Message = "Can not find this name";
                        wealthPlanTargetResponse.Status  = "Fail";
                    }
                    else
                    {
                        //--------------------------------  Delete WealthPlanTarget   ----------------
                        command.CommandType = CommandType.Text;
                        command.CommandText = "update SrvA_WealthPlanTarget_Cloud set Flag = 0 where WealthPlanTargetName = @WealthPlanTargetName and AccessToken in (select AccessToken from SrvA_Login_Cloud where Mobile_No = @Mobile_No)";

                        command.Parameters.Clear();
                        param = null;

                        param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                        param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Mobile_No", System.Data.SqlDbType.NVarChar, 20);
                        param.Value     = wealthPlanTarget.Mobile_No == null ? "" : wealthPlanTarget.Mobile_No.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        command.ExecuteNonQuery();
                        //--------------------------------  Delete WealthPlanTarget   ----------------
                        wealthPlanTargetResponse.Message = "Success";
                        wealthPlanTargetResponse.Status  = "OK";
                    }
                    break;

                case "I":

                    wealthPlanTargetResponse.Amount_Needed        = 0;
                    wealthPlanTargetResponse.Investment_Period    = 0;
                    wealthPlanTargetResponse.Initial_Investment   = 0;
                    wealthPlanTargetResponse.Investment_Per_Month = 0;
                    wealthPlanTargetResponse.Investment_Risk      = 0;

                    if (!hasRows)
                    {
                        wealthPlanTargetResponse.Message = "Data not found";
                        wealthPlanTargetResponse.Status  = "Fail";
                    }
                    else
                    {
                        /*
                         * List<WealthPlanTargetInfo> WealthPlanTargetinfo = new List<WealthPlanTargetInfo>();
                         *
                         * WealthPlanTargetInfo wpti = null;
                         */

                        //--------------------------------  Info WealthPlan   ----------------
                        command.CommandType = CommandType.Text;
                        command.CommandText = "select * from SrvA_WealthPlanTarget_Cloud where Flag = 1 and WealthPlanTargetName = @WealthPlanTargetName and AccessToken in (select AccessToken from SrvA_Login_Cloud where Mobile_No = @Mobile_No)";

                        command.Parameters.Clear();
                        param = null;

                        param           = new SqlParameter("@WealthPlanTargetName", System.Data.SqlDbType.NVarChar, 200);
                        param.Value     = wealthPlanTarget.WealthPlanTargetName == null ? "" : wealthPlanTarget.WealthPlanTargetName.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        param           = new SqlParameter("@Mobile_No", System.Data.SqlDbType.NVarChar, 20);
                        param.Value     = wealthPlanTarget.Mobile_No == null ? "" : wealthPlanTarget.Mobile_No.Trim();
                        param.Direction = ParameterDirection.Input;
                        command.Parameters.Add(param);

                        mySQLReader = command.ExecuteReader();

                        while (mySQLReader.Read())
                        {       /*
                                 * wpti = new WealthPlanTargetInfo();
                                 *
                                 * wealthPlanTarget.Amount_Needed = mySQLReader.GetDouble(mySQLReader.GetOrdinal("Amount_Needed"));
                                 * wpti.Amount_Needed = wealthPlanTarget.Amount_Needed;
                                 */
                            wealthPlanTargetResponse.Amount_Needed        = mySQLReader.GetDouble(mySQLReader.GetOrdinal("Amount_Needed"));
                            wealthPlanTargetResponse.Investment_Period    = mySQLReader.GetDouble(mySQLReader.GetOrdinal("Investment_Period"));
                            wealthPlanTargetResponse.Initial_Investment   = mySQLReader.GetDouble(mySQLReader.GetOrdinal("Initial_Investment"));
                            wealthPlanTargetResponse.Investment_Per_Month = mySQLReader.GetDouble(mySQLReader.GetOrdinal("Investment_Per_Month"));
                            wealthPlanTargetResponse.Investment_Risk      = mySQLReader.GetInt32(mySQLReader.GetOrdinal("Investment_Risk"));

                            wealthPlanTarget.Amount_Needed        = wealthPlanTargetResponse.Amount_Needed;
                            wealthPlanTarget.Investment_Period    = wealthPlanTargetResponse.Investment_Period;
                            wealthPlanTarget.Initial_Investment   = wealthPlanTargetResponse.Initial_Investment;
                            wealthPlanTarget.Investment_Per_Month = wealthPlanTargetResponse.Investment_Per_Month;
                            wealthPlanTarget.Investment_Risk      = wealthPlanTargetResponse.Investment_Risk;

                            //WealthPlanTargetinfo.Add(wpti);
                        }
                        mySQLReader.Close();
                        //--------------------------------  Info WealthPlan   ----------------
                        //wealthPlanTargetResponse.Data = WealthPlanTargetinfo;
                        wealthPlanTargetResponse.Message = "Success";
                        wealthPlanTargetResponse.Status  = "OK";
                    }
                    break;

                default: break;
                }   //  end switch

                if (wealthPlanTargetResponse.Status == "OK")
                {
                    /*  -------------   คำอธิบาย  -------------
                     *  lowest = ต่ำสุด
                     *  downtrend = ขาลง
                     *  normL= ปกติ L
                     *  normH = ปกติ H
                     *  uptrend = ขาขึ้น
                     */
                    //  -------------   ค่า z-Score  -------------
                    Dictionary <string, double> zScore = new Dictionary <string, double>()
                    {
                        { "lowest", -1.9600 },
                        { "downtrend", -1.1503 },
                        { "normL", 0.0000 },
                        { "normH", 1.1503 },
                        { "uptrend", 1.9600 }
                    };
                    //  -------------   ผลตอบแทนตามความเสี่ยง  -------------

                    /*
                     * Dictionary<int, ExpectedReturn> expectedReturn = new Dictionary<int, ExpectedReturn>(){
                     * { 1, new ExpectedReturn { SD= 0.0176, RET= 0.0464 }},
                     * { 2, new ExpectedReturn { SD= 0.0335, RET= 0.0609 }},
                     * { 3, new ExpectedReturn { SD= 0.0335, RET= 0.0609 }},
                     * { 4, new ExpectedReturn { SD= 0.0335, RET= 0.0609 }},
                     * { 5, new ExpectedReturn { SD= 0.0485, RET= 0.0713 }},
                     * { 6, new ExpectedReturn { SD= 0.0667, RET= 0.0863 }},
                     * { 7, new ExpectedReturn { SD= 0.0667, RET= 0.0863 }},
                     * { 8, new ExpectedReturn { SD= 0.0990, RET= 0.1600 }}
                     * };*/
                    Dictionary <int, ExpectedReturn> expectedReturn = new Dictionary <int, ExpectedReturn>()
                    {
                        { 1, new ExpectedReturn {
                              SD = 0.0170, RET = 0.0427
                          } },
                        { 2, new ExpectedReturn {
                              SD = 0.0324, RET = 0.0560
                          } },
                        { 3, new ExpectedReturn {
                              SD = 0.0324, RET = 0.0560
                          } },
                        { 4, new ExpectedReturn {
                              SD = 0.0324, RET = 0.0560
                          } },
                        { 5, new ExpectedReturn {
                              SD = 0.0467, RET = 0.0646
                          } },
                        { 6, new ExpectedReturn {
                              SD = 0.0639, RET = 0.0781
                          } },
                        { 7, new ExpectedReturn {
                              SD = 0.0639, RET = 0.0781
                          } },
                        { 8, new ExpectedReturn {
                              SD = 0.0945, RET = 0.0941
                          } }
                    };


                    Proceeds proceeds = null;
                    //Suggest an alternative

                    double futureValue      = 0;
                    double endingWealth     = 0;
                    bool   endingWealthBool = true;
                    double separateGraph    = 0;

                    //int periodLoop = (int)wealthPlanTarget.Investment_Period * 12 * 5;
                    int    periodLoop         = 240;
                    double endingWealthTarget = 0; //เป้าหมายที่ได้

                    for (int i = 1; i <= periodLoop; i++)
                    {
                        proceeds    = new Proceeds();
                        futureValue = wealthPlanTarget.Investment_Per_Month * ((Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), i)) - 1) / (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0) + wealthPlanTarget.Initial_Investment * (Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), i));

                        proceeds.Month     = i;
                        proceeds.Lowest    = Math.Round(futureValue + zScore["lowest"] * (expectedReturn[wealthPlanTarget.Investment_Risk].SD * Math.Sqrt(i / 12.0)) * futureValue, 4);
                        proceeds.Downtrend = Math.Round(futureValue + zScore["downtrend"] * (expectedReturn[wealthPlanTarget.Investment_Risk].SD * Math.Sqrt(i / 12.0)) * futureValue, 4);
                        proceeds.NormL     = Math.Round(futureValue + zScore["normL"] * (expectedReturn[wealthPlanTarget.Investment_Risk].SD * Math.Sqrt(i / 12.0)) * futureValue, 4);
                        proceeds.NormH     = Math.Round(futureValue + zScore["normH"] * (expectedReturn[wealthPlanTarget.Investment_Risk].SD * Math.Sqrt(i / 12.0)) * futureValue, 4);
                        proceeds.Uptrend   = Math.Round(futureValue + zScore["uptrend"] * (expectedReturn[wealthPlanTarget.Investment_Risk].SD * Math.Sqrt(i / 12.0)) * futureValue, 4);

                        proceedsArray.Add(proceeds);

                        /*
                         * if (i == (int)wealthPlanTarget.Investment_Period * 12)
                         * {
                         *  endingWealthTarget = futureValue;
                         * }
                         */

                        if (endingWealthBool && wealthPlanTarget.Amount_Needed <= futureValue)
                        {
                            endingWealth       = i;
                            endingWealthTarget = futureValue;
                            endingWealthBool   = false;
                        }
                    }

                    separateGraph = wealthPlanTarget.Investment_Period * 12 > endingWealth ? wealthPlanTarget.Investment_Period * 12 : endingWealth;
                    if (separateGraph <= 60)
                    {
                        periodLoop = 60;
                    }
                    else if (separateGraph <= 120)
                    {
                        periodLoop = 120;
                    }
                    else
                    {
                        periodLoop = 240; //180
                    }
                    for (int i = 1; i <= periodLoop; i++)
                    {
                        proceedsArrayTmp.Add(proceedsArray[i - 1]);
                    }


                    if (wealthPlanTarget.Amount_Needed < endingWealthTarget && endingWealth <= wealthPlanTarget.Investment_Period * 12) //  ถึงเป้า
                    {
                        wealthPlanTargetResponse.Target        = "Y";
                        wealthPlanTargetResponse.Target_Month  = Math.Round(endingWealth, MidpointRounding.AwayFromZero);
                        wealthPlanTargetResponse.Target_Amount = Math.Round(endingWealthTarget, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        wealthPlanTargetResponse.Target = "N";

                        //----------------- ยืดระยะเวลาลงทุน(ปี)  --------------------------
                        wealthPlanTargetResponse.Recommended_Choice1 = endingWealth;
                        //----------------- /ยืดระยะเวลาลงทุน(ปี)  --------------------------

                        periodLoop = (int)wealthPlanTarget.Investment_Period * 12;

                        //----------------- เพิ่มเงินลงทุนตั้งต้น(บาท) --------------------------
                        //for (int i = 10000; i <= 1000000; i++)
                        //{
                        endingWealth = (wealthPlanTarget.Amount_Needed - (wealthPlanTarget.Investment_Per_Month * ((Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop)) - 1) / (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0))) / (Math.Pow(1 +
                                                                                                                                                                                                                                                                                                (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop));

                        //  if (endingWealth >= wealthPlanTarget.Amount_Needed) break;
                        //}

                        //wealthPlanTargetResponse.Recommended_Choice2 = Math.Round(endingWealth, MidpointRounding.AwayFromZero);
                        wealthPlanTargetResponse.Recommended_Choice2 = Math.Floor(endingWealth) + 1;
                        //----------------- /เพิ่มเงินลงทุนตั้งต้น(บาท) --------------------------

                        //----------------- เพิ่มเงินลงทุนต่อเดือน(บาท) --------------------------

                        /*
                         * for (int i = 1000; i <= 100000; i++)
                         * {
                         *  endingWealth = (wealthPlanTarget.Amount_Needed - i * (Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop))) / ((Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop)) - 1) * (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0);
                         *
                         *
                         * if (endingWealth >= wealthPlanTarget.Amount_Needed) break;
                         * }
                         */
                        endingWealth = (wealthPlanTarget.Amount_Needed - (wealthPlanTarget.Initial_Investment * (Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop)))) * (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0) / ((Math.Pow(1 + (expectedReturn[wealthPlanTarget.Investment_Risk].RET / 12.0), periodLoop)) - 1);

                        //wealthPlanTargetResponse.Recommended_Choice3 = Math.Round(endingWealth, MidpointRounding.AwayFromZero);
                        wealthPlanTargetResponse.Recommended_Choice3 = Math.Floor(endingWealth) + 1;
                        //----------------- เพิ่มเงินลงทุนต่อเดือน(บาท) --------------------------
                    }


                    wealthPlanTargetResponse.Plot = proceedsArrayTmp;
                }   //wealthPlanTargetResponse.Status == "OK")


                //wealthPlanTargetResponse.Message = "Success";
                //wealthPlanTargetResponse.Status = "OK";

                // P is the periodic deposit
                // N is number of periods per year
                // R is the effective annual rate
                // r is the periodic rate
                // T is the total number of periods
                // A is the future value

                /*
                 * double P = wealthPlanTarget.Investment_Per_Month;   //ลงทุนต่อเดือน
                 * int N = 12;
                 * double R = wealthPlanTarget.Interest / 100;  //อัตราผลตอบแทน
                 * double r = Math.Pow(1 + R, 1 / N) - 1;
                 * int T = wealthPlanTarget.Investment_Period; //จำนวนเดือน
                 *
                 * double A = 0;
                 * for (int i = 1; i <= T; i++)
                 *  A = A + P * Math.Pow(1 + r, i);
                 * double Interest = A - P;
                 */

                //decimal futureValues = this.CalculateFutureValue(wealthPlanTarget.Investment_Per_Month, wealthPlanTarget.Interest / 100 / 12, wealthPlanTarget.Investment_Period);

                //double futureValue = Financial.Fv(wealthPlanTarget.Interest, wealthPlanTarget.Investment_Period, -wealthPlanTarget.Investment_Per_Month,0, 0);

                /*
                 * FV = MonthlyDeposit * (((1 + MonthlyInterest)^Months - 1 )
                 * / MonthlyInterest ) + StartingBalance * ( 1 + MonthlyInterest )^Months
                 */
                /*
                 *             futureValue = wealthPlanTarget.Investment_Per_Month * ((Math.Pow(1+((wealthPlanTarget.Interest/100) / 12),(wealthPlanTarget.Investment_Period*12))) - 1) / ((wealthPlanTarget.Interest/100) / 12) + wealthPlanTarget.Initial_Investment * (Math.Pow(1+
                 *                 ((wealthPlanTarget.Interest / 100) / 12),(wealthPlanTarget.Investment_Period*12)));
                 */
                //wealthPlanTargetResponse.Test = futureValue;

                return(wealthPlanTargetResponse);
            }

            catch (Exception ex)
            {
                wealthPlanTargetResponse.Message = ex.ToString();
                wealthPlanTargetResponse.Status  = "Fail";
                return(wealthPlanTargetResponse);
            }
            finally
            {
                if (mySQLReader != null)
                {
                    mySQLReader.Close();
                }
                if (conn != null)
                {
                    conn.Close();
                }
            }
        }