//
// 這個檔案是 領據 資料表的資料存取類別 檔案二
// 您可以修改這個檔案,加入您自訂的屬性與方法
//
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);
result.ForEach(item =>
{
item.DB_CRUSR_NAME = dao_BPSN.Get員工姓名(item.DB_CRUSR);
item.DB_TRUSR_NAME = dao_BPSN.Get員工姓名(item.DB_TRUSR);
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 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; }
}
}