public async Task <IActionResult> Edit([Bind("Id,ArrivalNo,ArrivalDate,RawMatTypeId,VendorId,ArrivalTypeId,PurchaseOrderNo,DocRefNo,DocRefDate,ArrivalRemark,CompanyCode,ArrivalDetails,Is_Active,Created_Date,Created_By,Updated_Date,Updated_By")] T_Arrival_Header t_Arrival_Header)
        {
            if (ModelState.IsValid)
            {
                t_Arrival_Header.Updated_By = await base.CurrentUserId();

                ResultObject resultObj;

                try
                {
                    using (var arrBll = new ArrivalBLL())
                    {
                        resultObj = await arrBll.UpdateArrival(t_Arrival_Header);
                    }

                    return(Json(new { success = true, data = (T_Arrival_Header)resultObj.ObjectValue, message = "Arrival Update." }));
                }
                catch (Exception ex)
                {
                    return(Json(new { success = false, data = t_Arrival_Header, message = ex.Message }));
                }
            }

            var err = ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage).ToList();

            return(Json(new { success = false, errors = err, data = t_Arrival_Header, message = "Update Failed" }));
        }
        public async Task <ResultObject> UpdateArrival(T_Arrival_Header arr)
        {
            var resultObj = new ResultObject {
                RowAffected = -1, ObjectValue = arr
            };

            using (var context = new TransactionDbContext(contextOptions))
            {
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        context.Entry(arr).State = EntityState.Modified;

                        MySqlParameter[] sqlParams = new MySqlParameter[] {
                            new MySqlParameter("strId", arr.Id),
                            new MySqlParameter("strArrivalNo", arr.ArrivalNo),
                            new MySqlParameter("strArrivalDate", arr.ArrivalDate),
                            new MySqlParameter("strRawMatTypeId", arr.RawMatTypeId),
                            new MySqlParameter("strVendorId", arr.VendorId),
                            new MySqlParameter("strArrivalTypeId", arr.ArrivalTypeId),
                            new MySqlParameter("strPurchaseOrderNo", arr.PurchaseOrderNo),
                            new MySqlParameter("strDocRefNo", arr.DocRefNo),
                            new MySqlParameter("strDocRefDate", arr.DocRefDate),
                            new MySqlParameter("strArrivalRemark", arr.ArrivalRemark),
                            new MySqlParameter("strCompanyCode", arr.CompanyCode),
                            new MySqlParameter("strIs_Active", arr.Is_Active),
                            new MySqlParameter("strUpdated_By", arr.Updated_By)
                        };

                        resultObj.RowAffected = await context.Database.ExecuteSqlCommandAsync("call sp_arrival_hdr_update(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams);

                        if (arr.ArrivalDetails.Count > 0)
                        {
                            MySqlParameter[] sqlParams2;

                            foreach (T_Arrival_Detail arrdtl in arr.ArrivalDetails)
                            {
                                switch (arrdtl.RecordFlag)
                                {
                                case 0:     //delete row

                                    sqlParams2 = new MySqlParameter[] {
                                        new MySqlParameter("strId", arrdtl.Id),
                                        new MySqlParameter("strArrivalId", arrdtl.ArrivalId),
                                        new MySqlParameter("strLineNo", arrdtl.LineNo),
                                        new MySqlParameter("strPoLineNo", arrdtl.PoLineNo),
                                        new MySqlParameter("strMaterialId", arrdtl.MaterialId),
                                        new MySqlParameter("strCompanyCode", arrdtl.CompanyCode),
                                        new MySqlParameter("strDelete_By", arrdtl.Created_By)
                                    };

                                    resultObj.RowAffected += await context.Database.ExecuteSqlCommandAsync("call sp_arrival_dtl_delete(?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams2);

                                    break;

                                case 1:     //no change (only update line no)

                                    sqlParams2 = new MySqlParameter[] {
                                        new MySqlParameter("strId", arrdtl.Id),
                                        new MySqlParameter("strLineNo", arrdtl.LineNo)
                                    };

                                    resultObj.RowAffected += await context.Database.ExecuteSqlCommandAsync("call sp_arrival_dtl_updateline(?, ?)", parameters : sqlParams2);

                                    break;

                                case 2:     //new row

                                    sqlParams2 = new MySqlParameter[] {
                                        new MySqlParameter("strArrivalId", arr.Id),
                                        new MySqlParameter("strLineNo", arrdtl.LineNo),
                                        new MySqlParameter("strPoLineNo", arrdtl.PoLineNo),
                                        new MySqlParameter("strMaterialId", arrdtl.MaterialId),
                                        new MySqlParameter("strMaterialCode", arrdtl.MaterialCode),
                                        new MySqlParameter("strMaterialName", arrdtl.MaterialName),
                                        new MySqlParameter("strMaterialDesc", arrdtl.MaterialDesc),
                                        new MySqlParameter("strOrderQty", arrdtl.OrderQty),
                                        new MySqlParameter("strRecvQty", arrdtl.RecvQty),
                                        new MySqlParameter("strLotNo", arrdtl.LotNo),
                                        new MySqlParameter("strLotDate", arrdtl.LotDate),
                                        new MySqlParameter("strDetailRemark", arrdtl.DetailRemark),
                                        new MySqlParameter("strGenLabelStatus", arrdtl.GenLabelStatus),
                                        new MySqlParameter("strNoOfLabel", arrdtl.NoOfLabel),
                                        new MySqlParameter("strCompanyCode", arrdtl.CompanyCode),
                                        new MySqlParameter("strIs_Active", arrdtl.Is_Active),
                                        new MySqlParameter("strCreated_By", arr.Updated_By)
                                    };

                                    resultObj.RowAffected += await context.Database.ExecuteSqlCommandAsync("call sp_arrival_dtl_insert(@`strId`, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams2);

                                    break;

                                case 3:     //Edit Qty

                                    sqlParams2 = new MySqlParameter[] {
                                        new MySqlParameter("strId", arrdtl.Id),
                                        new MySqlParameter("strArrivalId", arrdtl.ArrivalId),
                                        new MySqlParameter("strLineNo", arrdtl.LineNo),
                                        new MySqlParameter("strPoLineNo", arrdtl.PoLineNo),
                                        new MySqlParameter("strMaterialId", arrdtl.MaterialId),
                                        new MySqlParameter("strOrderQty", arrdtl.OrderQty),
                                        new MySqlParameter("strCompanyCode", arrdtl.CompanyCode),
                                        new MySqlParameter("strCreated_By", arrdtl.Created_By)
                                    };

                                    resultObj.RowAffected += await context.Database.ExecuteSqlCommandAsync("call sp_arrival_dtl_update(?, ?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams2);

                                    break;

                                default:
                                    break;
                                }
                            }
                        }

                        transaction.Commit();

                        return(resultObj);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }
        public async Task <ResultObject> InsertArrival(T_Arrival_Header arr)
        {
            var resultObj = new ResultObject {
                RowAffected = -1, ObjectValue = arr
            };

            using (var context = new TransactionDbContext(contextOptions))
            {
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        MySqlParameter[] sqlParams = new MySqlParameter[] {
                            //new MySqlParameter("strArrivalNo", arr.ArrivalNo),
                            new MySqlParameter("strArrivalDate", arr.ArrivalDate),
                            new MySqlParameter("strRawMatTypeId", arr.RawMatTypeId),
                            new MySqlParameter("strVendorId", arr.VendorId),
                            new MySqlParameter("strArrivalTypeId", arr.ArrivalTypeId),
                            new MySqlParameter("strPurchaseOrderNo", arr.PurchaseOrderNo),
                            new MySqlParameter("strDocRefNo", arr.DocRefNo),
                            new MySqlParameter("strDocRefDate", arr.DocRefDate),
                            new MySqlParameter("strArrivalRemark", arr.ArrivalRemark),
                            new MySqlParameter("strCompanyCode", arr.CompanyCode),
                            new MySqlParameter("strIs_Active", arr.Is_Active),
                            new MySqlParameter("strCreated_By", arr.Created_By)
                        };

                        resultObj.RowAffected = await context.Database.ExecuteSqlCommandAsync("call sp_arrival_hdr_insert(@`strId`, @`strArrivalNo`, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams);

                        //new product after insert.
                        var newArr = context.ArrivalHdr.FromSql("SELECT * FROM t_arrival_hdr WHERE Id = @`strId`;").ToListAsync();
                        resultObj.ObjectValue = newArr.Result[0];

                        if (arr.ArrivalDetails.Count > 0)
                        {
                            MySqlParameter[] sqlParams2;

                            foreach (T_Arrival_Detail arrdtl in arr.ArrivalDetails)
                            {
                                switch (arrdtl.RecordFlag)
                                {
                                case 0:
                                    break;

                                case 1:
                                    break;

                                case 2:

                                    sqlParams2 = new MySqlParameter[] {
                                        new MySqlParameter("strArrivalId", newArr.Result[0].Id),
                                        new MySqlParameter("strLineNo", arrdtl.LineNo),
                                        new MySqlParameter("strPoLineNo", arrdtl.PoLineNo),
                                        new MySqlParameter("strMaterialId", arrdtl.MaterialId),
                                        new MySqlParameter("strMaterialCode", arrdtl.MaterialCode),
                                        new MySqlParameter("strMaterialName", arrdtl.MaterialName),
                                        new MySqlParameter("strMaterialDesc", arrdtl.MaterialDesc),
                                        new MySqlParameter("strOrderQty", arrdtl.OrderQty),
                                        new MySqlParameter("strRecvQty", arrdtl.RecvQty),
                                        new MySqlParameter("strLotNo", arrdtl.LotNo),
                                        new MySqlParameter("strLotDate", arrdtl.LotDate),
                                        new MySqlParameter("strDetailRemark", arrdtl.DetailRemark),
                                        new MySqlParameter("strGenLabelStatus", arrdtl.GenLabelStatus),
                                        new MySqlParameter("strNoOfLabel", arrdtl.NoOfLabel),
                                        new MySqlParameter("strCompanyCode", arrdtl.CompanyCode),
                                        new MySqlParameter("strIs_Active", arrdtl.Is_Active),
                                        new MySqlParameter("strCreated_By", arrdtl.Created_By)
                                    };

                                    resultObj.RowAffected += await context.Database.ExecuteSqlCommandAsync("call sp_arrival_dtl_insert(@`strId`, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", parameters : sqlParams2);

                                    break;

                                default:
                                    break;
                                }
                            }
                        }

                        transaction.Commit();

                        return(resultObj);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        throw ex;
                    }
                }
            }
        }