private void gvPO_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            DataRow row = gvPO.GetDataRow(e.RowHandle);

            if (e.Column == colSupplierCode || e.Column == colSupplierName)
            {
                string code = (string)row[e.Column.FieldName];
                row[colSupplierCode.FieldName] = code;
                row[colSupplierName.FieldName] = code;
            }
            else if (e.Column == colProjectCode || e.Column == colProjectName)
            {
                int projectId = (int)row[e.Column.FieldName];
                row[colProjectCode.FieldName] = projectId;
                row[colProjectName.FieldName] = projectId;
                row[colBillable.FieldName]    = Project.GetProject(projectId)?.Billable ?? false;
            }

            if (!gvPO.IsNewItemRow(e.RowHandle))
            {
                if (new GridColumn[] { colPODate, colPONumber, colSupplierCode, colSupplierName, colProjectCode, colProjectName, colBillable }.Contains(e.Column))
                {
                    FieldPO.SqlUpdate((int)row[colId.FieldName], (DateTime)row[colPODate.FieldName], Convert.ToString(row[colPONumber.FieldName]),
                                      (string)row[colSupplierCode.FieldName], (int)row[colProjectCode.FieldName], (bool)row[colBillable.FieldName]);
                    row[colStatus.FieldName] = Enum.GetName(typeof(EnumSubmitStatus), EnumSubmitStatus.Open);
                    btnSubmit.Enabled        = true;
                }
            }
        }
        private void SetSubmitStatus(EnumSubmitStatus status)
        {
            DataRow row = gvPO.GetFocusedDataRow();

            if (row != null && row[colStatus.FieldName] != DBNull.Value && ConvertEx.StringToEnum <EnumSubmitStatus>(row[colStatus.FieldName]) != status)
            {
                row[colStatus.FieldName] = Enum.GetName(typeof(EnumSubmitStatus), status);
                FieldPO.SqlUpdateStatus((int)row[colId.FieldName], status);
                btnSubmit.Enabled = (status == EnumSubmitStatus.Open);
            }
        }
        private void gvPO_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            if (gvPO.IsNewItemRow(e.RowHandle))
            {
                DataRowView row = e.Row as DataRowView;
                row[colId.FieldName] = FieldPO.SqlInsert((DateTime)row[colPODate.FieldName], Convert.ToString(row[colPONumber.FieldName]), (string)row[colSupplierCode.FieldName],
                                                         (int)row[colProjectCode.FieldName], (bool)row[colBillable.FieldName]);

                btnSubmit.Enabled = (string)row[colStatus.FieldName] == Enum.GetName(typeof(EnumSubmitStatus), EnumSubmitStatus.Open);
                SetDetailsEnabled(true);
            }
        }
        private void UpdatePOAmount()
        {
            decimal total = 0;

            for (int i = 0; i < gvDetail.RowCount; i++)
            {
                int handle = gvDetail.GetRowHandle(i);
                total += (decimal)gvDetail.GetRowCellValue(handle, colDetailAmount.FieldName);
            }

            DataRow poRow = gvPO.GetFocusedDataRow();

            poRow[colPOAmount.FieldName] = total;
            SetSubmitStatus(EnumSubmitStatus.Open);
            FieldPO.SqlUpdateAmount((int)poRow[colId.FieldName], total);
        }
        private void gvPO_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            var LoadAttachments = new Action <int>((poId) =>
            {
                //_fileMgr.ReadOnly = (poId == -1);
                _fileMgr.DocumentFileLink = new FileLink[] { new FileLink(Attachment.FieldPOId, poId, Company.CurrentId, FileLink.Database.TR, 0, true) };
            });

            tablePODetail.Clear();

            DataRow row = gvPO.GetDataRow(e.FocusedRowHandle);

            if (row != null && row[colId.FieldName] != DBNull.Value)
            {
                FieldPO po = FieldPO.GetFieldPO((int)row[colId.FieldName]);
                po.GetPODetails();

                po.DetailList.ForEach(x =>
                                      tablePODetail.Rows.Add(
                                          x.Id,
                                          x.LineNum,
                                          x.Description,
                                          x.Level1Id,
                                          x.Level2Id,
                                          x.Level3Id,
                                          x.Level4Id,
                                          x.Component,
                                          x.Billable,
                                          x.Amount)
                                      );
                tablePODetail.AcceptChanges();

                LoadAttachments((int)row[colId.FieldName]);
                btnSubmit.Enabled = (string)row[colStatus.FieldName] == Enum.GetName(typeof(EnumSubmitStatus), EnumSubmitStatus.Open);
                bool enabled = (string)row[colStatus.FieldName] != Enum.GetName(typeof(EnumSubmitStatus), EnumSubmitStatus.Submitted);
                SetDetailsEnabled(enabled);
            }
            else
            {
                LoadAttachments(-1);
                btnSubmit.Enabled = false;
                SetDetailsEnabled(false);
            }
        }
        public void SetData()
        {
            SetDetailsEnabled(false);

            tablePO.Clear();
            FieldPO.GetAllPO().ForEach(x =>
                                       tablePO.Rows.Add(
                                           x.Id,
                                           x.PODate,
                                           Enum.GetName(typeof(EnumSubmitStatus), x.SubmitStatus),
                                           x.PONum,
                                           x.SupplierCode,
                                           x.SupplierCode,
                                           x.ProjectId,
                                           x.ProjectId,
                                           Project.GetProject(x.ProjectId)?.Billable ?? false,
                                           x.POAmount)
                                       );
            tablePO.AcceptChanges();
        }
        private void gvPO_RowDeleting(object sender, DevExpress.Data.RowDeletingEventArgs e)
        {
            DataRow row = gvPO.GetDataRow(e.RowHandle);

            if ((string)row[colStatus.FieldName] == Enum.GetName(typeof(EnumSubmitStatus), EnumSubmitStatus.Submitted))
            {
                e.Cancel = true;
                GuiCommon.ShowMessage("Cannot delete a submitted PO.");
                return;
            }

            if (GuiCommon.ShowMessage("Delete Record?", "Confirmation", PopupType.Yes_No) == PopupResult.No)
            {
                e.Cancel = true;
            }
            else
            {
                FieldPO.SqlDelete((int)row[colId.FieldName]);
            }
        }
        public IHttpActionResult Post(int syncId, [FromBody] FieldPO po)
        {
            try
            {
                using (SqlConnection sqlcon = new SqlConnection(WebCommon.WebConnection))
                {
                    sqlcon.Open();

                    string     sSQL = @"WS_FLEM_POHeader_PostPut";
                    SqlCommand cmd  = new SqlCommand(sSQL, sqlcon);
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlParameter paraMatchId;
                    SqlParameter paraPONum;
                    cmd.Parameters.Add(new SqlParameter("@SyncId", syncId));
                    cmd.Parameters.Add(new SqlParameter("@ContactId", po.CreatorId));
                    cmd.Parameters.Add(new SqlParameter("@CompanyId", po.CompanyId));
                    cmd.Parameters.Add(paraMatchId = new SqlParameter("@MatchId", po.MatchId)
                    {
                        Direction = ParameterDirection.InputOutput
                    });
                    cmd.Parameters.Add(paraPONum = new SqlParameter("@PONum", po.PONum)
                    {
                        Direction = ParameterDirection.InputOutput, Size = 20
                    });
                    cmd.Parameters.Add(new SqlParameter("@PODate", po.PODate));
                    cmd.Parameters.Add(new SqlParameter("@SupplierCode", po.SupplierCode));
                    cmd.Parameters.Add(new SqlParameter("@ProjectId", po.ProjectId));
                    cmd.ExecuteNonQuery();

                    string     sqlDetail = @"WS_FLEM_PODetail_PostPut";
                    SqlCommand cmdDetail = new SqlCommand(sqlDetail, sqlcon);
                    cmdDetail.CommandType = CommandType.StoredProcedure;
                    cmdDetail.Parameters.Add(new SqlParameter("@SyncId", syncId));
                    cmdDetail.Parameters.Add(new SqlParameter("@CompanyId", po.CompanyId));
                    cmdDetail.Parameters.Add(new SqlParameter("@MatchId", -1)
                    {
                        Direction = ParameterDirection.InputOutput
                    });
                    cmdDetail.Parameters.Add(new SqlParameter("@HeaderMatchId", paraMatchId.Value));
                    cmdDetail.Parameters.Add(new SqlParameter("@LineNum", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Description", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Level1Id", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Level2Id", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Level3Id", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Level4Id", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@LEMComp", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Billable", null));
                    cmdDetail.Parameters.Add(new SqlParameter("@Amount", null));

                    foreach (var detail in po.DetailList)
                    {
                        cmdDetail.Parameters["@LineNum"].Value     = detail.LineNum;
                        cmdDetail.Parameters["@Description"].Value = detail.Description;
                        cmdDetail.Parameters["@MatchId"].Value     = -1;
                        cmdDetail.Parameters["@Level1Id"].Value    = (object)detail.Level1Id ?? DBNull.Value;
                        cmdDetail.Parameters["@Level2Id"].Value    = (object)detail.Level2Id ?? DBNull.Value;
                        cmdDetail.Parameters["@Level3Id"].Value    = (object)detail.Level3Id ?? DBNull.Value;
                        cmdDetail.Parameters["@Level4Id"].Value    = (object)detail.Level4Id ?? DBNull.Value;
                        cmdDetail.Parameters["@LEMComp"].Value     = (char)detail.Component;
                        cmdDetail.Parameters["@Billable"].Value    = detail.Billable;
                        cmdDetail.Parameters["@Amount"].Value      = detail.Amount;

                        cmdDetail.ExecuteNonQuery();
                    }

                    string[] returnData = new string[] { paraMatchId.Value.ToString(), paraPONum.Value.ToString() };
                    return(Ok(returnData));
                }
            }
            catch (Exception e)
            {
                SqlCommon.ReportInfo(e.Message);
                return(BadRequest(e.Message));
            }
        }