using HotelPms.Data.Common.Util;
using HotelPms.Share.Data;
using HotelPms.Share.IO;
using System.Data.Common;
using System.Reflection;
using System.Text;
namespace HotelPms.Data.UseInfo
{
///
/// サーバー側の処理
/// ①データR/W
/// ②クラウド中の計算
///
public partial class Use
{
private Dictionary personDict = new();
private Dictionary detailDict = new();
private Dictionary useRoomDict = new(); //DetailID,UseDate
///
/// 利用情報の更新SQL生成
///
///
public string ToSql()
{
bool isNew = UpdateID == 0;
UseSql useSql = new UseSql(isNew, ID);
foreach (UsePerson person in PersonlList)
{
foreach(UsePersonFree personFree in person.FreeList) { useSql.UsePersonFree.AppendLine(personFree.AddSql()); }
foreach (UsePersonTel personTel in person.TelList) { useSql.UsePersonTel.AppendLine(personTel.AddSql()); }
useSql.UsePerson.AppendLine(person.AddSql());
}
foreach (UseMemo useMemo in MemoList) { useSql.UseMemo.AppendLine(useMemo.AddSql()); }
foreach (UseFree useFree in FreeList) { useSql.UseFree.AppendLine(useFree.AddSql()); }
// 利用明細
foreach (UseDetail useDetail in DetailList)
{
foreach (UseMemo useMemo in useDetail.MemoList) { useSql.UseMemo.AppendLine(useMemo.AddSql()); }
foreach (UseFree useFree in useDetail.FreeList) { useSql.UseFree.AppendLine(useFree.AddSql()); }
foreach (Rental rental in useDetail.RentalList) { useSql.Rental.AppendLine(rental.AddSql()); }
foreach (UseRoom useRoom in useDetail.UseRoomList)
{
foreach (UseFree useFree in useRoom.FreeList) { useSql.UseFree.AppendLine(useFree.AddSql()); }
foreach (UseAllo useAllo in useRoom.UseAlloList) { useSql.UseAllo.AppendLine(useAllo.AddSql()); }
foreach (Arrange arrange in useRoom.ArrangeList) { useSql.Arrange.AppendLine(arrange.AddSql()); }
foreach (Sale sale in useRoom.SaleList) { useSql.Sale.AppendLine(sale.AddSql()); }
foreach (Pay pay in useRoom.PayList) { useSql.Pay.AppendLine(pay.AddSql()); }
useSql.UseRoom.AppendLine(useRoom.AddSql());
}
useSql.UseDetail.AppendLine(useDetail.AddSql());
}
//更新直前にカウントする
UpdateID++;
useSql.Use.AppendLine(isNew ? AddSql() : UpdateSql());
StringBuilder sql = new StringBuilder();
sql.Append(useSql.ToString());
sql.AppendLine($"EXECUTE SaveUseAfter {ID}");
return sql.ToString();
}
///
/// 利用者情報
///
///
///
public void SetUsePerson(DbDataReader reader)
{
while (reader.Read())
{
UsePerson item = new();
item.ConvertReader(reader);
PersonlList.Add(item);
personDict.Add(item.PersonID, item);
}
reader.NextResult();
}
///
/// 個人自由集計
///
///
public void SetUsePersonFree(DbDataReader reader)
{
while (reader.Read())
{
UsePersonFree item = new();
item.ConvertReader(reader);
UsePerson person = personDict[item.PersonID];
person.FreeList.Add(item);
}
reader.NextResult();
}
///
/// 個人電話
///
///
public void SetUsePersonTel(DbDataReader reader)
{
while (reader.Read())
{
UsePersonTel item = new();
item.ConvertReader(reader);
UsePerson person = personDict[item.PersonID];
person.TelList.Add(item);
}
reader.NextResult();
}
///
/// 利用明細
///
///
///
public void SetUseDetail(DbDataReader reader)
{
while (reader.Read())
{
UseDetail item = new();
item.ConvertReader(reader);
DetailList.Add(item);
detailDict.Add(item.DetailID, item);
}
reader.NextResult();
}
///
/// 利用部屋
///
///
public void SetUseRoom(DbDataReader reader)
{
while (reader.Read())
{
UseRoom item = new();
item.ConvertReader(reader);
UseDetail detail = detailDict[item.DetailID];
detail.UseRoomList.Add(item);
item.Parent = detail;
useRoomDict.Add($"{item.DetailID},{item.UseDate.Value}", item);
}
reader.NextResult();
}
///
/// 部屋割り
///
///
public void SetUseAllo(DbDataReader reader)
{
while (reader.Read())
{
UseAllo item = new();
item.ConvertReader(reader);
UseRoom useRoom = useRoomDict[$"{item.DetailID},{item.UseDate.Value}"];
useRoom.UseAlloList.Add(item);
item.Parent = useRoom;
item.Detail = detailDict[item.DetailID];
item.Person = personDict[item.PersonID];
}
reader.NextResult();
}
///
/// 自由集計
///
///
///
public void SetUseFree(DbDataReader reader)
{
while (reader.Read())
{
UseFree item = new();
item.ConvertReader(reader);
if (item.DetailID == 0)
{
//利用情報の自由集計
FreeList.Add(item);
item.Parent = this;
}
else if (item.UseDate.CompareTo(customTypes.Date.MinUseDate) <= 0)
{
//利用明細の自由集計
UseDetail detail = detailDict[item.DetailID];
detail.FreeList.Add(item);
item.Parent = detail;
}
else
{
//利用部屋の自由集計
UseRoom useRoom = useRoomDict[$"{item.DetailID},{item.UseDate.Value}"];
useRoom.FreeList.Add(item);
item.Parent = useRoom;
}
}
reader.NextResult();
}
///
/// メモ
///
///
///
public void SetUseMemo(DbDataReader reader)
{
while (reader.Read())
{
UseMemo item = new();
item.ConvertReader(reader);
if (item.DetailID == 0)
{
//利用情報
MemoList.Add(item);
item.Parent = this;
}
else
{
//利用明細
UseDetail detail = detailDict[item.DetailID];
detail.MemoList.Add(item);
item.Parent = detail;
}
}
reader.NextResult();
}
///
/// 売上
///
///
public void SetSale(DbDataReader reader)
{
while (reader.Read())
{
Sale item = new();
item.ConvertReader(reader);
UseRoom useRoom = useRoomDict[$"{item.DetailID},{item.UseDate.Value}"];
useRoom.SaleList.Add(item);
item.Parent = useRoom;
}
reader.NextResult();
}
///
/// 入金
///
///
public void SetPay(DbDataReader reader)
{
while (reader.Read())
{
Pay item = new();
item.ConvertReader(reader);
UseRoom useRoom = useRoomDict[$"{item.DetailID},{item.UseDate.Value}"];
useRoom.PayList.Add(item);
item.Parent = useRoom;
}
reader.NextResult();
}
///
/// 手配情報
///
///
public void SetArrange(DbDataReader reader)
{
while (reader.Read())
{
Arrange item = new();
item.ConvertReader(reader);
UseRoom useRoom = useRoomDict[$"{item.DetailID},{item.UseDate.Value}"];
useRoom.ArrangeList.Add(item);
item.Parent = useRoom;
}
reader.NextResult();
}
///
/// 備品情報
///
///
public void SetRental(DbDataReader reader)
{
while (reader.Read())
{
Rental item = new();
item.ConvertReader(reader);
UseDetail detail = detailDict[item.DetailID];
detail.RentalList.Add(item);
item.Parent = detail;
}
reader.NextResult();
}
///
/// バッファークリア
///
public void ClearDict()
{
personDict.Clear();
detailDict.Clear();
useRoomDict.Clear();
}
///
/// 利用情報取得
/// ※サーバー中のバッファーより、マスタ名も取得する
///
///
///
public static Use? Get(int id, DataAccess access)
{
try
{
string sql = $"EXECUTE GetUse {id}";
OperationLog.Instance.WriteLog($"データ読込:{sql}");
Use item = access.GetDataReader