/// <summary> /// DataRow型をT03_SRHDに変換する /// </summary> /// <param name="drow"></param> /// <returns></returns> protected T03_SRHD convertDataRowToT03_SRHD_Entity(DataRow drow) { T03_SRHD srhd = new T03_SRHD(); int ival = 0; srhd.伝票番号 = ParseNumeric <int>(drow["伝票番号"]); srhd.会社名コード = ParseNumeric <int>(drow["会社名コード"]); if (drow["仕入日"] != null && !string.IsNullOrEmpty(drow["仕入日"].ToString())) { srhd.仕入日 = DateTime.Parse(string.Format("{0:yyyy/MM/dd}", drow["仕入日"])); } srhd.入力区分 = ParseNumeric <int>(drow["入力区分"]); srhd.仕入区分 = ParseNumeric <int>(drow["仕入区分"]); srhd.仕入先コード = ParseNumeric <int>(drow["仕入先コード"]); srhd.仕入先枝番 = ParseNumeric <int>(drow["仕入先枝番"]); srhd.入荷先コード = ParseNumeric <int>(drow["入荷先コード"]); srhd.発注番号 = int.TryParse(drow["発注番号"].ToString(), out ival) ? ival : (int?)null; srhd.備考 = drow["備考"].ToString(); // REMARKS:カラムが無い場合は参照しない srhd.元伝票番号 = drow.Table.Columns.Contains("元伝票番号") ? (int.TryParse(drow["元伝票番号"].ToString(), out ival) ? ival : (int?)null) : (int?)null; // No-94 Add Start srhd.通常税率対象金額 = ParseNumeric <int>(drow["通常税率対象金額"]); srhd.軽減税率対象金額 = ParseNumeric <int>(drow["軽減税率対象金額"]); srhd.通常税率消費税 = ParseNumeric <int>(drow["通常税率消費税"]); srhd.軽減税率消費税 = ParseNumeric <int>(drow["軽減税率消費税"]); // No-94 Add End // No-95 Add Start srhd.小計 = ParseNumeric <int>(drow["小計"]); srhd.総合計 = ParseNumeric <int>(drow["総合計"]); // No-95 Add End srhd.消費税 = ParseNumeric <int>(drow["消費税"]); return(srhd); }
/// <summary> /// 仕入明細情報の更新をおこなう /// </summary> /// <param name="srhd">仕入ヘッダデータ</param> /// <param name="dt">仕入明細データテーブル</param> /// <returns></returns> private List <T03_SRDTL> setT03_SRDTL_Update(T03_SRHD shd, DataTable dt) { // 登録済データの削除 T03Service.T03_SRDTL_DeleteRecords(shd.伝票番号); List <T03_SRDTL> resultList = new List <T03_SRDTL>(); // 明細追加 foreach (DataRow row in dt.Rows) { // Del-Insの為削除されたレコードは不要 if (row.RowState == DataRowState.Deleted) { continue; } T03_SRDTL dtlData = convertDataRowToT03_SRDTL_Entity(row); dtlData.伝票番号 = shd.伝票番号; if (dtlData.品番コード <= 0) { continue; } // 明細データの登録実行 T03Service.T03_SRDTL_Update(dtlData); resultList.Add(dtlData); } return(resultList); }
/// <summary> /// 仕入ヘッダ情報の更新をおこなう /// </summary> /// <param name="row">仕入ヘッダデータ行</param> /// <returns></returns> private T03_SRHD setT03_SRHD_Update(DataRow row) { // 入力情報 T03_SRHD t03Data = convertDataRowToT03_SRHD_Entity(row); // 仕入ヘッダの登録を実行 T03Service.T03_SRHD_Update(t03Data); return(t03Data); }
/// <summary> /// 在庫情報の更新をおこなう /// </summary> /// <param name="srhd">仕入ヘッダデータ</param> /// <param name="dt">仕入明細データテーブル</param> private void setS03_STOK_Update(T03_SRHD srhd, DataTable dt) { // 会社名から対象の倉庫を取得 int souk = T03Service.get倉庫コード(srhd.入荷先コード); foreach (DataRow row in dt.Rows) { T03_SRDTL srdtl = convertDataRowToT03_SRDTL_Entity(row); // 未入力レコードはスキップ if (srdtl.品番コード <= 0) { continue; } // 元伝票からの返品対象外商品なので処理しない if (row.RowState == DataRowState.Deleted) { continue; } decimal stockQty = 0; // 在庫調整数計算 if (srhd.仕入区分 == (int)CommonConstants.仕入区分.返品) { // No-108 Add Start stockQty = srdtl.数量 * -1; // オリジナル(変更前数量)と比較して差分数量を加減算 if (row.HasVersion(DataRowVersion.Original)) { decimal orgQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]); stockQty = srdtl.数量 * -1 + orgQty; } // No-108 Add End } else { // 上記以外の場合は処理なし continue; } // 在庫作成・更新 S03_STOK stok = new S03_STOK(); stok.庫コード = souk; stok.品番コード = srdtl.品番コード; stok.賞味期限 = AppCommon.DateTimeToDate(srdtl.賞味期限, DateTime.MaxValue); stok.在庫数 = stockQty; S03Service.S03_STOK_Update(stok); } }
/// <summary> /// 仕入入力情報を登録・更新する /// </summary> /// <param name="ds"> /// 仕入データセット /// [0:T03_SRHD、1:T03_SRDTL] /// </param> /// <param name="userId">ユーザID</param> /// <returns></returns> public int Update(DataSet ds, int userId) { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { T03Service = new T03(context, userId); S03Service = new S03(context, userId); S04Service = new S04(context, userId, S04.機能ID.仕入入力); try { DataTable hdTable = ds.Tables[T03_HEADER_TABLE_NAME]; DataTable dtlTable = ds.Tables[T03_DETAIL_TABLE_NAME]; if (hdTable == null || hdTable.Rows.Count == 0) { throw new Exception("仕入データの形式が正しくない為、登録処理をおこなう事ができませんでした。"); } // 1>> ヘッダ情報更新 T03_SRHD shd = setT03_SRHD_Update(hdTable.Rows[0]); // 2>> 明細情報更新 setT03_SRDTL_Update(shd, dtlTable); // 3>> 在庫情報更新 setS03_STOK_Update(context, shd, dtlTable); // No-258 Mod // 4>> 入出庫履歴の作成 setS04_HISTORY_Create(context, shd, dtlTable, hdTable.Rows[0]); // No.156-1 Mod,No-258 Mod // 変更状態を確定 context.SaveChanges(); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } } } return(1); }
/// <summary> /// 入出庫履歴の登録・更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="srhd">仕入ヘッダデータ</param> /// <param name="dtlTable">仕入明細データテーブル</param> /// <param name="orghd">変更前仕入ヘッダデータ</param> private void setS04_HISTORY_Create(TRAC3Entities context, T03_SRHD srhd, DataTable dtlTable, DataRow orghd) // No-258 Mod { // No-258 Mod Start // 登録済み入出庫データの削除 int intSlipNumber = srhd.伝票番号; // 入出庫データの物理削除 S04Service.PhysicalDeletionProductHistory(context, intSlipNumber, (int)S04.機能ID.仕入入力); // 不要レコード除去 DataTable dtlTblTmp = dtlTable.Clone(); foreach (DataRow row in dtlTable.Rows) { T03_SRDTL dtlRow = convertDataRowToT03_SRDTL_Entity(row); if (dtlRow.品番コード <= 0) { continue; } dtlTblTmp.ImportRow(row); } // 入出庫データ作成単位に集約 var dtlTblWk = dtlTblTmp.AsEnumerable() .Where(x => x.RowState != DataRowState.Deleted) .GroupBy(g => new { 伝票番号 = g.Field <int>("伝票番号"), 品番コード = g.Field <int>("品番コード"), 賞味期限 = g.Field <DateTime?>("賞味期限") }) .Select(s => new T03_SRDTL { 伝票番号 = s.Key.伝票番号, 品番コード = s.Key.品番コード, 賞味期限 = s.Key.賞味期限, 数量 = s.Sum(m => m.Field <decimal>("数量")) }) .ToList(); foreach (T03_SRDTL row in dtlTblWk) { decimal stockQtyhist = 0; // No-155 Add stockQtyhist = row.数量; S04_HISTORY history = new S04_HISTORY(); history.入出庫日 = srhd.仕入日; history.入出庫時刻 = com.GetDbDateTime().TimeOfDay; history.庫コード = T03Service.get倉庫コード(srhd.入荷先コード); history.入出庫区分 = (int)CommonConstants.入出庫区分.ID01_入庫; history.品番コード = row.品番コード; history.賞味期限 = row.賞味期限; history.数量 = decimal.ToInt32(row.数量); history.伝票番号 = srhd.伝票番号; Dictionary <string, string> hstDic = new Dictionary <string, string>() { // No.156-1 Mod Start { S04.COLUMNS_NAME_入出庫日, orghd == null? history.入出庫日.ToString("yyyy/MM/dd") : string.Format("{0:yyyy/MM/dd}", orghd["仕入日", DataRowVersion.Original]) }, { S04.COLUMNS_NAME_倉庫コード, orghd == null? history.庫コード.ToString() : orghd["入荷先コード", DataRowVersion.Original] == DBNull.Value? null : T03Service.get倉庫コード(Convert.ToInt32(orghd["入荷先コード", DataRowVersion.Original])).ToString() }, { S04.COLUMNS_NAME_伝票番号, orghd == null? history.伝票番号.ToString() : orghd["伝票番号", DataRowVersion.Original].ToString() }, { S04.COLUMNS_NAME_品番コード, history.品番コード.ToString() } // No.156-1 Mod End }; // 履歴作成 S04Service.CreateProductHistory(history); } // No-258 Mod End }
/// <summary> /// 在庫情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="srhd">仕入ヘッダデータ</param> /// <param name="dt">仕入明細データテーブル</param> private void setS03_STOK_Update(TRAC3Entities context, T03_SRHD srhd, DataTable dt) // No-258 Mod { // 会社名から対象の倉庫を取得 int souk = T03Service.get倉庫コード(srhd.入荷先コード); foreach (DataRow row in dt.Rows) { T03_SRDTL srdtl = convertDataRowToT03_SRDTL_Entity(row); // 未入力レコードはスキップ if (srdtl.品番コード <= 0) { continue; } decimal stockQty = 0; decimal oldstockQty = 0; // 変更前数量 No-258 Add bool iskigenChangeFlg = false; // 賞味期限変更フラグ No-258 Add // 在庫調整数計算 if (srhd.仕入区分 == (int)CommonConstants.仕入区分.通常) { #region 通常仕入 if (row.RowState == DataRowState.Deleted) { // 数量分在庫数を減算 if (row.HasVersion(DataRowVersion.Original)) { // オリジナルが存在する場合はその数量を優先する stockQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]); } else { stockQty = srdtl.数量; } // 仕入減算なので反転させる stockQty = stockQty * -1; } else if (row.RowState == DataRowState.Added) { // 数量分在庫数を加算 stockQty = srdtl.数量; } else if (row.RowState == DataRowState.Modified) { // No-258 Mod Start if (!row["賞味期限"].Equals(row["賞味期限", DataRowVersion.Original])) { // 賞味期限が変更された場合 // 減算フラグ(True:減算)の場合:旧賞味期限の在庫を加算、新賞味期限の在庫を減算する // 減算フラグ(True:False)の場合:旧賞味期限の在庫を減算、新賞味期限の在庫を加算する iskigenChangeFlg = true; // 旧賞味期限の在庫数 oldstockQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]) * -1; // 新賞味期限の在庫数 stockQty = srdtl.数量; } else { // 数量が変更された場合 decimal orgQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]); stockQty = srdtl.数量 - orgQty; } // No-258 Mod End } else { // 対象なし(DataRowState.Unchanged) continue; } #endregion } else { // 上記以外の場合は処理なし continue; } // No-258 Add Start // 賞味期限が変更された場合 if (iskigenChangeFlg == true) { DateTime dtKigen; S03_STOK oldStok = new S03_STOK(); oldStok.庫コード = souk; oldStok.品番コード = srdtl.品番コード; oldStok.賞味期限 = row["賞味期限", DataRowVersion.Original] == DBNull.Value ? AppCommon.DateTimeToDate(null, DateTime.MaxValue) : DateTime.TryParse(row["賞味期限", DataRowVersion.Original].ToString(), out dtKigen) ? dtKigen : AppCommon.DateTimeToDate(null, DateTime.MaxValue); oldStok.在庫数 = oldstockQty; // 旧賞味期限の在庫を更新 S03Service.S03_STOK_Update(oldStok); } // No-258 Add End // 在庫作成・更新 S03_STOK stok = new S03_STOK(); stok.庫コード = souk; stok.品番コード = srdtl.品番コード; stok.賞味期限 = AppCommon.DateTimeToDate(srdtl.賞味期限, DateTime.MaxValue); stok.在庫数 = stockQty; S03Service.S03_STOK_Update(stok); // 変更状態を確定 context.SaveChanges(); // No-258 Add } }
/// <summary> /// 仕入入力情報の削除をおこなう /// </summary> /// <param name="slipNumber">伝票番号</param> /// <param name="userId">ユーザID</param> /// <returns></returns> public int Delete(string slipNumber, int userId) { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { int number = 0; if (int.TryParse(slipNumber, out number)) { T03Service = new T03(context, userId); // No.156-1 Add S03Service = new S03(context, userId); S04Service = new S04(context, userId, S04.機能ID.仕入入力); try { // ①仕入ヘッダ論理削除 T03_SRHD hdData = T03Service.T03_SRHD_Delete(number); // ②仕入明細論理削除 List <T03_SRDTL> dtlList = T03Service.T03_SRDTL_Delete(number); // ③在庫更新 foreach (T03_SRDTL row in dtlList) { S03_STOK stok = new S03_STOK(); stok.庫コード = T03Service.get倉庫コード(hdData.会社名コード); stok.品番コード = row.品番コード; stok.賞味期限 = AppCommon.DateTimeToDate(row.賞味期限, DateTime.MaxValue); stok.在庫数 = row.数量 * -1; S03Service.S03_STOK_Update(stok); } // ④入出庫履歴作成 DataTable wkTbl = KESSVCEntry.ConvertListToDataTable <T03_SRDTL>(dtlList); wkTbl.AcceptChanges(); // No.156-1 Add foreach (DataRow row in wkTbl.Rows) { // 削除分を判定させる為、RowStateを変更する row.Delete(); } setS04_HISTORY_Create(context, hdData, wkTbl, null); // No.156-1 Mod,No-258 Mod // 変更状態を確定 context.SaveChanges(); // No.156-1 Add } catch { tran.Rollback(); throw new Exception("削除処理実行中にエラーが発生しました。"); } } else { throw new KeyNotFoundException("伝票番号が正しくありません"); } tran.Commit(); } } return(1); }
/// <summary> /// 仕入ヘッダの登録・更新をおこなう /// </summary> /// <param name="shdData"></param> public void T03_SRHD_Update(T03_SRHD shdData) { // 登録済データが存在するか判定 var hdData = _context.T03_SRHD .Where(w => w.伝票番号 == shdData.伝票番号) .FirstOrDefault(); if (hdData == null) { // データなしの為追加 T03_SRHD srhd = new T03_SRHD(); srhd.伝票番号 = shdData.伝票番号; srhd.会社名コード = shdData.会社名コード; srhd.仕入日 = shdData.仕入日; srhd.入力区分 = shdData.入力区分; srhd.仕入区分 = shdData.仕入区分; srhd.仕入先コード = shdData.仕入先コード; srhd.仕入先枝番 = shdData.仕入先枝番; srhd.入荷先コード = shdData.入荷先コード; srhd.発注番号 = shdData.発注番号; srhd.備考 = shdData.備考; srhd.元伝票番号 = shdData.元伝票番号; // No-94 Add Start srhd.通常税率対象金額 = shdData.通常税率対象金額; srhd.軽減税率対象金額 = shdData.軽減税率対象金額; srhd.通常税率消費税 = shdData.通常税率消費税; srhd.軽減税率消費税 = shdData.軽減税率消費税; // No-94 Add End // No-95 Add Start srhd.小計 = shdData.小計; srhd.総合計 = shdData.総合計; // No-95 Add End srhd.消費税 = shdData.消費税; srhd.登録者 = _loginUserId; srhd.登録日時 = com.GetDbDateTime(); srhd.最終更新者 = _loginUserId; srhd.最終更新日時 = com.GetDbDateTime(); _context.T03_SRHD.ApplyChanges(srhd); } else { // データを更新 hdData.会社名コード = shdData.会社名コード; hdData.仕入日 = shdData.仕入日; hdData.入力区分 = shdData.入力区分; hdData.仕入区分 = shdData.仕入区分; hdData.仕入先コード = shdData.仕入先コード; hdData.仕入先枝番 = shdData.仕入先枝番; hdData.入荷先コード = shdData.入荷先コード; hdData.発注番号 = shdData.発注番号; hdData.備考 = shdData.備考; hdData.元伝票番号 = shdData.元伝票番号; // No-94 Add Start hdData.通常税率対象金額 = shdData.通常税率対象金額; hdData.軽減税率対象金額 = shdData.軽減税率対象金額; hdData.通常税率消費税 = shdData.通常税率消費税; hdData.軽減税率消費税 = shdData.軽減税率消費税; // No-94 Add End // No-95 Add Start hdData.小計 = shdData.小計; hdData.総合計 = shdData.総合計; // No-95 Add End hdData.消費税 = shdData.消費税; hdData.最終更新者 = _loginUserId; hdData.最終更新日時 = com.GetDbDateTime(); hdData.AcceptChanges(); } }
/// <summary> /// 入出庫履歴の登録・更新をおこなう /// </summary> /// <param name="srhd">仕入ヘッダデータ</param> /// <param name="dtlTable">仕入明細データテーブル</param> /// <param name="orghd">変更前仕入ヘッダデータ</param> protected void setS04_HISTORY_Create(T03_SRHD srhd, DataTable dtlTable, DataRow orghd) { foreach (DataRow row in dtlTable.Rows) { // 仕入明細データ取得 T03_SRDTL srdtl = convertDataRowToT03_SRDTL_Entity(row); // 商品未設定レコードは処理しない if (srdtl.品番コード <= 0) { continue; } // 元伝票からの返品対象外商品なので処理しない if (row.RowState == DataRowState.Deleted) { continue; } S04_HISTORY history = new S04_HISTORY(); history.入出庫日 = srhd.仕入日; history.入出庫時刻 = com.GetDbDateTime().TimeOfDay; history.庫コード = T03Service.get倉庫コード(srhd.入荷先コード); history.入出庫区分 = (int)S04Service.getInboundType(row, "数量", srdtl.数量); history.品番コード = srdtl.品番コード; history.賞味期限 = srdtl.賞味期限; history.数量 = Math.Abs(decimal.ToInt32(srdtl.数量)); history.伝票番号 = srhd.伝票番号; Dictionary <string, string> hstDic = new Dictionary <string, string>() { // No.156-2 Mod Start { S04.COLUMNS_NAME_入出庫日, orghd == null? history.入出庫日.ToString("yyyy/MM/dd") : string.Format("{0:yyyy/MM/dd}", orghd["仕入日", DataRowVersion.Original]) }, { S04.COLUMNS_NAME_倉庫コード, orghd == null? history.庫コード.ToString() : orghd["入荷先コード", DataRowVersion.Original] == DBNull.Value? null : T03Service.get倉庫コード(Convert.ToInt32(orghd["入荷先コード", DataRowVersion.Original])).ToString() }, { S04.COLUMNS_NAME_伝票番号, orghd == null? history.伝票番号.ToString() : orghd["伝票番号", DataRowVersion.Original].ToString() }, { S04.COLUMNS_NAME_品番コード, history.品番コード.ToString() } // No.156-2 Mod End }; if (row.RowState == DataRowState.Added) { // 仕入作成の為、履歴作成 S04Service.CreateProductHistory(history); } else if (row.RowState == DataRowState.Deleted) { S04Service.DeleteProductHistory(hstDic); } // No.156-2 Mod Start else { // (DataRowState.Modified、DataRowState.Unchanged) // 仕入更新の為、履歴更新 S04Service.UpdateProductHistory(history, hstDic); } // No.156-2 Mod End } }