// // 這個檔案是 領據 資料表的資料存取類別 檔案二 // 您可以修改這個檔案,加入您自訂的屬性與方法 // using Education; using Education.Services; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.Text; using WebLib; namespace Education { /// /// 領據 資料存取類別 /// public partial class DAC_領據 : WebLib.DAC { #region 自動產生的資料存取方法 /// /// InsertOne 之前會執行此方法 /// 在這裡可以做一些檢查或是自動編號等動作 /// 回傳 false 會打斷 InsertOne 的執行 /// protected virtual bool BeforeInsertOne(領據Item value) { value.列印次數 = 0; value.作廢 = 0; if (string.IsNullOrEmpty(value.表單編號)) { value.表單編號 = Next單號(value.活動日期, _tableName, "表單編號", "YYYYMMDD<9999>", ""); } return true; } /// /// InsertOne 之後會執行此方法 /// protected virtual void AfterInsertOne(領據Item value) { } /// /// InsertOne 發生錯誤時會執行此方法 /// ///錯誤是否已經處理妥當 protected virtual void OnInsertOneError(Exception error, out bool handled) { handled = false; } /// /// UpdateOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 UpdateOne 的執行 /// protected virtual bool BeforeUpdateOne(領據Item value) { return true; } /// /// UpdateOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 UpdateOne 的執行 /// protected virtual bool BeforeUpdateOne(領據Item value, 領據Item original_value) { return true; } /// /// UpdateOne 之後會執行此方法 /// protected virtual void AfterUpdateOne(領據Item value) { } /// /// UpdateOne 之後會執行此方法 /// protected virtual void AfterUpdateOne(領據Item value, 領據Item original_value) { } /// /// UpdateOne 發生錯誤時會執行此方法 /// ///錯誤是否已經處理妥當 protected virtual void OnUpdateOneError(Exception error, out bool handled) { handled = false; } /// /// DeleteOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 DeleteOne 的執行 /// protected virtual bool BeforeDeleteOne(領據Item value) { return true; } /// /// DeleteOne 之後會執行此方法 /// protected virtual void AfterDeleteOne(領據Item value) { } /// /// DeleteOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 DeleteOne 的執行 /// protected virtual bool BeforeDeleteOne(int 編號, int DB_APPNO) { return true; } /// /// DeleteOne 之後會執行此方法 /// protected virtual void AfterDeleteOne(int 編號, int DB_APPNO) { } /// /// DeleteOne 發生錯誤時會執行此方法 /// ///錯誤是否已經處理妥當 protected virtual void OnDeleteOneError(Exception error, out bool handled) { handled = false; } #endregion // 有另外加上去的屬性及方法,請加在這裡 /// /// 計算資料庫中符合重複條件的筆數 /// 重複條件:活動日期 + 領款人姓名 + 計畫代號 + 活動名稱事由 /// public int CountDuplicates(DateTime 活動日期, string 領款人姓名, string 計畫代號, string 活動名稱事由) { DbCommand cmd = NewCommand(); cmd.CommandText = "select count(1) from [領據] where 活動日期 = @活動日期 and 領款人姓名 = @領款人姓名 and 計畫代號 = @計畫代號 and ISNULL(活動名稱事由,'') = @活動名稱事由"; AddParam(cmd, "活動日期", 活動日期); AddParam(cmd, "領款人姓名", 領款人姓名 ?? ""); AddParam(cmd, "計畫代號", 計畫代號 ?? ""); AddParam(cmd, "活動名稱事由", 活動名稱事由 ?? ""); int count; ExecuteScalar(cmd, out count); return count; } /// /// 給查詢畫面用的 SelectPage 方法 /// [DataObjectMethod(DataObjectMethodType.Select)] public 領據List SelectPageWithRelations(bool noInputReturnAll, int startRowIndex, int maximumRows, DateTime? 活動日期_1, DateTime? 活動日期_2, string 身分別, string 講師_非講師編號, string 憑證類別, string 計畫代號, string 計畫名稱, string 活動類別, string 付款方式, string 領款人姓名 = null, string orderBy = "") { 領據List result = new 領據List(); bool noInput = true; IDataList list = result as IDataList; DbCommand cmdSelect = NewCommand(); cmdSelect.CommandText = String.Format("select top {0} * from (", maximumRows) + "select " + _allFields + ", row_number() over (order by " + (orderBy == null || orderBy.Length == 0 ? _orderBy : orderBy) + ") as rowid " + _from + _where; AddWhere(cmdSelect, ref noInput, 活動日期_1, 活動日期_2, 身分別, 講師_非講師編號, 憑證類別, 計畫代號, 計畫名稱, 活動類別, 付款方式, 領款人姓名); cmdSelect.CommandText += ") as TMP1 where rowid > @startRowIndex "; AddParam(cmdSelect, "startRowIndex", startRowIndex); if (!noInputReturnAll && noInput) return result; Select(cmdSelect, ref list); var dao_勞務費 = new DAC_勞務費(conn); var dao_差旅費 = new DAC_差旅費(conn); var dao_BPSN = new DAC_BPSN(conn); var dao講師 = new DAC_講師(conn); var dao講師評價 = new DAC_講師外訓滿意度(conn); var 講師編號Cache = new Dictionary(); var 講師評價Cache = new Dictionary(); result.ForEach(item => { item.DB_CRUSR_NAME = dao_BPSN.Get員工姓名(item.DB_CRUSR); item.DB_TRUSR_NAME = dao_BPSN.Get員工姓名(item.DB_TRUSR); string 講師CacheKey = (item.講師_非講師編號 ?? string.Empty).Trim() + "|" + (item.領款人姓名 ?? string.Empty).Trim(); if (!講師編號Cache.TryGetValue(講師CacheKey, out int? 講師編號)) { if (!string.IsNullOrEmpty(item.講師_非講師編號) && int.TryParse(item.講師_非講師編號.Trim(), out int parsedTeacherNo)) { 講師編號 = parsedTeacherNo; } else if (!string.IsNullOrEmpty(item.領款人姓名)) { var 講師 = dao講師.Select(false, item.領款人姓名.Trim(), null, null) .FirstOrDefault(t => t.姓名 == item.領款人姓名.Trim()); if (講師 != null) 講師編號 = 講師.編號; } 講師編號Cache[講師CacheKey] = 講師編號; } string 講師評價CacheKey = 講師編號.HasValue ? 講師編號.Value + "|" + item.活動日期.Date.Ticks : string.Empty; bool 有講師評價 = 講師編號.HasValue && (講師評價Cache.TryGetValue(講師評價CacheKey, out bool cached有講師評價) ? cached有講師評價 : 講師評價Cache[講師評價CacheKey] = dao講師評價 .Select(false, null, 講師編號, item.活動日期, item.活動日期, null, null, null, null, null) .Any()); item.講師評價 = 有講師評價 ? "有" : "無"; var 勞務費 = dao_勞務費.SelectOne(item.編號).FirstOrDefault(); var 差旅費 = dao_差旅費.SelectOne(item.編號).FirstOrDefault(); if (勞務費 != null) { item.勞務費_編號 = 勞務費.編號; item.勞務費_費用別 = 勞務費.費用別; item.勞務費_單價 = 勞務費.單價; item.勞務費_數量 = 勞務費.數量; item.勞務費_單位 = 勞務費.單位; item.勞務費_扣繳類別 = 勞務費.扣繳類別; item.勞務費_扣繳類別名稱 = 扣繳類別.GetName(勞務費.扣繳類別); item.勞務費_合計金額 = 勞務費.合計金額; item.勞務費_應扣繳稅額 = 勞務費.應扣繳稅額; item.勞務費_服務費 = 勞務費.服務費; item.勞務費_作廢 = 勞務費.作廢; } else { item.勞務費_編號 = string.Empty; item.勞務費_費用別 = string.Empty; item.勞務費_單價 = 0; item.勞務費_數量 = 0; item.勞務費_單位 = string.Empty; item.勞務費_扣繳類別 = string.Empty; item.勞務費_扣繳類別名稱 = string.Empty; item.勞務費_合計金額 = 0; item.勞務費_應扣繳稅額 = 0; item.勞務費_服務費 = 0; item.勞務費_作廢 = 0; } if (差旅費 != null) { item.差旅費_編號 = 差旅費.編號; item.差旅費_票價資訊 = 差旅費.票價資訊; item.差旅費_費用別 = 差旅費.費用別; item.差旅費_起點 = 差旅費.起點; item.差旅費_訖點 = 差旅費.訖點; item.差旅費_捷運公車 = 差旅費.捷運公車; item.差旅費_火車 = 差旅費.火車; item.差旅費_計程車 = 差旅費.計程車; item.差旅費_高鐵飛機 = 差旅費.高鐵飛機; item.差旅費_自行開車 = 差旅費.自行開車; item.差旅費_過路費停車費 = 差旅費.過路費停車費; item.差旅費_住宿費 = 差旅費.住宿費; item.差旅費_合計 = 差旅費.合計; item.差旅費_作廢 = 差旅費.作廢; } else { item.差旅費_編號 = string.Empty; item.差旅費_票價資訊 = string.Empty; item.差旅費_費用別 = string.Empty; item.差旅費_起點 = string.Empty; item.差旅費_訖點 = string.Empty; item.差旅費_捷運公車 = 0; item.差旅費_火車 = 0; item.差旅費_計程車 = 0; item.差旅費_高鐵飛機 = 0; item.差旅費_自行開車 = 0; item.差旅費_過路費停車費 = 0; item.差旅費_住宿費 = 0; item.差旅費_合計 = 0; item.差旅費_作廢 = 0; } }); return result; } public 個人費用彙整表List SelectSummary(bool noInputReturnAll, int startRowIndex, int maximumRows, DateTime? 起日, DateTime? 迄日, string 身分別, string 付款方式) { 個人費用彙整表List tempData = new 個人費用彙整表List(); bool noInput = true; IDataList list = tempData as IDataList; DbCommand cmdSelect = NewCommand(); // 取出明細資料 cmdSelect.CommandText = String.Format("select top {0} * from (", maximumRows) + @"select A.講師_非講師編號, A.領款人姓名, A.活動日期, A.身分證字號, 1 堂數 , ISNULL(B.合計金額, 0) - ISNULL(B.應扣繳稅額, 0) - ISNULL(B.服務費, 0) + ISNULL(C.合計, 0) 付款金額 , row_number() over (order by A.領款人姓名) as rowid from 領據 A left join 勞務費 B on A.編號 = B.領據編號 and B.編號 is not NULL and B.編號 <> '' left join 差旅費 C on A.編號 = C.領據編號 and C.編號 is not NULL and C.編號 <> '' where 1=1 "; AddWhere(cmdSelect, ref noInput, 起日, 迄日, 身分別, null, null, null, null, null, 付款方式); cmdSelect.CommandText += ") as TMP1 where 付款金額 > 0 and rowid > @startRowIndex "; AddParam(cmdSelect, "startRowIndex", startRowIndex); if (!noInputReturnAll && noInput) return tempData; Select(cmdSelect, ref list); var dao付款設定 = new DAC_付款設定(conn); foreach (var r in tempData) { // 加入付款設定資料 var paymentSetting = dao付款設定.SelectRecentlyActivated(r.講師_非講師編號, r.活動日期); if (paymentSetting != null) { r.扣繳類別 = 扣繳類別.GetActuralValue(paymentSetting.扣繳類別); r.扣繳類別名稱 = 扣繳類別.GetName(paymentSetting.扣繳類別); r.帳戶名 = paymentSetting.匯款戶名; r.匯款帳號 = paymentSetting.匯款帳號; r.銀行分行代碼 = paymentSetting.銀行分行代碼; r.銀行分行 = paymentSetting.銀行分行; } } // 彙整 // 這裡要用領款人姓名 + 身分證字號 + 扣繳類別 + 帳戶名 + 匯款帳號 + 銀行分行代碼 來彙總 // 加總堂數 和 付款金額 個人費用彙整表List result = new 個人費用彙整表List(); // 按照 (領款人姓名、身分證字號、扣繳類別、帳戶名、匯款帳號、銀行分行代碼) 分組彙總 var groupedData = tempData.GroupBy(x => new { x.領款人姓名, x.身分證字號, x.扣繳類別, x.扣繳類別名稱, x.帳戶名, x.匯款帳號, x.銀行分行代碼, x.銀行分行 }); foreach (var group in groupedData) { var summaryItem = new 個人費用彙整表Item { 領款人姓名 = group.Key.領款人姓名, 身分證字號 = group.Key.身分證字號, 扣繳類別 = group.Key.扣繳類別, 扣繳類別名稱 = group.Key.扣繳類別名稱, 帳戶名 = group.Key.帳戶名, 匯款帳號 = group.Key.匯款帳號, 銀行分行代碼 = group.Key.銀行分行代碼, 銀行分行 = group.Key.銀行分行, // 堂數是數量,加總所有同組的數量 堂數 = group.Sum(x => x.堂數), // 付款金額直接加總 付款金額 = group.Sum(x => x.付款金額) }; result.Add(summaryItem); } return result; } public List<扣繳匯總Item> SelectDetail(bool noInputReturnAll, int startRowIndex, int maximumRows, DateTime? 起日, DateTime? 迄日, string 身分別, string 憑證類別) { DAC_講師 dao講師 = new DAC_講師(this.conn); DAC_非講師 dao非講師 = new DAC_非講師(this.conn); 扣繳明細List tempData = new 扣繳明細List(); bool noInput = true; IDataList list = tempData as IDataList; DbCommand cmdSelect = NewCommand(); // 取出明細資料 cmdSelect.CommandText = String.Format("select top {0} * from (", maximumRows) + @"select A.編號, A.講師_非講師編號, A.領款人姓名, A.身分證字號, A.身分別, A.郵件已發送 , ISNULL(B.合計金額, 0) - ISNULL(B.應扣繳稅額, 0) - ISNULL(B.服務費, 0) 講師勞務費 , ISNULL(B.應扣繳稅額, 0) 應扣繳稅額 , ISNULL(B.服務費, 0) 服務費 , B.扣繳類別 , A.計畫代號 , CONVERT(varchar(10), A.活動日期, 121) 活動日期 , A.活動名稱事由 , A.憑證類別 , B.編號 領據編號 , B.費用別 , B.單價 , B.數量 , B.單位 , row_number() over (order by A.領款人姓名) as rowid from 領據 A join 勞務費 B on A.編號 = B.領據編號 and B.編號 is not NULL and B.編號 <> '' where 1=1"; List wheres = new List(); if (起日 != null && 迄日 != null) { noInput = false; wheres.Add(WhereItem.GreatThanOrEqual(fieldName: "A.活動日期", value: 起日)); wheres.Add(WhereItem.LessThan(fieldName: "A.活動日期", value: 迄日.Value.AddDays(1))); } else if (起日 != null && 迄日 == null) { noInput = false; wheres.Add(WhereItem.GreatThanOrEqual(fieldName: "A.活動日期", value: 起日)); } else if (起日 == null && 迄日 != null) { noInput = false; wheres.Add(WhereItem.LessThan(fieldName: "A.活動日期", value: 迄日.Value.AddDays(1))); } if (身分別 != null && 身分別.Length > 0) { noInput = false; wheres.Add(WhereItem.Equal(fieldName: "A.身分別", value: 身分別)); } if (憑證類別 != null && 憑證類別.Length > 0) { noInput = false; wheres.Add(WhereItem.Equal(fieldName: "A.憑證類別", value: 憑證類別)); } AddWhere(cmdSelect, wheres); cmdSelect.CommandText += ") as TMP1 where rowid > @startRowIndex "; AddParam(cmdSelect, "startRowIndex", startRowIndex); if (!noInputReturnAll && noInput) return new List<扣繳匯總Item>(); Select(cmdSelect, ref list); // 加入付款設定資料 var dao付款設定 = new DAC_付款設定(conn); foreach (var r in tempData) { r.扣繳類別名稱 = 扣繳類別.GetName(r.扣繳類別); r.扣繳類別 = 扣繳類別.GetActuralValue(r.扣繳類別); } // 分組彙整 List<扣繳匯總Item> result = new List<扣繳匯總Item>(); var groupedData = tempData.GroupBy(x => new { x.講師_非講師編號, x.領款人姓名, x.身分證字號, x.身分別, x.扣繳類別, x.扣繳類別名稱, }); foreach (var group in groupedData) { var 戶籍地址 = string.Empty; var 電子郵件 = string.Empty; if (group.Key.身分別 == "講師") { var t = dao講師.SelectOne(DAC.GetInt32(group.Key.講師_非講師編號)).FirstOrDefault(); if (t != null) { 戶籍地址 = string.Format("{0}{1}{2}", t.戶籍地址_縣市, t.戶籍地址_鄉鎮市區, t.戶籍地址_街道地址); 電子郵件 = t.電子郵件; } } else { var t = dao非講師.SelectOne(group.Key.講師_非講師編號).FirstOrDefault(); if (t != null) { 戶籍地址 = string.Format("{0}{1}{2}", t.戶籍地址_縣市, t.戶籍地址_鄉鎮市區, t.戶籍地址_街道地址); 電子郵件 = t.電子郵件; } } var summaryItem = new 扣繳匯總Item { 講師_非講師編號 = group.Key.講師_非講師編號, 領款人姓名 = group.Key.領款人姓名, 身分證字號 = group.Key.身分證字號, 戶籍地址 = 戶籍地址, 電子郵件 = 電子郵件, 扣繳類別 = group.Key.扣繳類別, 扣繳類別名稱 = group.Key.扣繳類別名稱, 講師勞務費合計 = group.Sum(x => x.講師勞務費), 應扣繳稅額合計 = group.Sum(x => x.應扣繳稅額), 服務費合計 = group.Sum(x => x.服務費) }; var i = 1; foreach (var detail in group.ToList()) { summaryItem.明細.Add(detail); } result.Add(summaryItem); } return result; } } /// ///領據 資料集合類別 /// public partial class 領據List : List<領據Item> { // 有另外加上去的屬性及方法,請加在這裡 } /// ///個人費用彙整表 資料集合類別 /// public partial class 個人費用彙整表List : List<個人費用彙整表Item>, IDataList { public void Fill(DbDataReader reader) { DAC.FillData<個人費用彙整表Item>(reader, this); } } /// ///扣繳明細 資料集合類別 /// public partial class 扣繳明細List : List<扣繳明細Item>, IDataList { public void Fill(DbDataReader reader) { DAC.FillData<扣繳明細Item>(reader, this); } } /// ///個人費用彙整表 資料紀錄類別 /// [Serializable] public partial class 個人費用彙整表Item : DataItemBase { /// 講師/非講師編號 (用於內部查詢) public string 講師_非講師編號 { get; set; } /// 領款人姓名 public string 領款人姓名 { get; set; } /// 活動日期 (用於查詢付款設定) public DateTime? 活動日期 { get; set; } /// 身分證字號 public string 身分證字號 { get; set; } /// 堂數 (數量) [DataObjectField(false)] public int 堂數 { get; set; } /// 付款金額 [DataObjectField(false)] public int 付款金額 { get; set; } /// 扣繳類別 [DataObjectField(false)] public string 扣繳類別 { get; set; } /// 扣繳類別名稱 (顯示用) [DataObjectField(false)] public string 扣繳類別名稱 { get; set; } /// 帳戶名 [DataObjectField(false)] public string 帳戶名 { get; set; } /// 匯款帳號 [DataObjectField(false)] public string 匯款帳號 { get; set; } /// 銀行分行代碼 [DataObjectField(false)] public string 銀行分行代碼 { get; set; } /// 銀行分行 [DataObjectField(false)] public string 銀行分行 { get; set; } } /// ///領據 資料紀錄類別 /// public partial class 領據Item { // 有另外加上去的屬性及方法,請加在這裡 public bool 已關帳 { get { return string.Compare(PublicVariable.領據關帳年月, string.Format("{0:yyyy-MM}", 活動日期)) >= 0; } } public string DB_CRUSR_NAME { get; set; } public string DB_TRUSR_NAME { get; set; } public string 講師評價 { get; set; } public string 勞務費_編號 { get; set; } public string 勞務費_費用別 { get; set; } public int? 勞務費_單價 { get; set; } public decimal? 勞務費_數量 { get; set; } public string 勞務費_單位 { get; set; } public string 勞務費_扣繳類別 { get; set; } public string 勞務費_扣繳類別名稱 { get; set; } public int? 勞務費_合計金額 { get; set; } public int? 勞務費_應扣繳稅額 { get; set; } public int? 勞務費_服務費 { get; set; } public int? 勞務費_作廢 { get; set; } public string 差旅費_編號 { get; set; } public string 差旅費_票價資訊 { get; set; } public string 差旅費_費用別 { get; set; } public string 差旅費_起點 { get; set; } public string 差旅費_訖點 { get; set; } public int? 差旅費_捷運公車 { get; set; } public int? 差旅費_火車 { get; set; } public int? 差旅費_計程車 { get; set; } public int? 差旅費_高鐵飛機 { get; set; } public int? 差旅費_自行開車 { get; set; } public int? 差旅費_過路費停車費 { get; set; } public int? 差旅費_住宿費 { get; set; } public int? 差旅費_合計 { get; set; } public int? 差旅費_作廢 { get; set; } } /// ///扣繳明細 資料紀錄類別 /// [Serializable] public partial class 扣繳匯總Item : DataItemBase { public string 講師_非講師編號 { get; set; } public string 領款人姓名 { get; set; } public string 身分證字號 { get; set; } public string 戶籍地址 { get; set; } public string 電子郵件 { get; set; } public string 扣繳類別 { get; set; } public string 扣繳類別名稱 { get; set; } public int 應扣繳稅額合計 { get; set; } public int 服務費合計 { get; set; } public int 講師勞務費合計 { get; set; } public List<扣繳明細Item> 明細 { get; set; } public 扣繳匯總Item() { 明細 = new List<扣繳明細Item>(); } } public partial class 扣繳匯總郵件Item : DataItemBase { public string 收件人姓名 { get; set; } public string 收件人郵箱 { get; set; } public string 主旨 { get; set; } public string 內文 { get; set; } public List<扣繳明細Item> 明細 { get; set; } public int 講師勞務費合計 { get; set; } public int 應扣繳稅額合計 { get; set; } public int 服務費合計 { get; set; } public 扣繳匯總郵件Item() { 明細 = new List<扣繳明細Item>(); } } public class 扣繳明細Item : DataItemBase { public int 編號 { get; set; } public string 講師_非講師編號 { get; set; } public string 領款人姓名 { get; set; } public string 身分證字號 { get; set; } public string 身分別 { get; set; } public string 戶籍地址 { get; set; } public string 電子郵件 { get; set; } public string 活動日期 { get; set; } public string 計畫代號 { get; set; } public string 活動名稱事由 { get; set; } public string 扣繳類別 { get; set; } public string 扣繳類別名稱 { get; set; } public string 憑證類別 { get; set; } public string 領據編號 { get; set; } public string 費用別 { get; set; } public int 單價 { get; set; } public decimal 數量 { get; set; } public string 單位 { get; set; } public int 講師勞務費 { get; set; } public int 應扣繳稅額 { get; set; } public int 服務費 { get; set; } public string 郵件已發送 { get; set; } } }